=======\r
\r
\r
-Version 5.4.0\r
-=============\r
-\r
-Change\r
-------\r
-The use of WinRT MIDI functions has been disabled by default for any version\r
-of Windows 10 before 1809 (October 2018 Update).\r
-\r
-Possible Issues\r
----------------\r
-If you were previously using WinRT MIDI functions on older versions of Windows\r
-then the new behaviour is to revert to the old Win32 MIDI API.\r
-\r
-Workaround\r
-----------\r
-Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the\r
-previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on\r
-older versions of Windows.\r
-\r
-Rationale\r
----------\r
-Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental,\r
-due to longstanding issues within the API itself. These issues have been\r
-addressed in the Windows 10 1809 (October 2018 Update) release.\r
-\r
-\r
-Change\r
-------\r
-The VST2 SDK embedded within JUCE has been removed.\r
-\r
-Possible Issues\r
----------------\r
-1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK,\r
- which is no longer part of JUCE.\r
-2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in\r
- JUCE) requires header files from the VST2 SDK, which is no longer part of\r
- JUCE. When a new JUCE plug-in project is created the option\r
- JUCE_VST3_CAN_REPLACE_VST2 will be set to zero.\r
-\r
-Workaround\r
-----------\r
-1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or\r
- older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your\r
- header search paths or use the "VST (Legacy) SDK Folder" fields in the\r
- Projucer.\r
-2. For new plug-in projects where you will be releasing both a VST2 and VST3\r
- version, and you want the VST3 plug-in to replace the VST2 plug-in in\r
- hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2\r
- option.\r
-\r
-Rationale\r
----------\r
-Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following\r
-Steinberg's removal of the VST2 SDK from their public SDKs we are also removing\r
-the VST2 SDK from the JUCE codebase.\r
-\r
-\r
-Change\r
-------\r
-The AudioProcessorValueTreeState::createAndAddParameter function has been\r
-deprecated.\r
-\r
-Possible Issues\r
----------------\r
-Deprecation warnings will be seen when compiling code which uses this function\r
-and eventually builds will fail when it is later removed from the API.\r
-\r
-Workaround\r
-----------\r
-Previous calls to\r
-\r
-createAndAddParameter (paramID, paramName, ...);\r
-\r
-can be directly replaced with\r
-\r
-using Parameter = AudioProcessorValueTreeState::Parameter;\r
-createAndAddParameter (std::make_unique<Parameter> (paramID, paramName, ...));\r
-\r
-but an even better approach is to use the new AudioProcessorValueTreeState\r
-constructor where you can pass both RangedAudioParameters and\r
-AudioProcessorParameterGroups of RangedAudioParameters to the\r
-AudioProcessorValueTreeState and initialise the ValueTree simultaneously.\r
-\r
-Rationale\r
----------\r
-The new createAndAddParameter method is much more flexible and enables any\r
-parameter types derived from RangedAudioParameter to be managed by the\r
-AudioProcessorValueTreeState.\r
-\r
-\r
-Change\r
-------\r
-The Projucer's per-exporter Android SDK/NDK path options have been removed.\r
-\r
-Possible Issues\r
----------------\r
-Projects that previously used these fields may no longer build.\r
-\r
-Workaround\r
-----------\r
-Use the Projucer's global paths settings to point to these directories, either\r
-by opening the "Projucer/File->Global Paths..." menu item or using the\r
-"--set-global-search-path" command-line option.\r
-\r
-Rationale\r
----------\r
-Having multiple places where the paths could be set was confusing and could\r
-cause unexpected mismatches.\r
-\r
-\r
-Change\r
-------\r
-SystemStats::getDeviceDescription() will now return the device code on iOS e.g.\r
-"iPhone7, 2" for an iPhone 6 instead of just "iPhone".\r
-\r
-Possible Issues\r
----------------\r
-Code that previously relied on this method returning either explicitly "iPhone"\r
-or "iPad" may no longer work.\r
-\r
-Workaround\r
-----------\r
-Modify this code to handle the new device code string e.g. by changing:\r
-SystemStats::getDeviceDescription() == "iPhone";\r
-to\r
-SystemStats::getDeviceDescription().contains ("iPhone");.\r
-\r
-Rationale\r
----------\r
-The exact device model can now be deduced from this information instead of just\r
-the device family.\r
-\r
-\r
-Change\r
-------\r
-DragAndDropContainer::performExternalDragDropOfFiles() and\r
-::performExternalDragDropOfText() are now asynchronous on Windows.\r
-\r
-Possible Issues\r
----------------\r
-Code that previously relied on these operations being synchronous and blocking\r
-until completion will no longer work as the methods will return immediately and\r
-run asynchronously.\r
-\r
-Workaround\r
-----------\r
-Use the callback argument that has been added to these methods to register a\r
-lambda that will be called when the operation has been completed.\r
-\r
-Rationale\r
----------\r
-The behaviour of these methods is now consistent across all platforms and the\r
-method no longer blocks the message thread on Windows.\r
-\r
-\r
-Change\r
-------\r
-AudioProcessor::getTailLengthSeconds can now return infinity for\r
-VST/VST3/AU/AUv3.\r
-\r
-Possible Issues\r
----------------\r
-If you are using the result of getTailLengthSeconds to allocate a buffer in\r
-your host, then your host will now likely crash when loading a plug-in with an\r
-infinite tail time.\r
-\r
-Workaround\r
-----------\r
-Rewrite your code to not use the result of getTailLengthSeconds directly to\r
-allocate a buffer.\r
-\r
-Rationale\r
----------\r
-Before this change there was no way for a JUCE plug-in to report an infinite\r
-tail time.\r
-\r
-\r
Version 5.3.2\r
=============\r
\r
\r
Possible Issues\r
---------------\r
-1. Due to the large number of changes that have occurred in the JUCE Git\r
+1. Due to the large number of changes that have occured in the JUCE Git\r
repository, pulling this version may result in a messy folder structure with\r
empty directories that have been removed.\r
2. The JUCE Demo project is no longer in the JUCE repository.\r
Version 5.1.0\r
=============\r
\r
-Change\r
-------\r
-The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed.\r
-\r
-Possible Issues\r
----------------\r
-If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code\r
-then it will likely evaluate to "false" and you could end up unnecessarily\r
-using code paths which avoid lambda functions.\r
-\r
-Workaround\r
-----------\r
-Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code.\r
-\r
-Rationale\r
----------\r
-Lambda functions are now available on all platforms that JUCE supports.\r
-\r
-\r
Change\r
------\r
The option to set the C++ language standard is now located in the project\r
\r
Possible Issues\r
---------------\r
-Projects that had a specific version of the C++ language standard set for\r
+Projects that had a specific verison of the C++ language standard set for\r
exporter build configurations will instead use the default (C++11) when\r
re-saving with the new Projucer.\r
\r
+\r
== Major JUCE features and updates ==\r
\r
This file just lists the more notable headline features. For more detailed info\r
about minor changes and bugfixes, please see the git log!\r
\r
-Version 5.4.1\r
- - Fixed a VST2 compilation error in VS2013\r
- - Projucer: Fixed some live-build compilation errors\r
- - Fixed a bug in the Oversampling class\r
- - MPE: Made MPESynthesiserVoice::noteOnTime public\r
- - Fixed some bugs in the Unity plug-in wrapper\r
- - Fixed some VS2015 compiler errors\r
-\r
-Version 5.4.0\r
- - macOS Mojave and iOS 12 support\r
- - Windows hiDPI support\r
- - Unity native plug-in support\r
- - Microsoft BLE MIDI support\r
- - Plug-in parameter groups\r
- - Support for production-ready Android OBOE\r
- - Video playback support on Android and iOS\r
- - AudioProcessorValueTreeState improvements\r
- - Support for Android Studio 3.2\r
- - Various bug-fixes, improvements and documentation updates\r
-\r
Version 5.3.2\r
- Removed the OSX 10.5 and 10.6 deployment target options from the Projucer and enabled more C++11 features across all platforms\r
- Replaced all usage of ScopedPointer with std::unique_ptr\r
- Improved the performance of 3D rendering when multiple OpenGL contexts are used at the same time\r
- Tweaked the rate at which EdgeTable grows its internal storage, to improve performance rendering large and complex paths\r
\r
+\r
Version 5.1.2\r
- Fixed multiple plugin-resizing bugs\r
- Added support for AUv3 MIDI and screen size negotiation\r
and valueTreeChildOrderChanged() methods to include more info about\r
exactly what changed\r
- Over 400 minor changes, bug-fixes, documentation improvements, etc.\r
+\r
+++ /dev/null
-# The JUCE 5 Library
-
-**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE
-TO THE [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
-AND [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy), WHICH
-ARE BINDING AGREEMENTS BETWEEN YOU AND ROLI, LTD. IF YOU DO NOT AGREE TO THE
-TERMS, DO NOT USE THE JUCE LIBRARY.**
-
-We now have tier-leveled license terms for JUCE 5, with different terms for
-each available license: JUCE Personal (for developers or startup businesses
-with revenue under 50K USD "Revenue Limit"; free), JUCE Indie (for small
-businesses with under 200K Revenue Limit; $35/month), JUCE Pro (no Revenue
-Limit; $65/month), and JUCE Educational (no Revenue Limit; free for bona fide
-educational institutes). All licenses allow you to commercially release
-applications so long as you do not exceed the Revenue Limit and pay applicable
-Fees. Once your business hits the Revenue Limit for your JUCE license, you will
-either have to upgrade your JUCE license or release your Applications under the
-[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html),
-which means, among other things, that your code can be freely copied and
-distributed.
-
-You agree to give notice to the end-users of your Applications that we may
-track the IP addresses associated with their use of the Applications using JUCE
-solely for our internal purposes in providing JUCE, unless you are a paying
-JUCE customer and opt-out of such tracking. You agree to fully comply with all
-laws, including relating to the collection of information from children and the
-[Children’s Online Privacy Protection Act
-(COPPA)](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule).
-
-JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
-EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE, ARE DISCLAIMED.
-
-The juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core and
-juce_events modules are permissively licensed under the terms of the [ISC
-license](http://www.isc.org/downloads/software-support-policy/isc-license).
-
-For more information, visit the website:
-[www.juce.com](https://www.juce.com)
-
-FULL JUCE TERMS:
-- [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
-- [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy)
\ No newline at end of file
-
-
-JUCE is an open-source cross-platform C++ application framework used for rapidly
-developing high quality desktop and mobile applications, including VST, AU (and AUv3),
-RTAS and AAX audio plug-ins. JUCE can be easily integrated with existing projects or can
-be used as a project generation tool via the [Projucer](https://juce.com/discover/projucer),
-which supports exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio,
-Code::Blocks, CLion and Linux Makefiles as well as containing a source code editor and
-live-coding engine which can be used for rapid prototyping.
-
-## Getting Started
-The JUCE repository contains a [master](https://github.com/weareroli/JUCE/tree/master)
-and [develop](https://github.com/weareroli/JUCE/tree/develop) branch. The develop branch
-contains the latest bugfixes and features and is periodically merged into the master
-branch in stable [tagged releases](https://github.com/WeAreROLI/JUCE/releases)
-(the latest release containing pre-built binaries can be also downloaded from the
-[JUCE website](https://shop.juce.com/get-juce)).
-
-The repository doesn't contain a pre-built Projucer so you will need to build it
-for your platform - Xcode, Visual Studio and Linux Makefile projects are located in
-[extras/Projucer/Builds](/extras/Projucer/Builds)
-(the minumum system requirements are listed in the __System Requirements__ section below).
-The Projucer can then be used to create new JUCE projects, view tutorials and run examples.
-It is also possible to include the JUCE modules source code in an existing project directly,
-or build them into a static or dynamic library which can be linked into a project.
-
-For further help getting started, please refer to the JUCE
-[documentation](https://juce.com/learn/documentation) and
-[tutorials](https://juce.com/learn/tutorials).
-
-## System Requirements
-#### Building JUCE Projects
-- __macOS__: macOS 10.11 and Xcode 7.3.1
-- __Windows__: Windows 8.1 and Visual Studio 2013 64-bit
-- __Linux__: GCC 5.0
-
-#### Minimum Deployment Targets
-- __macOS__: macOS 10.7
-- __Windows__: Windows Vista
-- __Linux__: Mainstream Linux distributions
-
-## Contributing
-For bug reports and features requests, please visit the [JUCE Forum](https://forum.juce.com/) -
-the JUCE developers are active there and will read every post and respond accordingly. When
-submitting a bug report, please ensure that it follows the
-[issue template](/.github/ISSUE_TEMPLATE.txt).
-We don't accept third party GitHub pull requests directly due to copyright restrictions
-but if you would like to contribute any changes please contact us.
-
-## License
-The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core
-and juce_events) are permissively licensed under the terms of the
-[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
-Other modules are covered by a
-[GPL/Commercial license](https://www.gnu.org/licenses/gpl-3.0.en.html).
-
-There are multiple commercial licensing tiers for JUCE 5, with different terms for each:
-- JUCE Personal (developers or startup businesses with revenue under 50K USD) - free
-- JUCE Indie (small businesses with revenue under 200K USD) - $35/month
-- JUCE Pro (no revenue limit) - $65/month
-- JUCE Eductational (no revenue limit) - free for bona fide educational institutes
-
-For full terms see [LICENSE.md](LICENSE.md).
\ No newline at end of file
+# The JUCE 5 Library
+
+**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE
+TO THE [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
+AND [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy), WHICH
+ARE BINDING AGREEMENTS BETWEEN YOU AND ROLI, LTD. IF YOU DO NOT AGREE TO THE
+TERMS, DO NOT USE THE JUCE LIBRARY.**
+
+JUCE is an all-encompassing C++ framework for developing cross-platform
+software. JUCE is used by hundreds of companies to develop powerful,
+cross-platform audio, interactive, embedded or graphic applications.
+
+We now have tier-leveled license terms for JUCE 5, with different terms for
+each available license: JUCE Personal (for developers or startup businesses
+with revenue under 50K USD "Revenue Limit"; free), JUCE Indie (for small
+businesses with under 200K Revenue Limit; $35/month), JUCE Pro (no Revenue
+Limit; $65/month), and JUCE Educational (no Revenue Limit; free for bona fide
+educational institutes). All licenses allow you to commercially release
+applications so long as you do not exceed the Revenue Limit and pay applicable
+Fees. Once your business hits the Revenue Limit for your JUCE license, you will
+either have to upgrade your JUCE license or release your Applications under the
+[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html),
+which means, among other things, that your code can be freely copied and
+distributed.
+
+You agree to give notice to the end-users of your Applications that we may
+track the IP addresses associated with their use of the Applications using JUCE
+solely for our internal purposes in providing JUCE, unless you are a paying
+JUCE customer and opt-out of such tracking. You agree to fully comply with all
+laws, including relating to the collection of information from children and the
+[Children’s Online Privacy Protection Act
+(COPPA)](https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule).
+
+JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, ARE DISCLAIMED.
+
+The juce_audio_basics, juce_audio_devices, juce_blocks_basics, juce_core and
+juce_events modules are permissively licensed under the terms of the [ISC
+license](http://www.isc.org/downloads/software-support-policy/isc-license).
+
+For more information, visit the website:
+[www.juce.com](https://www.juce.com)
+
+FULL JUCE TERMS:
+- [JUCE 5 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-5-licence)
+- [JUCE 5 PRIVACY POLICY](https://www.juce.com/juce-5-privacy-policy)
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.
-ALIASES = "tags{1}=" \
- "topictag{1}=\1" \
+ALIASES = "topictag{1}=\1" \
"box{1}=<dl class=\"section attention\"><dt>\1</dt><dd>" \
"endbox=</dd></dl>" \
"c_void=@s_code{void}" \
public:\r
Chain()\r
{\r
- b2Body* ground = {};\r
+ b2Body* ground = NULL;\r
{\r
b2BodyDef bd;\r
ground = m_world->CreateBody(&bd);\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AudioAppDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AudioLatencyDemo\r
\r
auto inputSamp = 0.0f;\r
\r
for (auto j = numInputChannels; --j >= 0;)\r
- if (inputChannelData[j] != nullptr)\r
+ if (inputChannelData[j] != 0)\r
inputSamp += inputChannelData[j][i];\r
\r
recordingBuffer[recordedSampleNum] = inputSamp;\r
auto outputSamp = (playingSampleNum < testSound.getNumSamples()) ? playBuffer[playingSampleNum] : 0.0f;\r
\r
for (auto j = numOutputChannels; --j >= 0;)\r
- if (outputChannelData[j] != nullptr)\r
+ if (outputChannelData[j] != 0)\r
outputChannelData[j][i] = outputSamp;\r
\r
++playingSampleNum;\r
{\r
// We need to clear the output buffers, in case they're full of junk..\r
for (int i = 0; i < numOutputChannels; ++i)\r
- if (outputChannelData[i] != nullptr)\r
+ if (outputChannelData[i] != 0)\r
zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples);\r
}\r
}\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AudioRecordingDemo\r
\r
{\r
// Create an OutputStream to write to our destination file...\r
file.deleteFile();\r
+ std::unique_ptr<FileOutputStream> fileStream (file.createOutputStream());\r
\r
- if (auto fileStream = std::unique_ptr<FileOutputStream> (file.createOutputStream()))\r
+ if (fileStream.get() != nullptr)\r
{\r
// Now create a WAV writer object that writes to our output stream...\r
WavAudioFormat wavFormat;\r
+ auto* writer = wavFormat.createWriterFor (fileStream.get(), sampleRate, 1, 16, {}, 0);\r
\r
- if (auto writer = wavFormat.createWriterFor (fileStream.get(), sampleRate, 1, 16, {}, 0))\r
+ if (writer != nullptr)\r
{\r
fileStream.release(); // (passes responsibility for deleting the stream to the writer object that is now using it)\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AudioSettingsDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AudioSynthesiserDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MPEDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MidiDemo\r
\r
using Ptr = ReferenceCountedObjectPtr<MidiDeviceListEntry>;\r
};\r
\r
+//==============================================================================\r
+struct MidiCallbackMessage : public Message\r
+{\r
+ MidiCallbackMessage (const MidiMessage& msg) : message (msg) {}\r
+ MidiMessage message;\r
+};\r
\r
//==============================================================================\r
class MidiDemo : public Component,\r
private Timer,\r
private MidiKeyboardStateListener,\r
private MidiInputCallback,\r
- private AsyncUpdater\r
+ private MessageListener\r
{\r
public:\r
//==============================================================================\r
sendToOutputs (m);\r
}\r
\r
+ void handleMessage (const Message& msg) override\r
+ {\r
+ // This is called on the message loop\r
+\r
+ auto& mm = dynamic_cast<const MidiCallbackMessage&> (msg).message;\r
+ String midiString;\r
+ midiString << (mm.isNoteOn() ? String ("Note on: ") : String ("Note off: "));\r
+ midiString << (MidiMessage::getMidiNoteName (mm.getNoteNumber(), true, true, true));\r
+ midiString << (String (" vel = "));\r
+ midiString << static_cast<int> (mm.getVelocity());\r
+ midiString << "\n";\r
+\r
+ midiMonitor.insertTextAtCaret (midiString);\r
+ }\r
+\r
void paint (Graphics&) override {}\r
\r
void resized() override\r
\r
private:\r
//==============================================================================\r
- struct MidiDeviceListBox : public ListBox,\r
- private ListBoxModel\r
+ class MidiDeviceListBox : public ListBox,\r
+ private ListBoxModel\r
{\r
+ public:\r
+ //==============================================================================\r
MidiDeviceListBox (const String& name,\r
MidiDemo& contentComponent,\r
bool isInputDeviceList)\r
: parent.getNumMidiOutputs();\r
}\r
\r
+ //==============================================================================\r
void paintListBoxItem (int rowNumber, Graphics& g,\r
int width, int height, bool rowIsSelected) override\r
{\r
void handleIncomingMidiMessage (MidiInput* /*source*/, const MidiMessage& message) override\r
{\r
// This is called on the MIDI thread\r
- const ScopedLock sl (midiMonitorLock);\r
- incomingMessages.add (message);\r
- triggerAsyncUpdate();\r
- }\r
-\r
- void handleAsyncUpdate() override\r
- {\r
- // This is called on the message loop\r
- Array<MidiMessage> messages;\r
-\r
- {\r
- const ScopedLock sl (midiMonitorLock);\r
- messages.swapWith (incomingMessages);\r
- }\r
-\r
- String messageText;\r
-\r
- for (auto& m : messages)\r
- messageText << m.getDescription() << "\n";\r
\r
- midiMonitor.insertTextAtCaret (messageText);\r
+ if (message.isNoteOnOrOff())\r
+ postMessage (new MidiCallbackMessage (message));\r
}\r
\r
- void sendToOutputs (const MidiMessage& msg)\r
+ void sendToOutputs(const MidiMessage& msg)\r
{\r
for (auto midiOutput : midiOutputs)\r
if (midiOutput->outDevice.get() != nullptr)\r
TextEditor midiMonitor { "MIDI Monitor" };\r
TextButton pairButton { "MIDI Bluetooth devices..." };\r
\r
- std::unique_ptr<MidiDeviceListBox> midiInputSelector, midiOutputSelector;\r
- ReferenceCountedArray<MidiDeviceListEntry> midiInputs, midiOutputs;\r
+ std::unique_ptr<MidiDeviceListBox> midiInputSelector;\r
+ std::unique_ptr<MidiDeviceListBox> midiOutputSelector;\r
\r
- CriticalSection midiMonitorLock;\r
- Array<MidiMessage> incomingMessages;\r
+ ReferenceCountedArray<MidiDeviceListEntry> midiInputs;\r
+ ReferenceCountedArray<MidiDeviceListEntry> midiOutputs;\r
\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiDemo)\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: PluckedStringsDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: SimpleFFTDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: BlocksDrawingDemo\r
\r
#endif\r
\r
setSize (600, 600);\r
-\r
- topologyChanged();\r
}\r
\r
~BlocksDrawingDemo()\r
detachActiveBlock();\r
\r
lightpadComponent.removeListener (this);\r
- topologySource.removeListener (this);\r
}\r
\r
void resized() override\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: BlocksMonitorDemo\r
\r
#endif\r
\r
setSize (600, 600);\r
-\r
- topologyChanged();\r
- }\r
-\r
- ~BlocksMonitorDemo()\r
- {\r
- topologySource.removeListener (this);\r
}\r
\r
void paint (Graphics&) override {}\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: BlocksSynthDemo\r
\r
}\r
\r
private:\r
- #ifndef JUCE_DEMO_RUNNER\r
AudioDeviceManager audioDeviceManager;\r
- #else\r
- AudioDeviceManager& audioDeviceManager { getSharedAudioDeviceManager (0, 2) };\r
- #endif\r
Synthesiser synthesiser;\r
\r
//==============================================================================\r
#endif\r
\r
setSize (600, 400);\r
-\r
- topologyChanged();\r
}\r
\r
~BlocksSynthDemo()\r
{\r
if (activeBlock != nullptr)\r
detachActiveBlock();\r
-\r
- topologySource.removeListener (this);\r
}\r
\r
void paint (Graphics& g) override\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: ConvolutionDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: FIRFilterDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: GainDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: IIRFilterDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OscillatorDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OverdriveDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: SIMDRegisterDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: StateVariableFilterDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: WaveShaperTanhDemo\r
\r
add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")\r
set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")\r
\r
-add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_demorunner_DemoRunner" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/demorunner/DemoRunner\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_juce_demorunner_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/juce/demorunner/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.4.1" "-DJUCE_APP_VERSION_HEX=0x50401")\r
+add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_demorunner_DemoRunner" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/demorunner/DemoRunner\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_juce_demorunner_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/juce/demorunner/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=5.3.2" "-DJUCE_APP_VERSION_HEX=0x50302")\r
\r
include_directories( AFTER\r
"../../../JuceLibraryCode"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+ "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
- "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
"../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
"../../../../../modules/juce_core/containers/juce_Array.h"\r
"../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
"../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
- "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
- "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
"../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
"../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
"../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
"../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
"../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
- "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_Memory.h"\r
"../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
"../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
"../../../../../modules/juce_core/memory/juce_Singleton.h"\r
"../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
"../../../../../modules/juce_core/misc/juce_Result.cpp"\r
"../../../../../modules/juce_core/misc/juce_Result.h"\r
"../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
"../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
"../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
"../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
- "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
"../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
"../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
"../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
"../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
"../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
"../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
- "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
"../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
"../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"\r
"../../../../../modules/juce_video/capture/juce_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_android_CameraDevice.h"\r
- "../../../../../modules/juce_video/native/juce_android_Video.h"\r
"../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_mac_Video.h"\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
\r
android {\r
compileSdkVersion 23\r
- buildToolsVersion "28.0.0"\r
+ buildToolsVersion "27.0.3"\r
externalNativeBuild {\r
cmake {\r
path "CMakeLists.txt"\r
externalNativeBuild {\r
cmake {\r
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE"\r
- cFlags "-fsigned-char", "-Wall", "-Wno-missing-field-initializers", "-Wshadow-all", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", "-Wsign-compare", "-Wint-conversion", "-Wconditional-uninitialized", "-Woverloaded-virtual", "-Wreorder", "-Wconstant-conversion", "-Wunused-private-field", "-Wbool-conversion", "-Wextra-semi", "-Wno-ignored-qualifiers", "-Wunreachable-code"\r
- cppFlags "-fsigned-char", "-std=c++14", "-Wall", "-Wno-missing-field-initializers", "-Wshadow-all", "-Wstrict-aliasing", "-Wuninitialized", "-Wunused-parameter", "-Wsign-compare", "-Wint-conversion", "-Wconditional-uninitialized", "-Woverloaded-virtual", "-Wreorder", "-Wconstant-conversion", "-Wunused-private-field", "-Wbool-conversion", "-Wextra-semi", "-Wno-ignored-qualifiers", "-Wunreachable-code"\r
+ cFlags "-fsigned-char"\r
+ cppFlags "-fsigned-char", "-std=c++14"\r
}\r
}\r
}\r
productFlavors {\r
debug_ {\r
ndk {\r
- abiFilters "armeabi-v7a", "x86"\r
+ abiFilters "armeabi", "x86"\r
}\r
externalNativeBuild {\r
cmake {\r
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.4.1"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="5.3.2"
package="com.juce.demorunner">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+ <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
public:\r
Chain()\r
{\r
- b2Body* ground = {};\r
+ b2Body* ground = NULL;\r
{\r
b2BodyDef bd;\r
ground = m_world->CreateBody(&bd);\r
import android.content.pm.PackageInfo;\r
import android.content.pm.PackageManager;\r
import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
import android.net.http.SslError;\r
import android.net.Uri;\r
import android.os.Bundle;\r
//==============================================================================\r
public boolean isPermissionDeclaredInManifest (int permissionID)\r
{\r
- return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
- }\r
+ String permissionToCheck = getAndroidPermissionName(permissionID);\r
\r
- public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
- {\r
try\r
{\r
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
public final String getClipboardContent()\r
{\r
ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
- CharSequence content = clipboard.getText();\r
- return content != null ? content.toString() : new String();\r
+ return clipboard.getText().toString();\r
}\r
\r
public final void setClipboardContent (String newText)\r
implements SurfaceHolder.Callback\r
{\r
private long nativeContext = 0;\r
- private boolean forVideo;\r
\r
- NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+ NativeSurfaceView (Context context, long nativeContextPtr)\r
{\r
super (context);\r
nativeContext = nativeContextPtr;\r
- forVideo = createdForVideo;\r
}\r
\r
public Surface getNativeSurface()\r
@Override\r
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
{\r
- if (forVideo)\r
- surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
- else\r
- surfaceChangedNative (nativeContext, holder, format, width, height);\r
+ surfaceChangedNative (nativeContext, holder, format, width, height);\r
}\r
\r
@Override\r
public void surfaceCreated (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceCreatedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceCreatedNative (nativeContext, holder);\r
+ surfaceCreatedNative (nativeContext, holder);\r
}\r
\r
@Override\r
public void surfaceDestroyed (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceDestroyedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceDestroyedNative (nativeContext, holder);\r
+ surfaceDestroyedNative (nativeContext, holder);\r
}\r
\r
@Override\r
protected void dispatchDraw (Canvas canvas)\r
{\r
super.dispatchDraw (canvas);\r
-\r
- if (forVideo)\r
- dispatchDrawNativeVideo (nativeContext, canvas);\r
- else\r
- dispatchDrawNative (nativeContext, canvas);\r
+ dispatchDrawNative (nativeContext, canvas);\r
}\r
\r
//==============================================================================\r
@Override\r
- protected void onAttachedToWindow()\r
+ protected void onAttachedToWindow ()\r
{\r
super.onAttachedToWindow();\r
getHolder().addCallback (this);\r
}\r
\r
@Override\r
- protected void onDetachedFromWindow()\r
+ protected void onDetachedFromWindow ()\r
{\r
super.onDetachedFromWindow();\r
getHolder().removeCallback (this);\r
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
int format, int width, int height);\r
-\r
- private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
- private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
- int format, int width, int height);\r
}\r
\r
- public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
{\r
- return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+ return new NativeSurfaceView (this, nativeSurfacePtr);\r
}\r
\r
//==============================================================================\r
}\r
\r
\r
- //==============================================================================\r
- public class MediaControllerCallback extends MediaController.Callback\r
- {\r
- private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);\r
- private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);\r
- private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
- private native void mediaControllerSessionDestroyed (long host);\r
-\r
- MediaControllerCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
- {\r
- mediaControllerAudioInfoChanged (host, info);\r
- }\r
-\r
- @Override\r
- public void onMetadataChanged (MediaMetadata metadata)\r
- {\r
- mediaControllerMetadataChanged (host, metadata);\r
- }\r
-\r
- @Override\r
- public void onPlaybackStateChanged (PlaybackState state)\r
- {\r
- mediaControllerPlaybackStateChanged (host, state);\r
- }\r
-\r
- @Override\r
- public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
- @Override\r
- public void onSessionDestroyed()\r
- {\r
- mediaControllerSessionDestroyed (host);\r
- }\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class MediaSessionCallback extends MediaSession.Callback\r
- {\r
- private native void mediaSessionPause (long host);\r
- private native void mediaSessionPlay (long host);\r
- private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
- private native void mediaSessionSeekTo (long host, long pos);\r
- private native void mediaSessionStop (long host);\r
-\r
-\r
- MediaSessionCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onPause()\r
- {\r
- mediaSessionPause (host);\r
- }\r
-\r
- @Override\r
- public void onPlay()\r
- {\r
- mediaSessionPlay (host);\r
- }\r
-\r
- @Override\r
- public void onPlayFromMediaId (String mediaId, Bundle extras)\r
- {\r
- mediaSessionPlayFromMediaId (host, mediaId, extras);\r
- }\r
-\r
- @Override\r
- public void onSeekTo (long pos)\r
- {\r
- mediaSessionSeekTo (host, pos);\r
- }\r
-\r
- @Override\r
- public void onStop()\r
- {\r
- mediaSessionStop (host);\r
- }\r
-\r
- @Override\r
- public void onFastForward() {}\r
-\r
- @Override\r
- public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
- {\r
- return true;\r
- }\r
-\r
- @Override\r
- public void onRewind() {}\r
-\r
- @Override\r
- public void onSkipToNext() {}\r
-\r
- @Override\r
- public void onSkipToPrevious() {}\r
-\r
- @Override\r
- public void onSkipToQueueItem (long id) {}\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class SystemVolumeObserver extends ContentObserver\r
- {\r
- private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
- SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
- {\r
- super (null);\r
-\r
- activity = activityToUse;\r
- host = hostToUse;\r
- }\r
-\r
- void setEnabled (boolean shouldBeEnabled)\r
- {\r
- if (shouldBeEnabled)\r
- activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
- else\r
- activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
- }\r
-\r
- @Override\r
- public void onChange (boolean selfChange, Uri uri)\r
- {\r
- if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
- mediaSessionSystemVolumeChanged (host);\r
- }\r
-\r
- private Activity activity;\r
- private long host;\r
- }\r
-\r
-\r
//==============================================================================\r
public static final String getLocaleValue (boolean isRegion)\r
{\r
jcenter()\r
}\r
dependencies {\r
- classpath 'com.android.tools.build:gradle:3.1.3'\r
+ classpath 'com.android.tools.build:gradle:3.1.1'\r
}\r
}\r
\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := DemoRunner\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_DEMO_RUNNER=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := DemoRunner\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o \\r
$(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
@echo Linking "DemoRunner - App"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_video.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
clean:\r
@echo Cleaning DemoRunner\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- 63A2F309E55DAC206E9B97E3 = {
- isa = PBXBuildFile;
- fileRef = CFF2BBEB242CC8B3B904B5F9;
- };
- 48CF0B02E1D06E5DA51E6270 = {
- isa = PBXBuildFile;
- fileRef = A04E4408525F24F7DCBA000E;
- };
- 163B0CF2DD0990A63DF1D5A6 = {
- isa = PBXBuildFile;
- fileRef = 470C3E4553B513FFEF752779;
- };
- 7B4163348896EB1B86B15160 = {
- isa = PBXBuildFile;
- fileRef = DC192EFA899E6CBE6B5CD394;
- };
- 8C0AEA08A71075A6C765AEC9 = {
- isa = PBXBuildFile;
- fileRef = 3B99CF94C44E2EE04635A439;
- };
- 89BC6E2354102D975E08E918 = {
- isa = PBXBuildFile;
- fileRef = 440D507FD8F31DB62B1F95C7;
- };
- 9F15FD7A7CE83CFD98F07D59 = {
- isa = PBXBuildFile;
- fileRef = 02A2ED58B066B4D119F67913;
- };
- 1351A13E78F38741C6075600 = {
- isa = PBXBuildFile;
- fileRef = 4F0A137A4115946A346180E6;
- };
- 46071CE2B98B562B7BF27CB1 = {
- isa = PBXBuildFile;
- fileRef = 1CFE3935A3B810D5D68A2504;
- };
- 6A61CBB4E39BFD392D97528F = {
- isa = PBXBuildFile;
- fileRef = 61AE09C749B007B70A265D9B;
- };
- 9BEA1428416CE06BF72FBAB8 = {
- isa = PBXBuildFile;
- fileRef = 3DC90DA86565B0356B6E5E0B;
- };
- 8584640341100008744861A5 = {
- isa = PBXBuildFile;
- fileRef = 71A91516AFD980FEE694C0E1;
- };
- 028383D0577D0236899D8CA5 = {
- isa = PBXBuildFile;
- fileRef = 40BD06D4AB0D2C73E936A2F1;
- };
- B1981F62F6A91FD2F579A198 = {
- isa = PBXBuildFile;
- fileRef = 23CD1A3F9067C3A0ECE7BB67;
- };
- 89AD16514B1F4133FFEA1DF9 = {
- isa = PBXBuildFile;
- fileRef = 96D99A08027CA35D6A4E5CFD;
- };
- D3D8CDCE42E8BE31C7247E38 = {
- isa = PBXBuildFile;
- fileRef = 0ECB4FCD24794CE516792552;
- };
- 3B3952A9A14320312EF890A5 = {
- isa = PBXBuildFile;
- fileRef = 388A8209DBB1B08594266121;
- };
- 41BAB55E0D992708EF06E2C4 = {
- isa = PBXBuildFile;
- fileRef = 5CD17151385A69F1E07FE85B;
- };
- 1BA301E39E29966719B710A1 = {
- isa = PBXBuildFile;
- fileRef = 9EBAEBBD9093CB005D1692F2;
- };
- E33E8FE2E7F8EC8EB4279F1B = {
- isa = PBXBuildFile;
- fileRef = 7B3243C92248D379A0489AA4;
- };
- 91CD2BCE4CA07E18229EB436 = {
- isa = PBXBuildFile;
- fileRef = 9672FCE6167ADB567A9EB2F8;
- };
- 75DB074DBAE04408A0A917B7 = {
- isa = PBXBuildFile;
- fileRef = E0A3F113BC27B7B4D6F1D693;
- };
- E6F58FC3ACAE774DB4D06420 = {
- isa = PBXBuildFile;
- fileRef = 3AB62BFF806112585B54DDA3;
- };
- 36E115D98311F12AA06710E6 = {
- isa = PBXBuildFile;
- fileRef = 061AECBF1CC7056F4155812D;
- };
- B38728296BB32B7994CE28DF = {
- isa = PBXBuildFile;
- fileRef = 934ACDCB3FD9D223A3481D8F;
- };
- 71DF4F5EB4C8305688416725 = {
- isa = PBXBuildFile;
- fileRef = E5BFC17E682AB426D203B3E6;
- };
- 4FBBB55F4E347757F74F1F41 = {
- isa = PBXBuildFile;
- fileRef = 25E5ED33876A2C752378C859;
- };
- F619F3887CEC064441BB6EE6 = {
- isa = PBXBuildFile;
- fileRef = 260481E972425474BB8155B0;
- };
- C2BB2B6DA237FE0CB64C7EDA = {
- isa = PBXBuildFile;
- fileRef = 5965349393850F41DF76F350;
- };
- F28112945CEBEA4CE8975833 = {
- isa = PBXBuildFile;
- fileRef = 03B0F9318FD583525AB195A9;
- };
- 9EACEA6BE8D0ACC72C12C080 = {
- isa = PBXBuildFile;
- fileRef = 03A63C3CA6F24977F19C316D;
- };
- 26652AB1BB77C8A39434775F = {
- isa = PBXBuildFile;
- fileRef = E061A1C75FA5722167FC4997;
- };
- 2707968B431D83AC7E28E49B = {
- isa = PBXBuildFile;
- fileRef = E67AB94002886AF67437D6AE;
- };
- 712D81867EC698463252FA79 = {
- isa = PBXBuildFile;
- fileRef = EDDA01B246C6128CAF7A2914;
- };
- 49E7BBD46981F0035E4E9021 = {
- isa = PBXBuildFile;
- fileRef = 831A01C745C905F5715CD822;
- };
- 611298FAC1A543BDD10D4C41 = {
- isa = PBXBuildFile;
- fileRef = 4DF215D350FFE5E119CBA7E5;
- };
- D183F8140174ACCDDCD230A2 = {
- isa = PBXBuildFile;
- fileRef = 3BC9753E0CD75A36DC742EE0;
- };
- FF87532E62753EDFA3D29CAD = {
- isa = PBXBuildFile;
- fileRef = 6C5E26B4D28F8450435B8AE1;
- };
- 2F76CA28C8C0EFC7453D0EB8 = {
- isa = PBXBuildFile;
- fileRef = F5F2EA2238973488632FC322;
- };
- 6B5560283DEEBD6DD2D6C984 = {
- isa = PBXBuildFile;
- fileRef = C1E93FAF6C68A40A664422CD;
- };
- 1DBDFEDE359CFC84F8E3DE4C = {
- isa = PBXBuildFile;
- fileRef = FCD0D758C5767944BEC29730;
- };
- CDABEA6258EC70C65C9ACCFE = {
- isa = PBXBuildFile;
- fileRef = 3E4ED41C374261CFFD309743;
- };
- E2F44A968EC2598DAE33A997 = {
- isa = PBXBuildFile;
- fileRef = A1D6D36B96B6B37C31F32829;
- };
- 5CB78489F16E82144914972D = {
- isa = PBXBuildFile;
- fileRef = 979F23EA9E5E76131299E886;
- };
- BC6036F22423CA0AFF0385A7 = {
- isa = PBXBuildFile;
- fileRef = 94B6C88FE30861A47CD28709;
- };
- AEA090DAC5C747C50C7D3FA7 = {
- isa = PBXBuildFile;
- fileRef = CE38E6469D98462A2C22C915;
- };
- CDEB6BA5341494AF51D07C72 = {
- isa = PBXBuildFile;
- fileRef = 0AB68DBAB6B7DAEDDDD5B683;
- };
- 0140787C0118A95E37DE90B4 = {
- isa = PBXBuildFile;
- fileRef = 9144821E003E15E4042B57DB;
- };
- 02A2ED58B066B4D119F67913 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- 03A63C3CA6F24977F19C316D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 03B0F9318FD583525AB195A9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 061AECBF1CC7056F4155812D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoPIPs2.cpp;
- path = ../../Source/Demos/DemoPIPs2.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 0AB68DBAB6B7DAEDDDD5B683 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_product_unlocking.mm";
- path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 0B36C013D9790568B481634C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- 0ECB4FCD24794CE516792552 = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = Audio;
- path = ../../../Audio;
- sourceTree = "<group>";
- };
- 112FFCB73597157E721BCDF2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_analytics";
- path = "../../../../modules/juce_analytics";
- sourceTree = "SOURCE_ROOT";
- };
- 14CBD28B4887DAF89E27491C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- 1CFE3935A3B810D5D68A2504 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMedia.framework;
- path = System/Library/Frameworks/CoreMedia.framework;
- sourceTree = SDKROOT;
- };
- 1FCD2145DE3FCFCF4F55A8AD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = DemoContentComponent.h;
- path = ../../Source/UI/DemoContentComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 23CD1A3F9067C3A0ECE7BB67 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 25E5ED33876A2C752378C859 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = MainComponent.cpp;
- path = ../../Source/UI/MainComponent.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 260481E972425474BB8155B0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 346450C70C964FD9640B6086 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- 388A8209DBB1B08594266121 = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = BLOCKS;
- path = ../../../BLOCKS;
- sourceTree = "<group>";
- };
- 3AB62BFF806112585B54DDA3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoPIPs1.cpp;
- path = ../../Source/Demos/DemoPIPs1.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 3B99CF94C44E2EE04635A439 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVKit.framework;
- path = System/Library/Frameworks/AVKit.framework;
- sourceTree = SDKROOT;
- };
- 3BC9753E0CD75A36DC742EE0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 3DC90DA86565B0356B6E5E0B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- 3E4ED41C374261CFFD309743 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 40BD06D4AB0D2C73E936A2F1 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGL.framework;
- path = System/Library/Frameworks/OpenGL.framework;
- sourceTree = SDKROOT;
- };
- 440D507FD8F31DB62B1F95C7 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- 470C3E4553B513FFEF752779 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 491641F7632BCC81BBA0ED85 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 4DF215D350FFE5E119CBA7E5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_box2d.cpp";
- path = "../../JuceLibraryCode/include_juce_box2d.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4E9AD0EAF3CA57B548622D9A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 4EC2782DE1779A130835B64D = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 4F0A137A4115946A346180E6 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- 4FE6029FF76BCE9698595DC5 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_product_unlocking";
- path = "../../../../modules/juce_product_unlocking";
- sourceTree = "SOURCE_ROOT";
- };
- 5965349393850F41DF76F350 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_analytics.cpp";
- path = "../../JuceLibraryCode/include_juce_analytics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 5A9F2000C66D24E8B01BE60B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 5CD17151385A69F1E07FE85B = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = DSP;
- path = ../../../DSP;
- sourceTree = "<group>";
- };
- 60F2869DC345EAF2314D6C09 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 61AE09C749B007B70A265D9B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 651ECE3C7BA845DDCFEE48F3 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_osc";
- path = "../../../../modules/juce_osc";
- sourceTree = "SOURCE_ROOT";
- };
- 6847A9B2C5E3C2ED56D8D4E7 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 6C198AF93E1F6E682189E2F6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 6C2C1AC86623F457427965EF = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_box2d";
- path = "../../../../modules/juce_box2d";
- sourceTree = "SOURCE_ROOT";
- };
- 6C5E26B4D28F8450435B8AE1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 71A91516AFD980FEE694C0E1 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- 72129757D2A553B90A7157C6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 7A5AAE9EE573FC6105CC4AAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SettingsContent.h;
- path = ../../Source/UI/SettingsContent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 7B3243C92248D379A0489AA4 = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = Utilities;
- path = ../../../Utilities;
- sourceTree = "<group>";
- };
- 831A01C745C905F5715CD822 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_blocks_basics.cpp";
- path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 8CE533D611CD0984AD028D73 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 903CD4126C779884797EF915 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 9144821E003E15E4042B57DB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_video.mm";
- path = "../../JuceLibraryCode/include_juce_video.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 934ACDCB3FD9D223A3481D8F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = JUCEDemos.cpp;
- path = ../../Source/Demos/JUCEDemos.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 94B6C88FE30861A47CD28709 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 9672FCE6167ADB567A9EB2F8 = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 96D99A08027CA35D6A4E5CFD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- 979F23EA9E5E76131299E886 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 9EBAEBBD9093CB005D1692F2 = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = GUI;
- path = ../../../GUI;
- sourceTree = "<group>";
- };
- A04E4408525F24F7DCBA000E = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- A1D6D36B96B6B37C31F32829 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- A5256778E2EBD206B337B555 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_video";
- path = "../../../../modules/juce_video";
- sourceTree = "SOURCE_ROOT";
- };
- A6F555BE0DDF01C285BD8BF5 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_dsp";
- path = "../../../../modules/juce_dsp";
- sourceTree = "SOURCE_ROOT";
- };
- A9315F8368A5771EC39631CB = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- B2BC383CE102EECCF49C7AF7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = IntroScreen.h;
- path = ../../Source/Demos/IntroScreen.h;
- sourceTree = "SOURCE_ROOT";
- };
- C1E93FAF6C68A40A664422CD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_dsp.mm";
- path = "../../JuceLibraryCode/include_juce_dsp.mm";
- sourceTree = "SOURCE_ROOT";
- };
- CE38E6469D98462A2C22C915 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_osc.cpp";
- path = "../../JuceLibraryCode/include_juce_osc.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- CFF2BBEB242CC8B3B904B5F9 = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = DemoRunner.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- D018D636A4DC9BEA11720129 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_blocks_basics";
- path = "../../../../modules/juce_blocks_basics";
- sourceTree = "SOURCE_ROOT";
- };
- DC192EFA899E6CBE6B5CD394 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- E061A1C75FA5722167FC4997 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- E0A3F113BC27B7B4D6F1D693 = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- E5BFC17E682AB426D203B3E6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoContentComponent.cpp;
- path = ../../Source/UI/DemoContentComponent.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- E67AB94002886AF67437D6AE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- EB68BD1224CD9748BFA332C0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainComponent.h;
- path = ../../Source/UI/MainComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- ECE79F1433E92BB6213C86F5 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = JUCEAppIcon.png;
- path = ../../Source/JUCEAppIcon.png;
- sourceTree = "SOURCE_ROOT";
- };
- EDDA01B246C6128CAF7A2914 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- EE6BDC78B539D27E65E92265 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JUCEDemos.h;
- path = ../../Source/Demos/JUCEDemos.h;
- sourceTree = "SOURCE_ROOT";
- };
- F5F2EA2238973488632FC322 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- FB1FC613CE260140F1CFD21B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- FCD0D758C5767944BEC29730 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- FDC3CA8D1403C169659F7D8C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- CD575607FAA297480EE95F13 = {
- isa = PBXGroup;
- children = (
- 3AB62BFF806112585B54DDA3,
- 061AECBF1CC7056F4155812D,
- B2BC383CE102EECCF49C7AF7,
- 934ACDCB3FD9D223A3481D8F,
- EE6BDC78B539D27E65E92265,
- );
- name = Demos;
- sourceTree = "<group>";
- };
- BB12537403CC24C02622582C = {
- isa = PBXGroup;
- children = (
- E5BFC17E682AB426D203B3E6,
- 1FCD2145DE3FCFCF4F55A8AD,
- 25E5ED33876A2C752378C859,
- EB68BD1224CD9748BFA332C0,
- 7A5AAE9EE573FC6105CC4AAC,
- );
- name = UI;
- sourceTree = "<group>";
- };
- 6F933968486D9AD9FE112622 = {
- isa = PBXGroup;
- children = (
- CD575607FAA297480EE95F13,
- BB12537403CC24C02622582C,
- 260481E972425474BB8155B0,
- ECE79F1433E92BB6213C86F5,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 9683F931FA1B8B85FA8C4BD8 = {
- isa = PBXGroup;
- children = (
- 6F933968486D9AD9FE112622,
- );
- name = DemoRunner;
- sourceTree = "<group>";
- };
- 5A0B2CEF393A25C6D4B1B76C = {
- isa = PBXGroup;
- children = (
- 112FFCB73597157E721BCDF2,
- 6847A9B2C5E3C2ED56D8D4E7,
- 60F2869DC345EAF2314D6C09,
- 491641F7632BCC81BBA0ED85,
- 346450C70C964FD9640B6086,
- 0B36C013D9790568B481634C,
- D018D636A4DC9BEA11720129,
- 6C2C1AC86623F457427965EF,
- 903CD4126C779884797EF915,
- 14CBD28B4887DAF89E27491C,
- FDC3CA8D1403C169659F7D8C,
- A6F555BE0DDF01C285BD8BF5,
- FB1FC613CE260140F1CFD21B,
- 8CE533D611CD0984AD028D73,
- 5A9F2000C66D24E8B01BE60B,
- A9315F8368A5771EC39631CB,
- 6C198AF93E1F6E682189E2F6,
- 651ECE3C7BA845DDCFEE48F3,
- 4FE6029FF76BCE9698595DC5,
- A5256778E2EBD206B337B555,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 61F3057D838D7DABB0FA3D34 = {
- isa = PBXGroup;
- children = (
- 72129757D2A553B90A7157C6,
- 5965349393850F41DF76F350,
- 03B0F9318FD583525AB195A9,
- 03A63C3CA6F24977F19C316D,
- E061A1C75FA5722167FC4997,
- E67AB94002886AF67437D6AE,
- EDDA01B246C6128CAF7A2914,
- 831A01C745C905F5715CD822,
- 4DF215D350FFE5E119CBA7E5,
- 3BC9753E0CD75A36DC742EE0,
- 6C5E26B4D28F8450435B8AE1,
- F5F2EA2238973488632FC322,
- C1E93FAF6C68A40A664422CD,
- FCD0D758C5767944BEC29730,
- 3E4ED41C374261CFFD309743,
- A1D6D36B96B6B37C31F32829,
- 979F23EA9E5E76131299E886,
- 94B6C88FE30861A47CD28709,
- CE38E6469D98462A2C22C915,
- 0AB68DBAB6B7DAEDDDD5B683,
- 9144821E003E15E4042B57DB,
- 4E9AD0EAF3CA57B548622D9A,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- D87DCD5DA4EC8D78DFF37FCC = {
- isa = PBXGroup;
- children = (
- 0ECB4FCD24794CE516792552,
- 388A8209DBB1B08594266121,
- 5CD17151385A69F1E07FE85B,
- 9EBAEBBD9093CB005D1692F2,
- 7B3243C92248D379A0489AA4,
- 4EC2782DE1779A130835B64D,
- 9672FCE6167ADB567A9EB2F8,
- E0A3F113BC27B7B4D6F1D693,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 4452EAA652B65A9AE648288C = {
- isa = PBXGroup;
- children = (
- A04E4408525F24F7DCBA000E,
- 470C3E4553B513FFEF752779,
- DC192EFA899E6CBE6B5CD394,
- 3B99CF94C44E2EE04635A439,
- 440D507FD8F31DB62B1F95C7,
- 02A2ED58B066B4D119F67913,
- 4F0A137A4115946A346180E6,
- 1CFE3935A3B810D5D68A2504,
- 61AE09C749B007B70A265D9B,
- 3DC90DA86565B0356B6E5E0B,
- 71A91516AFD980FEE694C0E1,
- 40BD06D4AB0D2C73E936A2F1,
- 23CD1A3F9067C3A0ECE7BB67,
- 96D99A08027CA35D6A4E5CFD,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- BFDAF16175D03695EEB466BC = {
- isa = PBXGroup;
- children = (
- CFF2BBEB242CC8B3B904B5F9,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 91A9A0FE9DF4F4E10009EEC7 = {
- isa = PBXGroup;
- children = (
- 9683F931FA1B8B85FA8C4BD8,
- 5A0B2CEF393A25C6D4B1B76C,
- 61F3057D838D7DABB0FA3D34,
- D87DCD5DA4EC8D78DFF37FCC,
- 4452EAA652B65A9AE648288C,
- BFDAF16175D03695EEB466BC,
- );
- name = Source;
- sourceTree = "<group>";
- };
- B18D059E5616FA729F764229 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ 63A2F309E55DAC206E9B97E3 = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; };
+ 48CF0B02E1D06E5DA51E6270 = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
+ 163B0CF2DD0990A63DF1D5A6 = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
+ 7B4163348896EB1B86B15160 = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; };
+ 8C0AEA08A71075A6C765AEC9 = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
+ 89BC6E2354102D975E08E918 = {isa = PBXBuildFile; fileRef = 440D507FD8F31DB62B1F95C7; };
+ 9F15FD7A7CE83CFD98F07D59 = {isa = PBXBuildFile; fileRef = 02A2ED58B066B4D119F67913; };
+ 1351A13E78F38741C6075600 = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
+ 46071CE2B98B562B7BF27CB1 = {isa = PBXBuildFile; fileRef = 1CFE3935A3B810D5D68A2504; };
+ 6A61CBB4E39BFD392D97528F = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; };
+ 9BEA1428416CE06BF72FBAB8 = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; };
+ 8584640341100008744861A5 = {isa = PBXBuildFile; fileRef = 71A91516AFD980FEE694C0E1; };
+ 028383D0577D0236899D8CA5 = {isa = PBXBuildFile; fileRef = 40BD06D4AB0D2C73E936A2F1; };
+ B1981F62F6A91FD2F579A198 = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
+ 89AD16514B1F4133FFEA1DF9 = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; };
+ D3D8CDCE42E8BE31C7247E38 = {isa = PBXBuildFile; fileRef = 0ECB4FCD24794CE516792552; };
+ 3B3952A9A14320312EF890A5 = {isa = PBXBuildFile; fileRef = 388A8209DBB1B08594266121; };
+ 41BAB55E0D992708EF06E2C4 = {isa = PBXBuildFile; fileRef = 5CD17151385A69F1E07FE85B; };
+ 1BA301E39E29966719B710A1 = {isa = PBXBuildFile; fileRef = 9EBAEBBD9093CB005D1692F2; };
+ E33E8FE2E7F8EC8EB4279F1B = {isa = PBXBuildFile; fileRef = 7B3243C92248D379A0489AA4; };
+ 91CD2BCE4CA07E18229EB436 = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; };
+ 75DB074DBAE04408A0A917B7 = {isa = PBXBuildFile; fileRef = E0A3F113BC27B7B4D6F1D693; };
+ E6F58FC3ACAE774DB4D06420 = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
+ 36E115D98311F12AA06710E6 = {isa = PBXBuildFile; fileRef = 061AECBF1CC7056F4155812D; };
+ B38728296BB32B7994CE28DF = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
+ 71DF4F5EB4C8305688416725 = {isa = PBXBuildFile; fileRef = E5BFC17E682AB426D203B3E6; };
+ 4FBBB55F4E347757F74F1F41 = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
+ F619F3887CEC064441BB6EE6 = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
+ C2BB2B6DA237FE0CB64C7EDA = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
+ F28112945CEBEA4CE8975833 = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
+ 9EACEA6BE8D0ACC72C12C080 = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
+ 26652AB1BB77C8A39434775F = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
+ 2707968B431D83AC7E28E49B = {isa = PBXBuildFile; fileRef = E67AB94002886AF67437D6AE; };
+ 712D81867EC698463252FA79 = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; };
+ 49E7BBD46981F0035E4E9021 = {isa = PBXBuildFile; fileRef = 831A01C745C905F5715CD822; };
+ 611298FAC1A543BDD10D4C41 = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; };
+ D183F8140174ACCDDCD230A2 = {isa = PBXBuildFile; fileRef = 3BC9753E0CD75A36DC742EE0; };
+ FF87532E62753EDFA3D29CAD = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
+ 2F76CA28C8C0EFC7453D0EB8 = {isa = PBXBuildFile; fileRef = F5F2EA2238973488632FC322; };
+ 6B5560283DEEBD6DD2D6C984 = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; };
+ 1DBDFEDE359CFC84F8E3DE4C = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
+ CDABEA6258EC70C65C9ACCFE = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
+ E2F44A968EC2598DAE33A997 = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
+ 5CB78489F16E82144914972D = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; };
+ BC6036F22423CA0AFF0385A7 = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
+ AEA090DAC5C747C50C7D3FA7 = {isa = PBXBuildFile; fileRef = CE38E6469D98462A2C22C915; };
+ CDEB6BA5341494AF51D07C72 = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
+ 0140787C0118A95E37DE90B4 = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
+ 02A2ED58B066B4D119F67913 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 03A63C3CA6F24977F19C316D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 03B0F9318FD583525AB195A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 061AECBF1CC7056F4155812D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs2.cpp; path = ../../Source/Demos/DemoPIPs2.cpp; sourceTree = "SOURCE_ROOT"; };
+ 0AB68DBAB6B7DAEDDDD5B683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+ 0B36C013D9790568B481634C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ 0ECB4FCD24794CE516792552 = {isa = PBXFileReference; lastKnownFileType = folder; name = Audio; path = ../../../Audio; sourceTree = "<group>"; };
+ 112FFCB73597157E721BCDF2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ 14CBD28B4887DAF89E27491C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ 1CFE3935A3B810D5D68A2504 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+ 1FCD2145DE3FCFCF4F55A8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DemoContentComponent.h; path = ../../Source/UI/DemoContentComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 23CD1A3F9067C3A0ECE7BB67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 25E5ED33876A2C752378C859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+ 260481E972425474BB8155B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 346450C70C964FD9640B6086 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ 388A8209DBB1B08594266121 = {isa = PBXFileReference; lastKnownFileType = folder; name = BLOCKS; path = ../../../BLOCKS; sourceTree = "<group>"; };
+ 3AB62BFF806112585B54DDA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = "SOURCE_ROOT"; };
+ 3B99CF94C44E2EE04635A439 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+ 3BC9753E0CD75A36DC742EE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 3DC90DA86565B0356B6E5E0B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ 3E4ED41C374261CFFD309743 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 40BD06D4AB0D2C73E936A2F1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+ 440D507FD8F31DB62B1F95C7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ 470C3E4553B513FFEF752779 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 491641F7632BCC81BBA0ED85 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 4DF215D350FFE5E119CBA7E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_box2d.cpp"; path = "../../JuceLibraryCode/include_juce_box2d.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4E9AD0EAF3CA57B548622D9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 4EC2782DE1779A130835B64D = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 4F0A137A4115946A346180E6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 4FE6029FF76BCE9698595DC5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+ 5965349393850F41DF76F350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 5A9F2000C66D24E8B01BE60B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 5CD17151385A69F1E07FE85B = {isa = PBXFileReference; lastKnownFileType = folder; name = DSP; path = ../../../DSP; sourceTree = "<group>"; };
+ 60F2869DC345EAF2314D6C09 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 61AE09C749B007B70A265D9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 651ECE3C7BA845DDCFEE48F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+ 6847A9B2C5E3C2ED56D8D4E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 6C198AF93E1F6E682189E2F6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 6C2C1AC86623F457427965EF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_box2d"; path = "../../../../modules/juce_box2d"; sourceTree = "SOURCE_ROOT"; };
+ 6C5E26B4D28F8450435B8AE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ 71A91516AFD980FEE694C0E1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 72129757D2A553B90A7157C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 7A5AAE9EE573FC6105CC4AAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = "SOURCE_ROOT"; };
+ 7B3243C92248D379A0489AA4 = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = "<group>"; };
+ 831A01C745C905F5715CD822 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8CE533D611CD0984AD028D73 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 903CD4126C779884797EF915 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 9144821E003E15E4042B57DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+ 934ACDCB3FD9D223A3481D8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = "SOURCE_ROOT"; };
+ 94B6C88FE30861A47CD28709 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 9672FCE6167ADB567A9EB2F8 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 96D99A08027CA35D6A4E5CFD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ 979F23EA9E5E76131299E886 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 9EBAEBBD9093CB005D1692F2 = {isa = PBXFileReference; lastKnownFileType = folder; name = GUI; path = ../../../GUI; sourceTree = "<group>"; };
+ A04E4408525F24F7DCBA000E = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ A1D6D36B96B6B37C31F32829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ A5256778E2EBD206B337B555 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+ A6F555BE0DDF01C285BD8BF5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+ A9315F8368A5771EC39631CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ B2BC383CE102EECCF49C7AF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = "SOURCE_ROOT"; };
+ C1E93FAF6C68A40A664422CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+ CE38E6469D98462A2C22C915 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+ CFF2BBEB242CC8B3B904B5F9 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ D018D636A4DC9BEA11720129 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+ DC192EFA899E6CBE6B5CD394 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ E061A1C75FA5722167FC4997 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ E0A3F113BC27B7B4D6F1D693 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ E5BFC17E682AB426D203B3E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoContentComponent.cpp; path = ../../Source/UI/DemoContentComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+ E67AB94002886AF67437D6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ EB68BD1224CD9748BFA332C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/UI/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ ECE79F1433E92BB6213C86F5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+ EDDA01B246C6128CAF7A2914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ EE6BDC78B539D27E65E92265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JUCEDemos.h; path = ../../Source/Demos/JUCEDemos.h; sourceTree = "SOURCE_ROOT"; };
+ F5F2EA2238973488632FC322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ FB1FC613CE260140F1CFD21B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ FCD0D758C5767944BEC29730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ FDC3CA8D1403C169659F7D8C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ CD575607FAA297480EE95F13 = {isa = PBXGroup; children = (
+ 3AB62BFF806112585B54DDA3,
+ 061AECBF1CC7056F4155812D,
+ B2BC383CE102EECCF49C7AF7,
+ 934ACDCB3FD9D223A3481D8F,
+ EE6BDC78B539D27E65E92265, ); name = Demos; sourceTree = "<group>"; };
+ BB12537403CC24C02622582C = {isa = PBXGroup; children = (
+ E5BFC17E682AB426D203B3E6,
+ 1FCD2145DE3FCFCF4F55A8AD,
+ 25E5ED33876A2C752378C859,
+ EB68BD1224CD9748BFA332C0,
+ 7A5AAE9EE573FC6105CC4AAC, ); name = UI; sourceTree = "<group>"; };
+ 6F933968486D9AD9FE112622 = {isa = PBXGroup; children = (
+ CD575607FAA297480EE95F13,
+ BB12537403CC24C02622582C,
+ 260481E972425474BB8155B0,
+ ECE79F1433E92BB6213C86F5, ); name = Source; sourceTree = "<group>"; };
+ 9683F931FA1B8B85FA8C4BD8 = {isa = PBXGroup; children = (
+ 6F933968486D9AD9FE112622, ); name = DemoRunner; sourceTree = "<group>"; };
+ 5A0B2CEF393A25C6D4B1B76C = {isa = PBXGroup; children = (
+ 112FFCB73597157E721BCDF2,
+ 6847A9B2C5E3C2ED56D8D4E7,
+ 60F2869DC345EAF2314D6C09,
+ 491641F7632BCC81BBA0ED85,
+ 346450C70C964FD9640B6086,
+ 0B36C013D9790568B481634C,
+ D018D636A4DC9BEA11720129,
+ 6C2C1AC86623F457427965EF,
+ 903CD4126C779884797EF915,
+ 14CBD28B4887DAF89E27491C,
+ FDC3CA8D1403C169659F7D8C,
+ A6F555BE0DDF01C285BD8BF5,
+ FB1FC613CE260140F1CFD21B,
+ 8CE533D611CD0984AD028D73,
+ 5A9F2000C66D24E8B01BE60B,
+ A9315F8368A5771EC39631CB,
+ 6C198AF93E1F6E682189E2F6,
+ 651ECE3C7BA845DDCFEE48F3,
+ 4FE6029FF76BCE9698595DC5,
+ A5256778E2EBD206B337B555, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 61F3057D838D7DABB0FA3D34 = {isa = PBXGroup; children = (
+ 72129757D2A553B90A7157C6,
+ 5965349393850F41DF76F350,
+ 03B0F9318FD583525AB195A9,
+ 03A63C3CA6F24977F19C316D,
+ E061A1C75FA5722167FC4997,
+ E67AB94002886AF67437D6AE,
+ EDDA01B246C6128CAF7A2914,
+ 831A01C745C905F5715CD822,
+ 4DF215D350FFE5E119CBA7E5,
+ 3BC9753E0CD75A36DC742EE0,
+ 6C5E26B4D28F8450435B8AE1,
+ F5F2EA2238973488632FC322,
+ C1E93FAF6C68A40A664422CD,
+ FCD0D758C5767944BEC29730,
+ 3E4ED41C374261CFFD309743,
+ A1D6D36B96B6B37C31F32829,
+ 979F23EA9E5E76131299E886,
+ 94B6C88FE30861A47CD28709,
+ CE38E6469D98462A2C22C915,
+ 0AB68DBAB6B7DAEDDDD5B683,
+ 9144821E003E15E4042B57DB,
+ 4E9AD0EAF3CA57B548622D9A, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ D87DCD5DA4EC8D78DFF37FCC = {isa = PBXGroup; children = (
+ 0ECB4FCD24794CE516792552,
+ 388A8209DBB1B08594266121,
+ 5CD17151385A69F1E07FE85B,
+ 9EBAEBBD9093CB005D1692F2,
+ 7B3243C92248D379A0489AA4,
+ 4EC2782DE1779A130835B64D,
+ 9672FCE6167ADB567A9EB2F8,
+ E0A3F113BC27B7B4D6F1D693, ); name = Resources; sourceTree = "<group>"; };
+ 4452EAA652B65A9AE648288C = {isa = PBXGroup; children = (
+ A04E4408525F24F7DCBA000E,
+ 470C3E4553B513FFEF752779,
+ DC192EFA899E6CBE6B5CD394,
+ 3B99CF94C44E2EE04635A439,
+ 440D507FD8F31DB62B1F95C7,
+ 02A2ED58B066B4D119F67913,
+ 4F0A137A4115946A346180E6,
+ 1CFE3935A3B810D5D68A2504,
+ 61AE09C749B007B70A265D9B,
+ 3DC90DA86565B0356B6E5E0B,
+ 71A91516AFD980FEE694C0E1,
+ 40BD06D4AB0D2C73E936A2F1,
+ 23CD1A3F9067C3A0ECE7BB67,
+ 96D99A08027CA35D6A4E5CFD, ); name = Frameworks; sourceTree = "<group>"; };
+ BFDAF16175D03695EEB466BC = {isa = PBXGroup; children = (
+ CFF2BBEB242CC8B3B904B5F9, ); name = Products; sourceTree = "<group>"; };
+ 91A9A0FE9DF4F4E10009EEC7 = {isa = PBXGroup; children = (
+ 9683F931FA1B8B85FA8C4BD8,
+ 5A0B2CEF393A25C6D4B1B76C,
+ 61F3057D838D7DABB0FA3D34,
+ D87DCD5DA4EC8D78DFF37FCC,
+ 4452EAA652B65A9AE648288C,
+ BFDAF16175D03695EEB466BC, ); name = Source; sourceTree = "<group>"; };
+ B18D059E5616FA729F764229 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
- PRODUCT_NAME = "DemoRunner";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 69330F27DD2C71609336C7D2 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 69330F27DD2C71609336C7D2 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
- PRODUCT_NAME = "DemoRunner";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- C01EC82F42B640CA1E54AD53 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ C01EC82F42B640CA1E54AD53 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "DemoRunner";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 07EA85D22270E8EA13CA0BBE = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 07EA85D22270E8EA13CA0BBE = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "DemoRunner";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- D87BAF6D1A7451B7A733B5F1 = {
- isa = PBXTargetDependency;
- target = 291E01DCBE746A376DBFA4D1;
- };
- 80E8AD1971F52B06F4D28891 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01EC82F42B640CA1E54AD53,
- 07EA85D22270E8EA13CA0BBE,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 413FBEAEC84DFEC41133C78B = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B18D059E5616FA729F764229,
- 69330F27DD2C71609336C7D2,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 57134FDD813875865F5B2057 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D3D8CDCE42E8BE31C7247E38,
- 3B3952A9A14320312EF890A5,
- 41BAB55E0D992708EF06E2C4,
- 1BA301E39E29966719B710A1,
- E33E8FE2E7F8EC8EB4279F1B,
- 91CD2BCE4CA07E18229EB436,
- 75DB074DBAE04408A0A917B7,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- ED916866997CA4F40C7C1016 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E6F58FC3ACAE774DB4D06420,
- 36E115D98311F12AA06710E6,
- B38728296BB32B7994CE28DF,
- 71DF4F5EB4C8305688416725,
- 4FBBB55F4E347757F74F1F41,
- F619F3887CEC064441BB6EE6,
- C2BB2B6DA237FE0CB64C7EDA,
- F28112945CEBEA4CE8975833,
- 9EACEA6BE8D0ACC72C12C080,
- 26652AB1BB77C8A39434775F,
- 2707968B431D83AC7E28E49B,
- 712D81867EC698463252FA79,
- 49E7BBD46981F0035E4E9021,
- 611298FAC1A543BDD10D4C41,
- D183F8140174ACCDDCD230A2,
- FF87532E62753EDFA3D29CAD,
- 2F76CA28C8C0EFC7453D0EB8,
- 6B5560283DEEBD6DD2D6C984,
- 1DBDFEDE359CFC84F8E3DE4C,
- CDABEA6258EC70C65C9ACCFE,
- E2F44A968EC2598DAE33A997,
- 5CB78489F16E82144914972D,
- BC6036F22423CA0AFF0385A7,
- AEA090DAC5C747C50C7D3FA7,
- CDEB6BA5341494AF51D07C72,
- 0140787C0118A95E37DE90B4,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4B1F6E32C9FC8D779B21C1AF = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 48CF0B02E1D06E5DA51E6270,
- 163B0CF2DD0990A63DF1D5A6,
- 7B4163348896EB1B86B15160,
- 8C0AEA08A71075A6C765AEC9,
- 89BC6E2354102D975E08E918,
- 9F15FD7A7CE83CFD98F07D59,
- 1351A13E78F38741C6075600,
- 46071CE2B98B562B7BF27CB1,
- 6A61CBB4E39BFD392D97528F,
- 9BEA1428416CE06BF72FBAB8,
- 8584640341100008744861A5,
- 028383D0577D0236899D8CA5,
- B1981F62F6A91FD2F579A198,
- 89AD16514B1F4133FFEA1DF9,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 291E01DCBE746A376DBFA4D1 = {
- isa = PBXNativeTarget;
- buildConfigurationList = 413FBEAEC84DFEC41133C78B;
- buildPhases = (
- 57134FDD813875865F5B2057,
- ED916866997CA4F40C7C1016,
- 4B1F6E32C9FC8D779B21C1AF,
- );
- buildRules = ( );
- dependencies = ( );
- name = "DemoRunner - App";
- productName = DemoRunner;
- productReference = CFF2BBEB242CC8B3B904B5F9;
- productType = "com.apple.product-type.application";
- };
- AC6F0E9A0809A184B2C2B7DE = {
- isa = PBXProject;
- buildConfigurationList = 80E8AD1971F52B06F4D28891;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 91A9A0FE9DF4F4E10009EEC7;
- projectDirPath = "";
- projectRoot = "";
- targets = (291E01DCBE746A376DBFA4D1);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ D87BAF6D1A7451B7A733B5F1 = {isa = PBXTargetDependency; target = 291E01DCBE746A376DBFA4D1; };
+ 80E8AD1971F52B06F4D28891 = {isa = XCConfigurationList; buildConfigurations = (
+ C01EC82F42B640CA1E54AD53,
+ 07EA85D22270E8EA13CA0BBE, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 413FBEAEC84DFEC41133C78B = {isa = XCConfigurationList; buildConfigurations = (
+ B18D059E5616FA729F764229,
+ 69330F27DD2C71609336C7D2, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 57134FDD813875865F5B2057 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ D3D8CDCE42E8BE31C7247E38,
+ 3B3952A9A14320312EF890A5,
+ 41BAB55E0D992708EF06E2C4,
+ 1BA301E39E29966719B710A1,
+ E33E8FE2E7F8EC8EB4279F1B,
+ 91CD2BCE4CA07E18229EB436,
+ 75DB074DBAE04408A0A917B7, ); runOnlyForDeploymentPostprocessing = 0; };
+ ED916866997CA4F40C7C1016 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ E6F58FC3ACAE774DB4D06420,
+ 36E115D98311F12AA06710E6,
+ B38728296BB32B7994CE28DF,
+ 71DF4F5EB4C8305688416725,
+ 4FBBB55F4E347757F74F1F41,
+ F619F3887CEC064441BB6EE6,
+ C2BB2B6DA237FE0CB64C7EDA,
+ F28112945CEBEA4CE8975833,
+ 9EACEA6BE8D0ACC72C12C080,
+ 26652AB1BB77C8A39434775F,
+ 2707968B431D83AC7E28E49B,
+ 712D81867EC698463252FA79,
+ 49E7BBD46981F0035E4E9021,
+ 611298FAC1A543BDD10D4C41,
+ D183F8140174ACCDDCD230A2,
+ FF87532E62753EDFA3D29CAD,
+ 2F76CA28C8C0EFC7453D0EB8,
+ 6B5560283DEEBD6DD2D6C984,
+ 1DBDFEDE359CFC84F8E3DE4C,
+ CDABEA6258EC70C65C9ACCFE,
+ E2F44A968EC2598DAE33A997,
+ 5CB78489F16E82144914972D,
+ BC6036F22423CA0AFF0385A7,
+ AEA090DAC5C747C50C7D3FA7,
+ CDEB6BA5341494AF51D07C72,
+ 0140787C0118A95E37DE90B4, ); runOnlyForDeploymentPostprocessing = 0; };
+ 4B1F6E32C9FC8D779B21C1AF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 48CF0B02E1D06E5DA51E6270,
+ 163B0CF2DD0990A63DF1D5A6,
+ 7B4163348896EB1B86B15160,
+ 8C0AEA08A71075A6C765AEC9,
+ 89BC6E2354102D975E08E918,
+ 9F15FD7A7CE83CFD98F07D59,
+ 1351A13E78F38741C6075600,
+ 46071CE2B98B562B7BF27CB1,
+ 6A61CBB4E39BFD392D97528F,
+ 9BEA1428416CE06BF72FBAB8,
+ 8584640341100008744861A5,
+ 028383D0577D0236899D8CA5,
+ B1981F62F6A91FD2F579A198,
+ 89AD16514B1F4133FFEA1DF9, ); runOnlyForDeploymentPostprocessing = 0; };
+ 291E01DCBE746A376DBFA4D1 = {isa = PBXNativeTarget; buildConfigurationList = 413FBEAEC84DFEC41133C78B; buildPhases = (
+ 57134FDD813875865F5B2057,
+ ED916866997CA4F40C7C1016,
+ 4B1F6E32C9FC8D779B21C1AF, ); buildRules = ( ); dependencies = ( ); name = "DemoRunner - App"; productName = DemoRunner; productReference = CFF2BBEB242CC8B3B904B5F9; productType = "com.apple.product-type.application"; };
+ AC6F0E9A0809A184B2C2B7DE = {isa = PBXProject; buildConfigurationList = 80E8AD1971F52B06F4D28891; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 91A9A0FE9DF4F4E10009EEC7; projectDirPath = ""; projectRoot = ""; targets = (291E01DCBE746A376DBFA4D1); };
};
rootObject = AC6F0E9A0809A184B2C2B7DE;
}
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
<plist>\r
<dict>\r
- <key>NSMicrophoneUsageDescription</key>\r
- <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
- <key>NSCameraUsageDescription</key>\r
- <string>This app requires access to the camera to function correctly.</string>\r
<key>CFBundleExecutable</key>\r
<string>${EXECUTABLE_NAME}</string>\r
<key>CFBundleIconFile</key>\r
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>CFBundleVersion</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2018 - ROLI Ltd.</string>\r
<key>NSHighResolutionCapable</key>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
<Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
<Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">DemoRunner</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
<Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "Copyright (c) 2018 - ROLI Ltd.\0"\r
VALUE "FileDescription", "DemoRunner\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "DemoRunner\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
};
objectVersion = 46;
objects = {
- 63A2F309E55DAC206E9B97E3 = {
- isa = PBXBuildFile;
- fileRef = CFF2BBEB242CC8B3B904B5F9;
- };
- 48CF0B02E1D06E5DA51E6270 = {
- isa = PBXBuildFile;
- fileRef = A04E4408525F24F7DCBA000E;
- };
- 163B0CF2DD0990A63DF1D5A6 = {
- isa = PBXBuildFile;
- fileRef = 470C3E4553B513FFEF752779;
- };
- 7B4163348896EB1B86B15160 = {
- isa = PBXBuildFile;
- fileRef = DC192EFA899E6CBE6B5CD394;
- };
- 8C0AEA08A71075A6C765AEC9 = {
- isa = PBXBuildFile;
- fileRef = 3B99CF94C44E2EE04635A439;
- };
- 1351A13E78F38741C6075600 = {
- isa = PBXBuildFile;
- fileRef = 4F0A137A4115946A346180E6;
- };
- 527DA2E6827BAFDDD3E8E80F = {
- isa = PBXBuildFile;
- fileRef = B4389672DA4CC8E0A531062D;
- };
- 34A4931AF1DD424D3A400EEF = {
- isa = PBXBuildFile;
- fileRef = 76A157A111866670A4678F04;
- };
- 7F57DB52C3CEFDC26DDD38FC = {
- isa = PBXBuildFile;
- fileRef = B28EFB9D1DF0B6D6499A7DEF;
- };
- 46071CE2B98B562B7BF27CB1 = {
- isa = PBXBuildFile;
- fileRef = 1CFE3935A3B810D5D68A2504;
- };
- 6A61CBB4E39BFD392D97528F = {
- isa = PBXBuildFile;
- fileRef = 61AE09C749B007B70A265D9B;
- };
- 0B0CE6D5062E5C02A41F24BC = {
- isa = PBXBuildFile;
- fileRef = 873F9DD54978E601102353B4;
- };
- 5E4310B3F6BB639875D3E9B8 = {
- isa = PBXBuildFile;
- fileRef = 49ECA8B998B339A083674A22;
- };
- AE7FB2AC3885F4BF53A5DDA1 = {
- isa = PBXBuildFile;
- fileRef = 7983C452610C1638B7E78F12;
- };
- 1FB200F4AE3E4E7CDFF629BB = {
- isa = PBXBuildFile;
- fileRef = 24D74AF1C95BEF957DC4FA77;
- };
- AC783ECD84496E0B77911EEE = {
- isa = PBXBuildFile;
- fileRef = 34F1320BC5C23702C08DF9F0;
- };
- B1981F62F6A91FD2F579A198 = {
- isa = PBXBuildFile;
- fileRef = 23CD1A3F9067C3A0ECE7BB67;
- };
- ECA44A41DA8A935178C1A1F4 = {
- isa = PBXBuildFile;
- fileRef = F90C8B0233A54F1445343F67;
- };
- 47ED2C78B05B8A6A00E36C46 = {
- isa = PBXBuildFile;
- fileRef = 685A261BE78585293F3EAD36;
- };
- 8E63755144E29269FD82C897 = {
- isa = PBXBuildFile;
- fileRef = 8135645508EEFDBDCDF2ADC6;
- };
- 75DB074DBAE04408A0A917B7 = {
- isa = PBXBuildFile;
- fileRef = E0A3F113BC27B7B4D6F1D693;
- };
- E6F58FC3ACAE774DB4D06420 = {
- isa = PBXBuildFile;
- fileRef = 3AB62BFF806112585B54DDA3;
- };
- 36E115D98311F12AA06710E6 = {
- isa = PBXBuildFile;
- fileRef = 061AECBF1CC7056F4155812D;
- };
- B38728296BB32B7994CE28DF = {
- isa = PBXBuildFile;
- fileRef = 934ACDCB3FD9D223A3481D8F;
- };
- 71DF4F5EB4C8305688416725 = {
- isa = PBXBuildFile;
- fileRef = E5BFC17E682AB426D203B3E6;
- };
- 4FBBB55F4E347757F74F1F41 = {
- isa = PBXBuildFile;
- fileRef = 25E5ED33876A2C752378C859;
- };
- F619F3887CEC064441BB6EE6 = {
- isa = PBXBuildFile;
- fileRef = 260481E972425474BB8155B0;
- };
- C2BB2B6DA237FE0CB64C7EDA = {
- isa = PBXBuildFile;
- fileRef = 5965349393850F41DF76F350;
- };
- F28112945CEBEA4CE8975833 = {
- isa = PBXBuildFile;
- fileRef = 03B0F9318FD583525AB195A9;
- };
- 9EACEA6BE8D0ACC72C12C080 = {
- isa = PBXBuildFile;
- fileRef = 03A63C3CA6F24977F19C316D;
- };
- 26652AB1BB77C8A39434775F = {
- isa = PBXBuildFile;
- fileRef = E061A1C75FA5722167FC4997;
- };
- 2707968B431D83AC7E28E49B = {
- isa = PBXBuildFile;
- fileRef = E67AB94002886AF67437D6AE;
- };
- 712D81867EC698463252FA79 = {
- isa = PBXBuildFile;
- fileRef = EDDA01B246C6128CAF7A2914;
- };
- 49E7BBD46981F0035E4E9021 = {
- isa = PBXBuildFile;
- fileRef = 831A01C745C905F5715CD822;
- };
- 611298FAC1A543BDD10D4C41 = {
- isa = PBXBuildFile;
- fileRef = 4DF215D350FFE5E119CBA7E5;
- };
- D183F8140174ACCDDCD230A2 = {
- isa = PBXBuildFile;
- fileRef = 3BC9753E0CD75A36DC742EE0;
- };
- FF87532E62753EDFA3D29CAD = {
- isa = PBXBuildFile;
- fileRef = 6C5E26B4D28F8450435B8AE1;
- };
- 2F76CA28C8C0EFC7453D0EB8 = {
- isa = PBXBuildFile;
- fileRef = F5F2EA2238973488632FC322;
- };
- 6B5560283DEEBD6DD2D6C984 = {
- isa = PBXBuildFile;
- fileRef = C1E93FAF6C68A40A664422CD;
- };
- 1DBDFEDE359CFC84F8E3DE4C = {
- isa = PBXBuildFile;
- fileRef = FCD0D758C5767944BEC29730;
- };
- CDABEA6258EC70C65C9ACCFE = {
- isa = PBXBuildFile;
- fileRef = 3E4ED41C374261CFFD309743;
- };
- E2F44A968EC2598DAE33A997 = {
- isa = PBXBuildFile;
- fileRef = A1D6D36B96B6B37C31F32829;
- };
- 5CB78489F16E82144914972D = {
- isa = PBXBuildFile;
- fileRef = 979F23EA9E5E76131299E886;
- };
- BC6036F22423CA0AFF0385A7 = {
- isa = PBXBuildFile;
- fileRef = 94B6C88FE30861A47CD28709;
- };
- AEA090DAC5C747C50C7D3FA7 = {
- isa = PBXBuildFile;
- fileRef = CE38E6469D98462A2C22C915;
- };
- CDEB6BA5341494AF51D07C72 = {
- isa = PBXBuildFile;
- fileRef = 0AB68DBAB6B7DAEDDDD5B683;
- };
- 0140787C0118A95E37DE90B4 = {
- isa = PBXBuildFile;
- fileRef = 9144821E003E15E4042B57DB;
- };
- 03A63C3CA6F24977F19C316D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 03B0F9318FD583525AB195A9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 061AECBF1CC7056F4155812D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoPIPs2.cpp;
- path = ../../Source/Demos/DemoPIPs2.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 0AB68DBAB6B7DAEDDDD5B683 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_product_unlocking.mm";
- path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 0B36C013D9790568B481634C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- 0CCFDC1D1C7B8A12BF4822F1 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = DemoRunner.entitlements;
- path = DemoRunner.entitlements;
- sourceTree = "SOURCE_ROOT";
- };
- 112FFCB73597157E721BCDF2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_analytics";
- path = "../../../../modules/juce_analytics";
- sourceTree = "SOURCE_ROOT";
- };
- 14CBD28B4887DAF89E27491C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- 1CFE3935A3B810D5D68A2504 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMedia.framework;
- path = System/Library/Frameworks/CoreMedia.framework;
- sourceTree = SDKROOT;
- };
- 1FCD2145DE3FCFCF4F55A8AD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = DemoContentComponent.h;
- path = ../../Source/UI/DemoContentComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 23CD1A3F9067C3A0ECE7BB67 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 24D74AF1C95BEF957DC4FA77 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = MobileCoreServices.framework;
- path = System/Library/Frameworks/MobileCoreServices.framework;
- sourceTree = SDKROOT;
- };
- 25E5ED33876A2C752378C859 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = MainComponent.cpp;
- path = ../../Source/UI/MainComponent.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 260481E972425474BB8155B0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 346450C70C964FD9640B6086 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- 34F1320BC5C23702C08DF9F0 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGLES.framework;
- path = System/Library/Frameworks/OpenGLES.framework;
- sourceTree = SDKROOT;
- };
- 3AB62BFF806112585B54DDA3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoPIPs1.cpp;
- path = ../../Source/Demos/DemoPIPs1.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 3B99CF94C44E2EE04635A439 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVKit.framework;
- path = System/Library/Frameworks/AVKit.framework;
- sourceTree = SDKROOT;
- };
- 3BC9753E0CD75A36DC742EE0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 3E4ED41C374261CFFD309743 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 470C3E4553B513FFEF752779 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 491641F7632BCC81BBA0ED85 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 49ECA8B998B339A083674A22 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Foundation.framework;
- path = System/Library/Frameworks/Foundation.framework;
- sourceTree = SDKROOT;
- };
- 4DF215D350FFE5E119CBA7E5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_box2d.cpp";
- path = "../../JuceLibraryCode/include_juce_box2d.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4E9AD0EAF3CA57B548622D9A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 4EC2782DE1779A130835B64D = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 4F0A137A4115946A346180E6 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- 4FE6029FF76BCE9698595DC5 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_product_unlocking";
- path = "../../../../modules/juce_product_unlocking";
- sourceTree = "SOURCE_ROOT";
- };
- 5965349393850F41DF76F350 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_analytics.cpp";
- path = "../../JuceLibraryCode/include_juce_analytics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 5A9F2000C66D24E8B01BE60B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 60F2869DC345EAF2314D6C09 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 61AE09C749B007B70A265D9B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 651ECE3C7BA845DDCFEE48F3 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_osc";
- path = "../../../../modules/juce_osc";
- sourceTree = "SOURCE_ROOT";
- };
- 6847A9B2C5E3C2ED56D8D4E7 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 685A261BE78585293F3EAD36 = {
- isa = PBXFileReference;
- lastKnownFileType = folder;
- name = Assets;
- path = ../../../Assets;
- sourceTree = "<group>";
- };
- 6C198AF93E1F6E682189E2F6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 6C2C1AC86623F457427965EF = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_box2d";
- path = "../../../../modules/juce_box2d";
- sourceTree = "SOURCE_ROOT";
- };
- 6C5E26B4D28F8450435B8AE1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 72129757D2A553B90A7157C6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 76A157A111866670A4678F04 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreGraphics.framework;
- path = System/Library/Frameworks/CoreGraphics.framework;
- sourceTree = SDKROOT;
- };
- 7983C452610C1638B7E78F12 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = ImageIO.framework;
- path = System/Library/Frameworks/ImageIO.framework;
- sourceTree = SDKROOT;
- };
- 7A5AAE9EE573FC6105CC4AAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SettingsContent.h;
- path = ../../Source/UI/SettingsContent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 8135645508EEFDBDCDF2ADC6 = {
- isa = PBXFileReference;
- lastKnownFileType = folder.assetcatalog;
- name = Images.xcassets;
- path = DemoRunner/Images.xcassets;
- sourceTree = "SOURCE_ROOT";
- };
- 831A01C745C905F5715CD822 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_blocks_basics.cpp";
- path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 873F9DD54978E601102353B4 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreText.framework;
- path = System/Library/Frameworks/CoreText.framework;
- sourceTree = SDKROOT;
- };
- 8CE533D611CD0984AD028D73 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 903CD4126C779884797EF915 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 9144821E003E15E4042B57DB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_video.mm";
- path = "../../JuceLibraryCode/include_juce_video.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 934ACDCB3FD9D223A3481D8F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = JUCEDemos.cpp;
- path = ../../Source/Demos/JUCEDemos.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 94B6C88FE30861A47CD28709 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 979F23EA9E5E76131299E886 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- A04E4408525F24F7DCBA000E = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- A1D6D36B96B6B37C31F32829 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- A5256778E2EBD206B337B555 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_video";
- path = "../../../../modules/juce_video";
- sourceTree = "SOURCE_ROOT";
- };
- A6F555BE0DDF01C285BD8BF5 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_dsp";
- path = "../../../../modules/juce_dsp";
- sourceTree = "SOURCE_ROOT";
- };
- A9315F8368A5771EC39631CB = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- B28EFB9D1DF0B6D6499A7DEF = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreImage.framework;
- path = System/Library/Frameworks/CoreImage.framework;
- sourceTree = SDKROOT;
- };
- B2BC383CE102EECCF49C7AF7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = IntroScreen.h;
- path = ../../Source/Demos/IntroScreen.h;
- sourceTree = "SOURCE_ROOT";
- };
- B4389672DA4CC8E0A531062D = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- C1E93FAF6C68A40A664422CD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_dsp.mm";
- path = "../../JuceLibraryCode/include_juce_dsp.mm";
- sourceTree = "SOURCE_ROOT";
- };
- CE38E6469D98462A2C22C915 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_osc.cpp";
- path = "../../JuceLibraryCode/include_juce_osc.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- CFF2BBEB242CC8B3B904B5F9 = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = DemoRunner.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- D018D636A4DC9BEA11720129 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_blocks_basics";
- path = "../../../../modules/juce_blocks_basics";
- sourceTree = "SOURCE_ROOT";
- };
- DC192EFA899E6CBE6B5CD394 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- E061A1C75FA5722167FC4997 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- E0A3F113BC27B7B4D6F1D693 = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- E5BFC17E682AB426D203B3E6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = DemoContentComponent.cpp;
- path = ../../Source/UI/DemoContentComponent.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- E67AB94002886AF67437D6AE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- EB68BD1224CD9748BFA332C0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainComponent.h;
- path = ../../Source/UI/MainComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- ECE79F1433E92BB6213C86F5 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = JUCEAppIcon.png;
- path = ../../Source/JUCEAppIcon.png;
- sourceTree = "SOURCE_ROOT";
- };
- EDDA01B246C6128CAF7A2914 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- EE6BDC78B539D27E65E92265 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JUCEDemos.h;
- path = ../../Source/Demos/JUCEDemos.h;
- sourceTree = "SOURCE_ROOT";
- };
- F5F2EA2238973488632FC322 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- F90C8B0233A54F1445343F67 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = UIKit.framework;
- path = System/Library/Frameworks/UIKit.framework;
- sourceTree = SDKROOT;
- };
- FB1FC613CE260140F1CFD21B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- FCD0D758C5767944BEC29730 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- FDC3CA8D1403C169659F7D8C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- CD575607FAA297480EE95F13 = {
- isa = PBXGroup;
- children = (
- 3AB62BFF806112585B54DDA3,
- 061AECBF1CC7056F4155812D,
- B2BC383CE102EECCF49C7AF7,
- 934ACDCB3FD9D223A3481D8F,
- EE6BDC78B539D27E65E92265,
- );
- name = Demos;
- sourceTree = "<group>";
- };
- BB12537403CC24C02622582C = {
- isa = PBXGroup;
- children = (
- E5BFC17E682AB426D203B3E6,
- 1FCD2145DE3FCFCF4F55A8AD,
- 25E5ED33876A2C752378C859,
- EB68BD1224CD9748BFA332C0,
- 7A5AAE9EE573FC6105CC4AAC,
- );
- name = UI;
- sourceTree = "<group>";
- };
- 6F933968486D9AD9FE112622 = {
- isa = PBXGroup;
- children = (
- CD575607FAA297480EE95F13,
- BB12537403CC24C02622582C,
- 260481E972425474BB8155B0,
- ECE79F1433E92BB6213C86F5,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 9683F931FA1B8B85FA8C4BD8 = {
- isa = PBXGroup;
- children = (
- 6F933968486D9AD9FE112622,
- );
- name = DemoRunner;
- sourceTree = "<group>";
- };
- 5A0B2CEF393A25C6D4B1B76C = {
- isa = PBXGroup;
- children = (
- 112FFCB73597157E721BCDF2,
- 6847A9B2C5E3C2ED56D8D4E7,
- 60F2869DC345EAF2314D6C09,
- 491641F7632BCC81BBA0ED85,
- 346450C70C964FD9640B6086,
- 0B36C013D9790568B481634C,
- D018D636A4DC9BEA11720129,
- 6C2C1AC86623F457427965EF,
- 903CD4126C779884797EF915,
- 14CBD28B4887DAF89E27491C,
- FDC3CA8D1403C169659F7D8C,
- A6F555BE0DDF01C285BD8BF5,
- FB1FC613CE260140F1CFD21B,
- 8CE533D611CD0984AD028D73,
- 5A9F2000C66D24E8B01BE60B,
- A9315F8368A5771EC39631CB,
- 6C198AF93E1F6E682189E2F6,
- 651ECE3C7BA845DDCFEE48F3,
- 4FE6029FF76BCE9698595DC5,
- A5256778E2EBD206B337B555,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 61F3057D838D7DABB0FA3D34 = {
- isa = PBXGroup;
- children = (
- 72129757D2A553B90A7157C6,
- 5965349393850F41DF76F350,
- 03B0F9318FD583525AB195A9,
- 03A63C3CA6F24977F19C316D,
- E061A1C75FA5722167FC4997,
- E67AB94002886AF67437D6AE,
- EDDA01B246C6128CAF7A2914,
- 831A01C745C905F5715CD822,
- 4DF215D350FFE5E119CBA7E5,
- 3BC9753E0CD75A36DC742EE0,
- 6C5E26B4D28F8450435B8AE1,
- F5F2EA2238973488632FC322,
- C1E93FAF6C68A40A664422CD,
- FCD0D758C5767944BEC29730,
- 3E4ED41C374261CFFD309743,
- A1D6D36B96B6B37C31F32829,
- 979F23EA9E5E76131299E886,
- 94B6C88FE30861A47CD28709,
- CE38E6469D98462A2C22C915,
- 0AB68DBAB6B7DAEDDDD5B683,
- 9144821E003E15E4042B57DB,
- 4E9AD0EAF3CA57B548622D9A,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- D87DCD5DA4EC8D78DFF37FCC = {
- isa = PBXGroup;
- children = (
- 685A261BE78585293F3EAD36,
- 4EC2782DE1779A130835B64D,
- 8135645508EEFDBDCDF2ADC6,
- E0A3F113BC27B7B4D6F1D693,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 4452EAA652B65A9AE648288C = {
- isa = PBXGroup;
- children = (
- A04E4408525F24F7DCBA000E,
- 470C3E4553B513FFEF752779,
- DC192EFA899E6CBE6B5CD394,
- 3B99CF94C44E2EE04635A439,
- 4F0A137A4115946A346180E6,
- B4389672DA4CC8E0A531062D,
- 76A157A111866670A4678F04,
- B28EFB9D1DF0B6D6499A7DEF,
- 1CFE3935A3B810D5D68A2504,
- 61AE09C749B007B70A265D9B,
- 873F9DD54978E601102353B4,
- 49ECA8B998B339A083674A22,
- 7983C452610C1638B7E78F12,
- 24D74AF1C95BEF957DC4FA77,
- 34F1320BC5C23702C08DF9F0,
- 23CD1A3F9067C3A0ECE7BB67,
- F90C8B0233A54F1445343F67,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- BFDAF16175D03695EEB466BC = {
- isa = PBXGroup;
- children = (
- CFF2BBEB242CC8B3B904B5F9,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 91A9A0FE9DF4F4E10009EEC7 = {
- isa = PBXGroup;
- children = (
- 0CCFDC1D1C7B8A12BF4822F1,
- 9683F931FA1B8B85FA8C4BD8,
- 5A0B2CEF393A25C6D4B1B76C,
- 61F3057D838D7DABB0FA3D34,
- D87DCD5DA4EC8D78DFF37FCC,
- 4452EAA652B65A9AE648288C,
- BFDAF16175D03695EEB466BC,
- );
- name = Source;
- sourceTree = "<group>";
- };
- B18D059E5616FA729F764229 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ 63A2F309E55DAC206E9B97E3 = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; };
+ 48CF0B02E1D06E5DA51E6270 = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
+ 163B0CF2DD0990A63DF1D5A6 = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
+ 7B4163348896EB1B86B15160 = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; };
+ 8C0AEA08A71075A6C765AEC9 = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
+ 1351A13E78F38741C6075600 = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
+ 527DA2E6827BAFDDD3E8E80F = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; };
+ 34A4931AF1DD424D3A400EEF = {isa = PBXBuildFile; fileRef = 76A157A111866670A4678F04; };
+ 7F57DB52C3CEFDC26DDD38FC = {isa = PBXBuildFile; fileRef = B28EFB9D1DF0B6D6499A7DEF; };
+ 46071CE2B98B562B7BF27CB1 = {isa = PBXBuildFile; fileRef = 1CFE3935A3B810D5D68A2504; };
+ 6A61CBB4E39BFD392D97528F = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; };
+ 0B0CE6D5062E5C02A41F24BC = {isa = PBXBuildFile; fileRef = 873F9DD54978E601102353B4; };
+ 5E4310B3F6BB639875D3E9B8 = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; };
+ AE7FB2AC3885F4BF53A5DDA1 = {isa = PBXBuildFile; fileRef = 7983C452610C1638B7E78F12; };
+ 1FB200F4AE3E4E7CDFF629BB = {isa = PBXBuildFile; fileRef = 24D74AF1C95BEF957DC4FA77; };
+ AC783ECD84496E0B77911EEE = {isa = PBXBuildFile; fileRef = 34F1320BC5C23702C08DF9F0; };
+ B1981F62F6A91FD2F579A198 = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
+ ECA44A41DA8A935178C1A1F4 = {isa = PBXBuildFile; fileRef = F90C8B0233A54F1445343F67; };
+ 47ED2C78B05B8A6A00E36C46 = {isa = PBXBuildFile; fileRef = 685A261BE78585293F3EAD36; };
+ 8E63755144E29269FD82C897 = {isa = PBXBuildFile; fileRef = 8135645508EEFDBDCDF2ADC6; };
+ 75DB074DBAE04408A0A917B7 = {isa = PBXBuildFile; fileRef = E0A3F113BC27B7B4D6F1D693; };
+ E6F58FC3ACAE774DB4D06420 = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
+ 36E115D98311F12AA06710E6 = {isa = PBXBuildFile; fileRef = 061AECBF1CC7056F4155812D; };
+ B38728296BB32B7994CE28DF = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
+ 71DF4F5EB4C8305688416725 = {isa = PBXBuildFile; fileRef = E5BFC17E682AB426D203B3E6; };
+ 4FBBB55F4E347757F74F1F41 = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
+ F619F3887CEC064441BB6EE6 = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
+ C2BB2B6DA237FE0CB64C7EDA = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
+ F28112945CEBEA4CE8975833 = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
+ 9EACEA6BE8D0ACC72C12C080 = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
+ 26652AB1BB77C8A39434775F = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
+ 2707968B431D83AC7E28E49B = {isa = PBXBuildFile; fileRef = E67AB94002886AF67437D6AE; };
+ 712D81867EC698463252FA79 = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; };
+ 49E7BBD46981F0035E4E9021 = {isa = PBXBuildFile; fileRef = 831A01C745C905F5715CD822; };
+ 611298FAC1A543BDD10D4C41 = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; };
+ D183F8140174ACCDDCD230A2 = {isa = PBXBuildFile; fileRef = 3BC9753E0CD75A36DC742EE0; };
+ FF87532E62753EDFA3D29CAD = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
+ 2F76CA28C8C0EFC7453D0EB8 = {isa = PBXBuildFile; fileRef = F5F2EA2238973488632FC322; };
+ 6B5560283DEEBD6DD2D6C984 = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; };
+ 1DBDFEDE359CFC84F8E3DE4C = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
+ CDABEA6258EC70C65C9ACCFE = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
+ E2F44A968EC2598DAE33A997 = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
+ 5CB78489F16E82144914972D = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; };
+ BC6036F22423CA0AFF0385A7 = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
+ AEA090DAC5C747C50C7D3FA7 = {isa = PBXBuildFile; fileRef = CE38E6469D98462A2C22C915; };
+ CDEB6BA5341494AF51D07C72 = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
+ 0140787C0118A95E37DE90B4 = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
+ 03A63C3CA6F24977F19C316D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 03B0F9318FD583525AB195A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 061AECBF1CC7056F4155812D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs2.cpp; path = ../../Source/Demos/DemoPIPs2.cpp; sourceTree = "SOURCE_ROOT"; };
+ 0AB68DBAB6B7DAEDDDD5B683 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+ 0B36C013D9790568B481634C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ 0CCFDC1D1C7B8A12BF4822F1 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = DemoRunner.entitlements; path = DemoRunner.entitlements; sourceTree = "SOURCE_ROOT"; };
+ 112FFCB73597157E721BCDF2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ 14CBD28B4887DAF89E27491C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ 1CFE3935A3B810D5D68A2504 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+ 1FCD2145DE3FCFCF4F55A8AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DemoContentComponent.h; path = ../../Source/UI/DemoContentComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 23CD1A3F9067C3A0ECE7BB67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 24D74AF1C95BEF957DC4FA77 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+ 25E5ED33876A2C752378C859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+ 260481E972425474BB8155B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 346450C70C964FD9640B6086 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ 34F1320BC5C23702C08DF9F0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+ 3AB62BFF806112585B54DDA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = "SOURCE_ROOT"; };
+ 3B99CF94C44E2EE04635A439 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+ 3BC9753E0CD75A36DC742EE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 3E4ED41C374261CFFD309743 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 470C3E4553B513FFEF752779 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 491641F7632BCC81BBA0ED85 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 49ECA8B998B339A083674A22 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 4DF215D350FFE5E119CBA7E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_box2d.cpp"; path = "../../JuceLibraryCode/include_juce_box2d.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4E9AD0EAF3CA57B548622D9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 4EC2782DE1779A130835B64D = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 4F0A137A4115946A346180E6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 4FE6029FF76BCE9698595DC5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+ 5965349393850F41DF76F350 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 5A9F2000C66D24E8B01BE60B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 60F2869DC345EAF2314D6C09 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 61AE09C749B007B70A265D9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 651ECE3C7BA845DDCFEE48F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+ 6847A9B2C5E3C2ED56D8D4E7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 685A261BE78585293F3EAD36 = {isa = PBXFileReference; lastKnownFileType = folder; name = Assets; path = ../../../Assets; sourceTree = "<group>"; };
+ 6C198AF93E1F6E682189E2F6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 6C2C1AC86623F457427965EF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_box2d"; path = "../../../../modules/juce_box2d"; sourceTree = "SOURCE_ROOT"; };
+ 6C5E26B4D28F8450435B8AE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ 72129757D2A553B90A7157C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 76A157A111866670A4678F04 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 7983C452610C1638B7E78F12 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
+ 7A5AAE9EE573FC6105CC4AAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = "SOURCE_ROOT"; };
+ 8135645508EEFDBDCDF2ADC6 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+ 831A01C745C905F5715CD822 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 873F9DD54978E601102353B4 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+ 8CE533D611CD0984AD028D73 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 903CD4126C779884797EF915 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 9144821E003E15E4042B57DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+ 934ACDCB3FD9D223A3481D8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = "SOURCE_ROOT"; };
+ 94B6C88FE30861A47CD28709 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 979F23EA9E5E76131299E886 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ A04E4408525F24F7DCBA000E = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ A1D6D36B96B6B37C31F32829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ A5256778E2EBD206B337B555 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+ A6F555BE0DDF01C285BD8BF5 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+ A9315F8368A5771EC39631CB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ B28EFB9D1DF0B6D6499A7DEF = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ B2BC383CE102EECCF49C7AF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = "SOURCE_ROOT"; };
+ B4389672DA4CC8E0A531062D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ C1E93FAF6C68A40A664422CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+ CE38E6469D98462A2C22C915 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+ CFF2BBEB242CC8B3B904B5F9 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ D018D636A4DC9BEA11720129 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+ DC192EFA899E6CBE6B5CD394 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ E061A1C75FA5722167FC4997 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ E0A3F113BC27B7B4D6F1D693 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ E5BFC17E682AB426D203B3E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoContentComponent.cpp; path = ../../Source/UI/DemoContentComponent.cpp; sourceTree = "SOURCE_ROOT"; };
+ E67AB94002886AF67437D6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ EB68BD1224CD9748BFA332C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/UI/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ ECE79F1433E92BB6213C86F5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+ EDDA01B246C6128CAF7A2914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ EE6BDC78B539D27E65E92265 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JUCEDemos.h; path = ../../Source/Demos/JUCEDemos.h; sourceTree = "SOURCE_ROOT"; };
+ F5F2EA2238973488632FC322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ F90C8B0233A54F1445343F67 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ FB1FC613CE260140F1CFD21B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ FCD0D758C5767944BEC29730 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ FDC3CA8D1403C169659F7D8C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ CD575607FAA297480EE95F13 = {isa = PBXGroup; children = (
+ 3AB62BFF806112585B54DDA3,
+ 061AECBF1CC7056F4155812D,
+ B2BC383CE102EECCF49C7AF7,
+ 934ACDCB3FD9D223A3481D8F,
+ EE6BDC78B539D27E65E92265, ); name = Demos; sourceTree = "<group>"; };
+ BB12537403CC24C02622582C = {isa = PBXGroup; children = (
+ E5BFC17E682AB426D203B3E6,
+ 1FCD2145DE3FCFCF4F55A8AD,
+ 25E5ED33876A2C752378C859,
+ EB68BD1224CD9748BFA332C0,
+ 7A5AAE9EE573FC6105CC4AAC, ); name = UI; sourceTree = "<group>"; };
+ 6F933968486D9AD9FE112622 = {isa = PBXGroup; children = (
+ CD575607FAA297480EE95F13,
+ BB12537403CC24C02622582C,
+ 260481E972425474BB8155B0,
+ ECE79F1433E92BB6213C86F5, ); name = Source; sourceTree = "<group>"; };
+ 9683F931FA1B8B85FA8C4BD8 = {isa = PBXGroup; children = (
+ 6F933968486D9AD9FE112622, ); name = DemoRunner; sourceTree = "<group>"; };
+ 5A0B2CEF393A25C6D4B1B76C = {isa = PBXGroup; children = (
+ 112FFCB73597157E721BCDF2,
+ 6847A9B2C5E3C2ED56D8D4E7,
+ 60F2869DC345EAF2314D6C09,
+ 491641F7632BCC81BBA0ED85,
+ 346450C70C964FD9640B6086,
+ 0B36C013D9790568B481634C,
+ D018D636A4DC9BEA11720129,
+ 6C2C1AC86623F457427965EF,
+ 903CD4126C779884797EF915,
+ 14CBD28B4887DAF89E27491C,
+ FDC3CA8D1403C169659F7D8C,
+ A6F555BE0DDF01C285BD8BF5,
+ FB1FC613CE260140F1CFD21B,
+ 8CE533D611CD0984AD028D73,
+ 5A9F2000C66D24E8B01BE60B,
+ A9315F8368A5771EC39631CB,
+ 6C198AF93E1F6E682189E2F6,
+ 651ECE3C7BA845DDCFEE48F3,
+ 4FE6029FF76BCE9698595DC5,
+ A5256778E2EBD206B337B555, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 61F3057D838D7DABB0FA3D34 = {isa = PBXGroup; children = (
+ 72129757D2A553B90A7157C6,
+ 5965349393850F41DF76F350,
+ 03B0F9318FD583525AB195A9,
+ 03A63C3CA6F24977F19C316D,
+ E061A1C75FA5722167FC4997,
+ E67AB94002886AF67437D6AE,
+ EDDA01B246C6128CAF7A2914,
+ 831A01C745C905F5715CD822,
+ 4DF215D350FFE5E119CBA7E5,
+ 3BC9753E0CD75A36DC742EE0,
+ 6C5E26B4D28F8450435B8AE1,
+ F5F2EA2238973488632FC322,
+ C1E93FAF6C68A40A664422CD,
+ FCD0D758C5767944BEC29730,
+ 3E4ED41C374261CFFD309743,
+ A1D6D36B96B6B37C31F32829,
+ 979F23EA9E5E76131299E886,
+ 94B6C88FE30861A47CD28709,
+ CE38E6469D98462A2C22C915,
+ 0AB68DBAB6B7DAEDDDD5B683,
+ 9144821E003E15E4042B57DB,
+ 4E9AD0EAF3CA57B548622D9A, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ D87DCD5DA4EC8D78DFF37FCC = {isa = PBXGroup; children = (
+ 685A261BE78585293F3EAD36,
+ 4EC2782DE1779A130835B64D,
+ 8135645508EEFDBDCDF2ADC6,
+ E0A3F113BC27B7B4D6F1D693, ); name = Resources; sourceTree = "<group>"; };
+ 4452EAA652B65A9AE648288C = {isa = PBXGroup; children = (
+ A04E4408525F24F7DCBA000E,
+ 470C3E4553B513FFEF752779,
+ DC192EFA899E6CBE6B5CD394,
+ 3B99CF94C44E2EE04635A439,
+ 4F0A137A4115946A346180E6,
+ B4389672DA4CC8E0A531062D,
+ 76A157A111866670A4678F04,
+ B28EFB9D1DF0B6D6499A7DEF,
+ 1CFE3935A3B810D5D68A2504,
+ 61AE09C749B007B70A265D9B,
+ 873F9DD54978E601102353B4,
+ 49ECA8B998B339A083674A22,
+ 7983C452610C1638B7E78F12,
+ 24D74AF1C95BEF957DC4FA77,
+ 34F1320BC5C23702C08DF9F0,
+ 23CD1A3F9067C3A0ECE7BB67,
+ F90C8B0233A54F1445343F67, ); name = Frameworks; sourceTree = "<group>"; };
+ BFDAF16175D03695EEB466BC = {isa = PBXGroup; children = (
+ CFF2BBEB242CC8B3B904B5F9, ); name = Products; sourceTree = "<group>"; };
+ 91A9A0FE9DF4F4E10009EEC7 = {isa = PBXGroup; children = (
+ 0CCFDC1D1C7B8A12BF4822F1,
+ 9683F931FA1B8B85FA8C4BD8,
+ 5A0B2CEF393A25C6D4B1B76C,
+ 61F3057D838D7DABB0FA3D34,
+ D87DCD5DA4EC8D78DFF37FCC,
+ 4452EAA652B65A9AE648288C,
+ BFDAF16175D03695EEB466BC, ); name = Source; sourceTree = "<group>"; };
+ B18D059E5616FA729F764229 = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
- PRODUCT_NAME = "DemoRunner";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 69330F27DD2C71609336C7D2 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 69330F27DD2C71609336C7D2 = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.demorunner;
- PRODUCT_NAME = "DemoRunner";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- C01EC82F42B640CA1E54AD53 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Release; };
+ C01EC82F42B640CA1E54AD53 = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 07EA85D22270E8EA13CA0BBE = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 07EA85D22270E8EA13CA0BBE = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- D87BAF6D1A7451B7A733B5F1 = {
- isa = PBXTargetDependency;
- target = 291E01DCBE746A376DBFA4D1;
- };
- 80E8AD1971F52B06F4D28891 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01EC82F42B640CA1E54AD53,
- 07EA85D22270E8EA13CA0BBE,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 413FBEAEC84DFEC41133C78B = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B18D059E5616FA729F764229,
- 69330F27DD2C71609336C7D2,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 57134FDD813875865F5B2057 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 47ED2C78B05B8A6A00E36C46,
- 8E63755144E29269FD82C897,
- 75DB074DBAE04408A0A917B7,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- ED916866997CA4F40C7C1016 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E6F58FC3ACAE774DB4D06420,
- 36E115D98311F12AA06710E6,
- B38728296BB32B7994CE28DF,
- 71DF4F5EB4C8305688416725,
- 4FBBB55F4E347757F74F1F41,
- F619F3887CEC064441BB6EE6,
- C2BB2B6DA237FE0CB64C7EDA,
- F28112945CEBEA4CE8975833,
- 9EACEA6BE8D0ACC72C12C080,
- 26652AB1BB77C8A39434775F,
- 2707968B431D83AC7E28E49B,
- 712D81867EC698463252FA79,
- 49E7BBD46981F0035E4E9021,
- 611298FAC1A543BDD10D4C41,
- D183F8140174ACCDDCD230A2,
- FF87532E62753EDFA3D29CAD,
- 2F76CA28C8C0EFC7453D0EB8,
- 6B5560283DEEBD6DD2D6C984,
- 1DBDFEDE359CFC84F8E3DE4C,
- CDABEA6258EC70C65C9ACCFE,
- E2F44A968EC2598DAE33A997,
- 5CB78489F16E82144914972D,
- BC6036F22423CA0AFF0385A7,
- AEA090DAC5C747C50C7D3FA7,
- CDEB6BA5341494AF51D07C72,
- 0140787C0118A95E37DE90B4,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4B1F6E32C9FC8D779B21C1AF = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 48CF0B02E1D06E5DA51E6270,
- 163B0CF2DD0990A63DF1D5A6,
- 7B4163348896EB1B86B15160,
- 8C0AEA08A71075A6C765AEC9,
- 1351A13E78F38741C6075600,
- 527DA2E6827BAFDDD3E8E80F,
- 34A4931AF1DD424D3A400EEF,
- 7F57DB52C3CEFDC26DDD38FC,
- 46071CE2B98B562B7BF27CB1,
- 6A61CBB4E39BFD392D97528F,
- 0B0CE6D5062E5C02A41F24BC,
- 5E4310B3F6BB639875D3E9B8,
- AE7FB2AC3885F4BF53A5DDA1,
- 1FB200F4AE3E4E7CDFF629BB,
- AC783ECD84496E0B77911EEE,
- B1981F62F6A91FD2F579A198,
- ECA44A41DA8A935178C1A1F4,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 291E01DCBE746A376DBFA4D1 = {
- isa = PBXNativeTarget;
- buildConfigurationList = 413FBEAEC84DFEC41133C78B;
- buildPhases = (
- 57134FDD813875865F5B2057,
- ED916866997CA4F40C7C1016,
- 4B1F6E32C9FC8D779B21C1AF,
- );
- buildRules = ( );
- dependencies = ( );
- name = "DemoRunner - App";
- productName = DemoRunner;
- productReference = CFF2BBEB242CC8B3B904B5F9;
- productType = "com.apple.product-type.application";
- };
- AC6F0E9A0809A184B2C2B7DE = {
- isa = PBXProject;
- buildConfigurationList = 80E8AD1971F52B06F4D28891;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 91A9A0FE9DF4F4E10009EEC7;
- projectDirPath = "";
- projectRoot = "";
- targets = (291E01DCBE746A376DBFA4D1);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ D87BAF6D1A7451B7A733B5F1 = {isa = PBXTargetDependency; target = 291E01DCBE746A376DBFA4D1; };
+ 80E8AD1971F52B06F4D28891 = {isa = XCConfigurationList; buildConfigurations = (
+ C01EC82F42B640CA1E54AD53,
+ 07EA85D22270E8EA13CA0BBE, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 413FBEAEC84DFEC41133C78B = {isa = XCConfigurationList; buildConfigurations = (
+ B18D059E5616FA729F764229,
+ 69330F27DD2C71609336C7D2, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 57134FDD813875865F5B2057 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 47ED2C78B05B8A6A00E36C46,
+ 8E63755144E29269FD82C897,
+ 75DB074DBAE04408A0A917B7, ); runOnlyForDeploymentPostprocessing = 0; };
+ ED916866997CA4F40C7C1016 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ E6F58FC3ACAE774DB4D06420,
+ 36E115D98311F12AA06710E6,
+ B38728296BB32B7994CE28DF,
+ 71DF4F5EB4C8305688416725,
+ 4FBBB55F4E347757F74F1F41,
+ F619F3887CEC064441BB6EE6,
+ C2BB2B6DA237FE0CB64C7EDA,
+ F28112945CEBEA4CE8975833,
+ 9EACEA6BE8D0ACC72C12C080,
+ 26652AB1BB77C8A39434775F,
+ 2707968B431D83AC7E28E49B,
+ 712D81867EC698463252FA79,
+ 49E7BBD46981F0035E4E9021,
+ 611298FAC1A543BDD10D4C41,
+ D183F8140174ACCDDCD230A2,
+ FF87532E62753EDFA3D29CAD,
+ 2F76CA28C8C0EFC7453D0EB8,
+ 6B5560283DEEBD6DD2D6C984,
+ 1DBDFEDE359CFC84F8E3DE4C,
+ CDABEA6258EC70C65C9ACCFE,
+ E2F44A968EC2598DAE33A997,
+ 5CB78489F16E82144914972D,
+ BC6036F22423CA0AFF0385A7,
+ AEA090DAC5C747C50C7D3FA7,
+ CDEB6BA5341494AF51D07C72,
+ 0140787C0118A95E37DE90B4, ); runOnlyForDeploymentPostprocessing = 0; };
+ 4B1F6E32C9FC8D779B21C1AF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 48CF0B02E1D06E5DA51E6270,
+ 163B0CF2DD0990A63DF1D5A6,
+ 7B4163348896EB1B86B15160,
+ 8C0AEA08A71075A6C765AEC9,
+ 1351A13E78F38741C6075600,
+ 527DA2E6827BAFDDD3E8E80F,
+ 34A4931AF1DD424D3A400EEF,
+ 7F57DB52C3CEFDC26DDD38FC,
+ 46071CE2B98B562B7BF27CB1,
+ 6A61CBB4E39BFD392D97528F,
+ 0B0CE6D5062E5C02A41F24BC,
+ 5E4310B3F6BB639875D3E9B8,
+ AE7FB2AC3885F4BF53A5DDA1,
+ 1FB200F4AE3E4E7CDFF629BB,
+ AC783ECD84496E0B77911EEE,
+ B1981F62F6A91FD2F579A198,
+ ECA44A41DA8A935178C1A1F4, ); runOnlyForDeploymentPostprocessing = 0; };
+ 291E01DCBE746A376DBFA4D1 = {isa = PBXNativeTarget; buildConfigurationList = 413FBEAEC84DFEC41133C78B; buildPhases = (
+ 57134FDD813875865F5B2057,
+ ED916866997CA4F40C7C1016,
+ 4B1F6E32C9FC8D779B21C1AF, ); buildRules = ( ); dependencies = ( ); name = "DemoRunner - App"; productName = DemoRunner; productReference = CFF2BBEB242CC8B3B904B5F9; productType = "com.apple.product-type.application"; };
+ AC6F0E9A0809A184B2C2B7DE = {isa = PBXProject; buildConfigurationList = 80E8AD1971F52B06F4D28891; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 91A9A0FE9DF4F4E10009EEC7; projectDirPath = ""; projectRoot = ""; targets = (291E01DCBE746A376DBFA4D1); };
};
rootObject = AC6F0E9A0809A184B2C2B7DE;
}
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
<plist>\r
<dict>\r
- <key>NSMicrophoneUsageDescription</key>\r
- <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
- <key>NSCameraUsageDescription</key>\r
- <string>This app requires access to the camera to function correctly.</string>\r
<key>LSRequiresIPhoneOS</key>\r
<true/>\r
+ <key>NSMicrophoneUsageDescription</key>\r
+ <string>This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone.</string>\r
+ <key>NSCameraUsageDescription</key>\r
+ <string>This app requires camera usage to function properly.</string>\r
<key>UIViewControllerBasedStatusBarAppearance</key>\r
<false/>\r
<key>CFBundleExecutable</key>\r
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>CFBundleVersion</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>Copyright (c) 2018 - ROLI Ltd.</string>\r
<key>NSHighResolutionCapable</key>\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
-<JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.4.1" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1"\r
- bundleIdentifier="com.juce.demorunner" version="5.4.1" companyName="ROLI Ltd."\r
+<JUCERPROJECT name="DemoRunner" projectType="guiapp" jucerVersion="5.3.1" defines="JUCE_DEMO_RUNNER=1 JUCE_UNIT_TESTS=1"\r
+ bundleIdentifier="com.juce.demorunner" version="5.3.2" companyName="ROLI Ltd."\r
companyCopyright="Copyright (c) 2018 - ROLI Ltd." companyWebsite="https://www.juce.com/"\r
companyEmail="info@juce.com" id="yj7xMM" reportAppUsage="1">\r
<MAINGROUP id="G8kbr7" name="DemoRunner">\r
</MAINGROUP>\r
<EXPORTFORMATS>\r
<XCODE_MAC targetFolder="Builds/MacOSX" smallIcon="YyqWd2" bigIcon="YyqWd2"\r
- extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
- customXcodeResourceFolders="../Audio ../BLOCKS ../DSP ../GUI ../Utilities"\r
- microphonePermissionNeeded="1" cameraPermissionNeeded="1">\r
+ extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
+ customXcodeResourceFolders="../Audio ../BLOCKS ../DSP ../GUI ../Utilities">\r
<CONFIGURATIONS>\r
<CONFIGURATION isDebug="1" name="Debug"/>\r
<CONFIGURATION isDebug="0" name="Release"/>\r
androidMinimumSDK="23" microphonePermissionNeeded="1" androidBluetoothNeeded="1"\r
androidExternalReadNeeded="1" androidExternalWriteNeeded="1"\r
androidEnableContentSharing="1" androidExtraAssetsFolder="../Assets"\r
- smallIcon="YyqWd2" bigIcon="YyqWd2" cameraPermissionNeeded="1"\r
- extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code">\r
+ smallIcon="YyqWd2" bigIcon="YyqWd2" cameraPermissionNeeded="1">\r
<CONFIGURATIONS>\r
- <CONFIGURATION isDebug="1" name="Debug" androidArchitectures="armeabi-v7a x86"/>\r
+ <CONFIGURATION isDebug="1" name="Debug" androidArchitectures="armeabi x86"/>\r
<CONFIGURATION isDebug="0" name="Release"/>\r
</CONFIGURATIONS>\r
<MODULEPATHS>\r
<MODULEPATH id="juce_analytics" path="../../modules"/>\r
</MODULEPATHS>\r
</VS2015>\r
- <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="YyqWd2" bigIcon="YyqWd2"\r
- extraCompilerFlags="/w44265 /w45038 /w44062">\r
+ <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="YyqWd2" bigIcon="YyqWd2">\r
<CONFIGURATIONS>\r
<CONFIGURATION isDebug="1" name="Debug"/>\r
<CONFIGURATION isDebug="0" name="Release" useRuntimeLibDLL="0"/>\r
useGlobalPath="0"/>\r
<MODULE id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
</MODULES>\r
- <JUCEOPTIONS JUCE_USE_CAMERA="1" JUCE_USE_MP3AUDIOFORMAT="1" JUCE_ALLOW_STATIC_NULL_VARIABLES="0"\r
- JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+ <JUCEOPTIONS JUCE_USE_CAMERA="1" JUCE_USE_MP3AUDIOFORMAT="1"/>\r
<LIVE_SETTINGS>\r
<OSX/>\r
</LIVE_SETTINGS>\r
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
\r
#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES\r
- #define JUCE_ALLOW_STATIC_NULL_VARIABLES 0\r
-#endif\r
-\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define JUCE_STRICT_REFCOUNTEDPOINTER 1\r
+ //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
//==============================================================================\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_USE_CAMERA\r
#define JUCE_USE_CAMERA 1\r
#endif\r
-\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
namespace ProjectInfo\r
{\r
const char* const projectName = "DemoRunner";\r
- const char* const companyName = "ROLI Ltd.";\r
- const char* const versionString = "5.4.1";\r
- const int versionNumber = 0x50401;\r
+ const char* const versionString = "5.3.2";\r
+ const int versionNumber = 0x50302;\r
}\r
#endif\r
#include "../../../GUI/OpenGLDemo2D.h"\r
#endif\r
#include "../../../GUI/PropertiesDemo.h"\r
-#if ! JUCE_LINUX\r
+#if JUCE_MAC || JUCE_WINDOWS\r
#include "../../../GUI/VideoDemo.h"\r
#endif\r
#include "../../../GUI/WebBrowserDemo.h"\r
REGISTER_DEMO_WITH_FILENAME (OpenGLDemoClasses::OpenGLDemo, GUI, OpenGLDemo, true)\r
#endif\r
REGISTER_DEMO (PropertiesDemo, GUI, false)\r
- #if ! JUCE_LINUX\r
+ #if JUCE_MAC || JUCE_WINDOWS\r
REGISTER_DEMO (VideoDemo, GUI, true)\r
#endif\r
REGISTER_DEMO (WebBrowserDemo, GUI, true)\r
{\r
#if JUCE_MAC\r
auto f = File::getSpecialLocation (File::currentExecutableFile)\r
- .getParentDirectory().getParentDirectory().getChildFile ("Resources");\r
+ .getParentDirectory().getParentDirectory().getChildFile ("Resources").getChildFile (filePath);\r
#else\r
auto f = findExamplesDirectoryFromExecutable (File::getSpecialLocation (File::currentApplicationFile));\r
#endif\r
}\r
\r
//==============================================================================\r
+std::unique_ptr<AudioDeviceManager> sharedAudioDeviceManager;\r
+\r
static String getCurrentDefaultAudioDeviceName (AudioDeviceManager& deviceManager, bool isInput)\r
{\r
auto* deviceType = deviceManager.getCurrentDeviceTypeObject();\r
\r
if (sharedAudioDeviceManager->getCurrentAudioDevice() != nullptr)\r
{\r
- auto setup = sharedAudioDeviceManager->getAudioDeviceSetup();\r
+ AudioDeviceManager::AudioDeviceSetup setup;\r
+ sharedAudioDeviceManager->getAudioDeviceSetup (setup);\r
\r
auto numInputs = jmax (numInputChannels, setup.inputChannels.countNumberOfSetBits());\r
auto numOutputs = jmax (numOutputChannels, setup.outputChannels.countNumberOfSetBits());\r
};\r
#endif\r
\r
-std::unique_ptr<AudioDeviceManager> sharedAudioDeviceManager;\r
-\r
//==============================================================================\r
class DemoRunnerApplication : public JUCEApplication\r
{\r
//==============================================================================\r
DemoRunnerApplication() {}\r
\r
- ~DemoRunnerApplication()\r
- {\r
- sharedAudioDeviceManager.reset();\r
- }\r
-\r
const String getApplicationName() override { return ProjectInfo::projectName; }\r
const String getApplicationVersion() override { return ProjectInfo::versionString; }\r
bool moreThanOneInstanceAllowed() override { return true; }\r
MainComponent::~MainComponent()\r
{\r
contentComponent->clearCurrentDemo();\r
+ sharedAudioDeviceManager.reset();\r
}\r
\r
//==============================================================================\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AnimationAppDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AnimationDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: BouncingBallWavetableDemo\r
\r
website: http://juce.com\r
description: Showcases camera features.\r
\r
- dependencies: juce_audio_basics, juce_audio_devices, juce_core, juce_cryptography,\r
- juce_data_structures, juce_events, juce_graphics, juce_gui_basics,\r
- juce_gui_extra, juce_video\r
+ dependencies: juce_core, juce_cryptography, juce_data_structures, juce_events,\r
+ juce_graphics, juce_gui_basics, juce_gui_extra, juce_video\r
exporters: xcode_mac, vs2017, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_USE_CAMERA=1, JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ moduleFlags: JUCE_USE_CAMERA=1\r
\r
type: Component\r
mainClass: CameraDemo\r
{\r
#if JUCE_ANDROID\r
SafePointer<CameraDemo> safeThis (this);\r
- cameraDevice->onErrorOccurred = [safeThis] (const String& cameraError) mutable { if (safeThis) safeThis->errorOccurred (cameraError); };\r
+ cameraDevice->onErrorOccurred = [safeThis] (const String& error) mutable { if (safeThis) safeThis->errorOccurred (error); };\r
#endif\r
cameraPreviewComp.reset (cameraDevice->createViewerComponent());\r
addAndMakeVisible (cameraPreviewComp.get());\r
#if JUCE_ANDROID || JUCE_IOS\r
auto imageFile = File::getSpecialLocation (File::tempDirectory).getNonexistentChildFile ("JuceCameraPhotoDemo", ".jpg");\r
\r
- FileOutputStream stream (imageFile);\r
-\r
- if (stream.openedOk()\r
- && JPEGImageFormat().writeImageToStream (image, stream))\r
+ if (auto stream = std::unique_ptr<OutputStream> (imageFile.createOutputStream()))\r
{\r
- URL url (imageFile);\r
+ if (JPEGImageFormat().writeImageToStream (image, *stream))\r
+ {\r
+ URL url (imageFile);\r
\r
- snapshotButton .setEnabled (false);\r
- recordMovieButton.setEnabled (false);\r
- contentSharingPending = true;\r
+ snapshotButton .setEnabled (false);\r
+ recordMovieButton.setEnabled (false);\r
+ contentSharingPending = true;\r
\r
- SafePointer<CameraDemo> safeThis (this);\r
+ SafePointer<CameraDemo> safeThis (this);\r
\r
- juce::ContentSharer::getInstance()->shareFiles ({url},\r
- [safeThis] (bool success, const String&) mutable\r
- {\r
- if (safeThis)\r
- safeThis->sharingFinished (success, true);\r
- });\r
+ juce::ContentSharer::getInstance()->shareFiles ({url},\r
+ [safeThis] (bool success, const String&) mutable\r
+ {\r
+ if (safeThis)\r
+ safeThis->sharingFinished (success, true);\r
+ });\r
+ }\r
}\r
#endif\r
}\r
\r
dependencies: juce_core, juce_data_structures, juce_events, juce_graphics,\r
juce_gui_basics, juce_gui_extra\r
- exporters: xcode_mac, vs2017, linux_make, xcode_iphone\r
-\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
type: Component\r
mainClass: CodeEditorDemo\r
\r
#include "../Assets/DemoUtilities.h"\r
\r
-#if JUCE_ANDROID\r
- #error "This demo is not supported on Android!"\r
-#endif\r
-\r
//==============================================================================\r
class CodeEditorDemo : public Component,\r
private FilenameComponentListener\r
juce_gui_basics\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: ComponentDemo\r
\r
// Adds the child light components and makes them visible\r
// within this component.\r
// (they currently rely on having a default constructor\r
- // so they don't have to be individually initialised)\r
+ // so they dont have to be individually initialised)\r
for (auto i = 0; i < numX * numY; ++i)\r
addAndMakeVisible (toggleLights[i]);\r
}\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: ComponentTransformsDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: DialogsDemo\r
\r
}\r
\r
setSize (500, 500);\r
-\r
- RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
- [] (bool granted)\r
- {\r
- if (! granted)\r
- {\r
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
- "Permissions warning",\r
- "External storage access permission not granted, some files"\r
- " may be inaccessible.");\r
- }\r
- });\r
}\r
\r
//==============================================================================\r
{\r
AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, "This is an ok/cancel AlertWindow",\r
"And this is the AlertWindow's message. Blah blah blah blah blah blah blah blah blah blah blah blah blah.",\r
- {}, {}, {},\r
- ModalCallbackFunction::forComponent (alertBoxResultChosen, this));\r
+ {}, {}, 0, ModalCallbackFunction::forComponent (alertBoxResultChosen, this));\r
}\r
else if (type == calloutBoxWindow)\r
{\r
fileToSave = fileToSave.getChildFile ("JUCE.png");\r
fileToSave.deleteFile();\r
\r
- FileOutputStream outStream (fileToSave);\r
-\r
- if (outStream.openedOk())\r
- if (auto inStream = std::unique_ptr<InputStream> (createAssetInputStream ("juce_icon.png")))\r
- outStream.writeFromInputStream (*inStream, -1);\r
+ std::unique_ptr<OutputStream> outStream (fileToSave.createOutputStream());\r
+ std::unique_ptr<InputStream> inStream (createAssetInputStream ("juce_icon.png"));\r
+ outStream->writeFromInputStream (*inStream, -1);\r
}\r
\r
fc.reset (new FileChooser ("Choose a file to save...",\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: FlexBoxDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: FontsDemo\r
\r
verticalDividerBar.reset (new StretchableLayoutResizerBar (&verticalLayout, 1, true));\r
addAndMakeVisible (verticalDividerBar.get());\r
\r
- // ..and pick a random font to select initially\r
+ // ..and pick a random font to select intially\r
listBox.selectRow (Random::getSystemRandom().nextInt (fonts.size()));\r
\r
demoTextBox.setMultiLine (true);\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: GraphicsDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: GridDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: HelloWorldDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: ImagesDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: KeyMappingsDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: LookAndFeelDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MDIDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MenusDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MultiTouchDemo\r
\r
juce_gui_basics, juce_gui_extra, juce_opengl\r
exporters: xcode_mac, vs2017, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OpenGLAppDemo\r
\r
{\r
if (position.get() != nullptr)\r
{\r
- glContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), nullptr);\r
+ glContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), 0);\r
glContext.extensions.glEnableVertexAttribArray (position->attributeID);\r
}\r
\r
vertexBuffer->bind();\r
\r
glAttributes.enable (glContext);\r
- glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, nullptr);\r
+ glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, 0);\r
glAttributes.disable (glContext);\r
}\r
}\r
juce_gui_basics, juce_gui_extra, juce_opengl\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OpenGLDemoClasses::OpenGLDemo\r
\r
{\r
if (position.get() != nullptr)\r
{\r
- openGLContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), nullptr);\r
+ openGLContext.extensions.glVertexAttribPointer (position->attributeID, 3, GL_FLOAT, GL_FALSE, sizeof (Vertex), 0);\r
openGLContext.extensions.glEnableVertexAttribArray (position->attributeID);\r
}\r
\r
vertexBuffer->bind();\r
\r
attributes.enable (openGLContext);\r
- glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, nullptr);\r
+ glDrawElements (GL_TRIANGLES, vertexBuffer->numIndices, GL_UNSIGNED_INT, 0);\r
attributes.disable (openGLContext);\r
}\r
}\r
\r
g.setColour (Colours::black);\r
g.setFont (40);\r
-\r
- const MessageManagerLock mml (ThreadPoolJob::getCurrentThreadPoolJob());\r
- if (! mml.lockWasGained())\r
- return false;\r
-\r
g.drawFittedText (String (Time::getCurrentTime().getMilliseconds()), image.getBounds(), Justification::centred, 1);\r
}\r
\r
juce_gui_basics, juce_gui_extra, juce_opengl\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OpenGLDemo2D\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: PropertiesDemo\r
\r
\r
dependencies: juce_core, juce_data_structures, juce_events, juce_graphics,\r
juce_gui_basics, juce_gui_extra, juce_video\r
- exporters: xcode_mac, vs2017, androidstudio, xcode_iphone\r
-\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
+ exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
type: Component\r
mainClass: VideoDemo\r
\r
#include "../Assets/DemoUtilities.h"\r
\r
-#if JUCE_MAC || JUCE_WINDOWS\r
//==============================================================================\r
// so that we can easily have two video windows each with a file browser, wrap this up as a class..\r
class MovieComponentWithFileBrowser : public Component,\r
{\r
public:\r
MovieComponentWithFileBrowser()\r
- : videoComp (true)\r
{\r
addAndMakeVisible (videoComp);\r
\r
\r
void filenameComponentChanged (FilenameComponent*) override\r
{\r
- auto url = URL (fileChooser.getCurrentFile());\r
-\r
// this is called when the user changes the filename in the file chooser box\r
- auto result = videoComp.load (url);\r
- videoLoadingFinished (url, result);\r
- }\r
-\r
- void videoLoadingFinished (const URL& url, Result result)\r
- {\r
- ignoreUnused (url);\r
+ auto result = videoComp.load (fileChooser.getCurrentFile());\r
\r
if (result.wasOk())\r
{\r
}\r
\r
private:\r
- std::unique_ptr<FileChooser> fileChooser;\r
WildcardFileFilter moviesWildcardFilter { "*", "*", "Movies File Filter" };\r
TimeSliceThread directoryThread { "Movie File Scanner Thread" };\r
DirectoryContentsList movieList { &moviesWildcardFilter, directoryThread };\r
void fileDoubleClicked (const File&) override {}\r
void browserRootChanged (const File&) override {}\r
\r
- void selectVideoFile()\r
- {\r
- fileChooser.reset (new FileChooser ("Choose a file to open...", File::getCurrentWorkingDirectory(),\r
- "*", false));\r
-\r
- fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
- [this] (const FileChooser& chooser)\r
- {\r
- String chosen;\r
- auto results = chooser.getURLResults();\r
-\r
- // TODO: support non local files too\r
- if (results.size() > 0)\r
- movieCompLeft.setFile (results[0].getLocalFile());\r
- });\r
- }\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoDemo)\r
};\r
-#elif JUCE_IOS || JUCE_ANDROID\r
-//==============================================================================\r
-class VideoDemo : public Component,\r
- private Timer\r
-{\r
-public:\r
- VideoDemo()\r
- : videoCompWithNativeControls (true),\r
- videoCompNoNativeControls (false)\r
- {\r
- loadLocalButton .onClick = [this] { selectVideoFile(); };\r
- loadUrlButton .onClick = [this] { showVideoUrlPrompt(); };\r
- seekToStartButton.onClick = [this] { seekVideoToStart(); };\r
- playButton .onClick = [this] { playVideo(); };\r
- pauseButton .onClick = [this] { pauseVideo(); };\r
- unloadButton .onClick = [this] { unloadVideoFile(); };\r
-\r
- volumeLabel .setColour (Label::textColourId, Colours::white);\r
- currentPositionLabel.setColour (Label::textColourId, Colours::white);\r
-\r
- volumeLabel .setJustificationType (Justification::right);\r
- currentPositionLabel.setJustificationType (Justification::right);\r
-\r
- volumeSlider .setRange (0.0, 1.0);\r
- positionSlider.setRange (0.0, 1.0);\r
-\r
- volumeSlider .setSliderSnapsToMousePosition (false);\r
- positionSlider.setSliderSnapsToMousePosition (false);\r
-\r
- volumeSlider.setSkewFactor (1.5);\r
- volumeSlider.setValue (1.0, dontSendNotification);\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- curVideoComp->onGlobalMediaVolumeChanged = [this]() { volumeSlider.setValue (curVideoComp->getAudioVolume(), dontSendNotification); };\r
- #endif\r
-\r
- volumeSlider .onValueChange = [this]() { curVideoComp->setAudioVolume ((float) volumeSlider.getValue()); };\r
- positionSlider.onValueChange = [this]() { seekVideoToNormalisedPosition (positionSlider.getValue()); };\r
-\r
- positionSlider.onDragStart = [this]()\r
- {\r
- positionSliderDragging = true;\r
- wasPlayingBeforeDragStart = curVideoComp->isPlaying();\r
-\r
- if (wasPlayingBeforeDragStart)\r
- curVideoComp->stop();\r
- };\r
-\r
- positionSlider.onDragEnd = [this]()\r
- {\r
- if (wasPlayingBeforeDragStart)\r
- curVideoComp->play();\r
-\r
- wasPlayingBeforeDragStart = false;\r
-\r
- // Ensure the slider does not temporarily jump back on consecutive timer callback.\r
- Timer::callAfterDelay (500, [this]() { positionSliderDragging = false; });\r
- };\r
-\r
- playSpeedComboBox.addItem ("25%", 25);\r
- playSpeedComboBox.addItem ("50%", 50);\r
- playSpeedComboBox.addItem ("100%", 100);\r
- playSpeedComboBox.addItem ("200%", 200);\r
- playSpeedComboBox.addItem ("400%", 400);\r
- playSpeedComboBox.setSelectedId (100, dontSendNotification);\r
- playSpeedComboBox.onChange = [this]() { curVideoComp->setPlaySpeed (playSpeedComboBox.getSelectedId() / 100.0); };\r
-\r
- setTransportControlsEnabled (false);\r
-\r
- addAndMakeVisible (loadLocalButton);\r
- addAndMakeVisible (loadUrlButton);\r
- addAndMakeVisible (volumeLabel);\r
- addAndMakeVisible (volumeSlider);\r
- addChildComponent (videoCompWithNativeControls);\r
- addChildComponent (videoCompNoNativeControls);\r
- addAndMakeVisible (positionSlider);\r
- addAndMakeVisible (currentPositionLabel);\r
-\r
- addAndMakeVisible (playSpeedComboBox);\r
- addAndMakeVisible (seekToStartButton);\r
- addAndMakeVisible (playButton);\r
- addAndMakeVisible (unloadButton);\r
- addChildComponent (pauseButton);\r
-\r
- setSize (500, 500);\r
-\r
- RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
- [] (bool granted)\r
- {\r
- if (! granted)\r
- {\r
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
- "Permissions warning",\r
- "External storage access permission not granted, some files"\r
- " may be inaccessible.");\r
- }\r
- });\r
-\r
- setPortraitOrientationEnabled (true);\r
- }\r
-\r
- ~VideoDemo()\r
- {\r
- curVideoComp->onPlaybackStarted = nullptr;\r
- curVideoComp->onPlaybackStopped = nullptr;\r
- curVideoComp->onErrorOccurred = nullptr;\r
- curVideoComp->onGlobalMediaVolumeChanged = nullptr;\r
-\r
- setPortraitOrientationEnabled (false);\r
- }\r
-\r
- void paint (Graphics& g) override\r
- {\r
- g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground));\r
- }\r
-\r
- void resized() override\r
- {\r
- auto area = getLocalBounds();\r
-\r
- int marginSize = 5;\r
- int buttonHeight = 20;\r
-\r
- area.reduce (0, marginSize);\r
-\r
- auto topArea = area.removeFromTop (buttonHeight);\r
- loadLocalButton.setBounds (topArea.removeFromLeft (topArea.getWidth() / 6));\r
- loadUrlButton.setBounds (topArea.removeFromLeft (loadLocalButton.getWidth()));\r
- volumeLabel.setBounds (topArea.removeFromLeft (loadLocalButton.getWidth()));\r
- volumeSlider.setBounds (topArea.reduced (10, 0));\r
-\r
- auto transportArea = area.removeFromBottom (buttonHeight);\r
- auto positionArea = area.removeFromBottom (buttonHeight).reduced (marginSize, 0);\r
-\r
- playSpeedComboBox.setBounds (transportArea.removeFromLeft (jmax (50, transportArea.getWidth() / 5)));\r
-\r
- auto controlWidth = transportArea.getWidth() / 3;\r
-\r
- currentPositionLabel.setBounds (positionArea.removeFromRight (jmax (150, controlWidth)));\r
- positionSlider.setBounds (positionArea);\r
-\r
- seekToStartButton.setBounds (transportArea.removeFromLeft (controlWidth));\r
- playButton .setBounds (transportArea.removeFromLeft (controlWidth));\r
- unloadButton .setBounds (transportArea.removeFromLeft (controlWidth));\r
- pauseButton.setBounds (playButton.getBounds());\r
-\r
- area.removeFromTop (marginSize);\r
- area.removeFromBottom (marginSize);\r
-\r
- videoCompWithNativeControls.setBounds (area);\r
- videoCompNoNativeControls.setBounds (area);\r
-\r
- if (positionSlider.getWidth() > 0)\r
- positionSlider.setMouseDragSensitivity (positionSlider.getWidth());\r
- }\r
-\r
-private:\r
- TextButton loadLocalButton { "Load Local" };\r
- TextButton loadUrlButton { "Load URL" };\r
- Label volumeLabel { "volumeLabel", "Vol:" };\r
- Slider volumeSlider { Slider::LinearHorizontal, Slider::NoTextBox };\r
-\r
- VideoComponent videoCompWithNativeControls;\r
- VideoComponent videoCompNoNativeControls;\r
- #if JUCE_IOS || JUCE_MAC\r
- VideoComponent* curVideoComp = &videoCompWithNativeControls;\r
- #else\r
- VideoComponent* curVideoComp = &videoCompNoNativeControls;\r
- #endif\r
- bool isFirstSetup = true;\r
-\r
- Slider positionSlider { Slider::LinearHorizontal, Slider::NoTextBox };\r
- bool positionSliderDragging = false;\r
- bool wasPlayingBeforeDragStart = false;\r
-\r
- Label currentPositionLabel { "currentPositionLabel", "-:- / -:-" };\r
-\r
- ComboBox playSpeedComboBox { "playSpeedComboBox" };\r
- TextButton seekToStartButton { "|<" };\r
- TextButton playButton { "Play" };\r
- TextButton pauseButton { "Pause" };\r
- TextButton unloadButton { "Unload" };\r
-\r
- std::unique_ptr<FileChooser> fileChooser;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoDemo)\r
- JUCE_DECLARE_WEAK_REFERENCEABLE (VideoDemo)\r
-\r
- //==============================================================================\r
- void setPortraitOrientationEnabled (bool shouldBeEnabled)\r
- {\r
- auto allowedOrientations = Desktop::getInstance().getOrientationsEnabled();\r
-\r
- if (shouldBeEnabled)\r
- allowedOrientations |= Desktop::upright;\r
- else\r
- allowedOrientations &= ~Desktop::upright;\r
-\r
- Desktop::getInstance().setOrientationsEnabled (allowedOrientations);\r
- }\r
-\r
- void setTransportControlsEnabled (bool shouldBeEnabled)\r
- {\r
- positionSlider .setEnabled (shouldBeEnabled);\r
- playSpeedComboBox.setEnabled (shouldBeEnabled);\r
- seekToStartButton.setEnabled (shouldBeEnabled);\r
- playButton .setEnabled (shouldBeEnabled);\r
- unloadButton .setEnabled (shouldBeEnabled);\r
- pauseButton .setEnabled (shouldBeEnabled);\r
- }\r
-\r
- void selectVideoFile()\r
- {\r
- fileChooser.reset (new FileChooser ("Choose a video file to open...", File::getCurrentWorkingDirectory(),\r
- "*", true));\r
-\r
- fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
- [this] (const FileChooser& chooser)\r
- {\r
- auto results = chooser.getURLResults();\r
-\r
- if (results.size() > 0)\r
- loadVideo (results[0]);\r
- });\r
- }\r
-\r
- void loadVideo (const URL& url)\r
- {\r
- unloadVideoFile();\r
-\r
- #if JUCE_IOS || JUCE_MAC\r
- askIfUseNativeControls (url);\r
- #else\r
- loadUrl (url);\r
- setupVideoComp (false);\r
- #endif\r
- }\r
-\r
- void askIfUseNativeControls (const URL& url)\r
- {\r
- auto* aw = new AlertWindow ("Choose viewer type", {}, AlertWindow::NoIcon);\r
-\r
- aw->addButton ("Yes", 1, KeyPress (KeyPress::returnKey));\r
- aw->addButton ("No", 0, KeyPress (KeyPress::escapeKey));\r
- aw->addTextBlock ("Do you want to use the viewer with native controls?");\r
-\r
- auto callback = ModalCallbackFunction::forComponent (videoViewerTypeChosen, this, url);\r
- aw->enterModalState (true, callback, true);\r
- }\r
-\r
- static void videoViewerTypeChosen (int result, VideoDemo* owner, URL url)\r
- {\r
- if (owner != nullptr)\r
- {\r
- owner->setupVideoComp (result != 0);\r
- owner->loadUrl (url);\r
- }\r
- }\r
-\r
- void setupVideoComp (bool useNativeViewerWithNativeControls)\r
- {\r
- auto* oldVideoComp = curVideoComp;\r
-\r
- if (useNativeViewerWithNativeControls)\r
- curVideoComp = &videoCompWithNativeControls;\r
- else\r
- curVideoComp = &videoCompNoNativeControls;\r
-\r
- if (isFirstSetup || oldVideoComp != curVideoComp)\r
- {\r
- oldVideoComp->onPlaybackStarted = nullptr;\r
- oldVideoComp->onPlaybackStopped = nullptr;\r
- oldVideoComp->onErrorOccurred = nullptr;\r
- oldVideoComp->setVisible (false);\r
-\r
- curVideoComp->onPlaybackStarted = [this]() { processPlaybackStarted(); };\r
- curVideoComp->onPlaybackStopped = [this]() { processPlaybackPaused(); };\r
- curVideoComp->onErrorOccurred = [this](const String& errorMessage) { errorOccurred (errorMessage); };\r
- curVideoComp->setVisible (true);\r
-\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- oldVideoComp->onGlobalMediaVolumeChanged = nullptr;\r
- curVideoComp->onGlobalMediaVolumeChanged = [this]() { volumeSlider.setValue (curVideoComp->getAudioVolume(), dontSendNotification); };\r
- #endif\r
- }\r
-\r
- isFirstSetup = false;\r
- }\r
-\r
- void loadUrl (const URL& url)\r
- {\r
- curVideoComp->loadAsync (url, [this] (const URL& u, Result r) { videoLoadingFinished (u, r); });\r
- }\r
-\r
- void showVideoUrlPrompt()\r
- {\r
- auto* aw = new AlertWindow ("Enter URL for video to load", {}, AlertWindow::NoIcon);\r
-\r
- aw->addButton ("OK", 1, KeyPress (KeyPress::returnKey));\r
- aw->addButton ("Cancel", 0, KeyPress (KeyPress::escapeKey));\r
- aw->addTextEditor ("videoUrlTextEditor", "https://www.rmp-streaming.com/media/bbb-360p.mp4");\r
-\r
- auto callback = ModalCallbackFunction::forComponent (videoUrlPromptClosed, this, Component::SafePointer<AlertWindow> (aw));\r
- aw->enterModalState (true, callback, true);\r
- }\r
-\r
- static void videoUrlPromptClosed (int result, VideoDemo* owner, Component::SafePointer<AlertWindow> aw)\r
- {\r
- if (result != 0 && owner != nullptr && aw != nullptr)\r
- {\r
- auto url = aw->getTextEditorContents ("videoUrlTextEditor");\r
-\r
- if (url.isNotEmpty())\r
- owner->loadVideo (url);\r
- }\r
- }\r
-\r
- void videoLoadingFinished (const URL& url, Result result)\r
- {\r
- ignoreUnused (url);\r
-\r
- if (result.wasOk())\r
- {\r
- resized(); // update to reflect the video's aspect ratio\r
-\r
- setTransportControlsEnabled (true);\r
-\r
- currentPositionLabel.setText (getPositionString (0.0, curVideoComp->getVideoDuration()), sendNotification);\r
- positionSlider.setValue (0.0, dontSendNotification);\r
- playSpeedComboBox.setSelectedId (100, dontSendNotification);\r
- }\r
- else\r
- {\r
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
- "Couldn't load the file!",\r
- result.getErrorMessage());\r
- }\r
- }\r
-\r
- static String getPositionString (double playPositionSeconds, double durationSeconds)\r
- {\r
- auto positionMs = static_cast<int> (1000 * playPositionSeconds);\r
- int posMinutes = positionMs / 60000;\r
- int posSeconds = (positionMs % 60000) / 1000;\r
- int posMillis = positionMs % 1000;\r
-\r
- auto totalMs = static_cast<int> (1000 * durationSeconds);\r
- int totMinutes = totalMs / 60000;\r
- int totSeconds = (totalMs % 60000) / 1000;\r
- int totMillis = totalMs % 1000;\r
-\r
- return String::formatted ("%02d:%02d:%03d / %02d:%02d:%03d",\r
- posMinutes, posSeconds, posMillis,\r
- totMinutes, totSeconds, totMillis);\r
- }\r
-\r
- void updatePositionSliderAndLabel()\r
- {\r
- auto position = curVideoComp->getPlayPosition();\r
- auto duration = curVideoComp->getVideoDuration();\r
-\r
- currentPositionLabel.setText (getPositionString (position, duration), sendNotification);\r
-\r
- if (! positionSliderDragging)\r
- positionSlider.setValue (duration != 0 ? (position / duration) : 0.0, dontSendNotification);\r
- }\r
-\r
- void seekVideoToStart()\r
- {\r
- seekVideoToNormalisedPosition (0.0);\r
- }\r
-\r
- void seekVideoToNormalisedPosition (double normalisedPos)\r
- {\r
- normalisedPos = jlimit (0.0, 1.0, normalisedPos);\r
-\r
- auto duration = curVideoComp->getVideoDuration();\r
- auto newPos = jlimit (0.0, duration, duration * normalisedPos);\r
-\r
- curVideoComp->setPlayPosition (newPos);\r
- currentPositionLabel.setText (getPositionString (newPos, curVideoComp->getVideoDuration()), sendNotification);\r
- positionSlider.setValue (normalisedPos, dontSendNotification);\r
- }\r
-\r
- void playVideo()\r
- {\r
- curVideoComp->play();\r
- }\r
-\r
- void processPlaybackStarted()\r
- {\r
- playButton.setVisible (false);\r
- pauseButton.setVisible (true);\r
-\r
- startTimer (20);\r
- }\r
-\r
- void pauseVideo()\r
- {\r
- curVideoComp->stop();\r
- }\r
-\r
- void processPlaybackPaused()\r
- {\r
- // On seeking to a new pos, the playback may be temporarily paused.\r
- if (positionSliderDragging)\r
- return;\r
-\r
- pauseButton.setVisible (false);\r
- playButton.setVisible (true);\r
- }\r
-\r
- void errorOccurred (const String& errorMessage)\r
- {\r
- AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon,\r
- "An error has occurred",\r
- errorMessage + ", video will be unloaded.");\r
-\r
- unloadVideoFile();\r
- }\r
-\r
- void unloadVideoFile()\r
- {\r
- curVideoComp->closeVideo();\r
-\r
- setTransportControlsEnabled (false);\r
- stopTimer();\r
-\r
- pauseButton.setVisible (false);\r
- playButton.setVisible (true);\r
-\r
- currentPositionLabel.setText ("-:- / -:-", sendNotification);\r
- positionSlider.setValue (0.0, dontSendNotification);\r
- }\r
-\r
- void timerCallback() override\r
- {\r
- updatePositionSliderAndLabel();\r
- }\r
-};\r
-#elif JUCE_LINUX\r
- #error "This demo is not supported on Linux!"\r
-#endif\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: WebBrowserDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: WidgetsDemo\r
\r
over.setStrokeThickness (4.0f);\r
\r
auto* db = addToList (new DrawableButton (String (i + 5) + " points", DrawableButton::ImageAboveTextLabel));\r
- db->setImages (&normal, &over, nullptr);\r
+ db->setImages (&normal, &over, 0);\r
db->setClickingTogglesState (true);\r
db->setRadioGroupId (23456);\r
\r
{\r
// create an image-on-button-shape button from the same drawables..\r
auto db = addToList (new DrawableButton ("Button 3", DrawableButton::ImageOnButtonBackground));\r
- db->setImages (&normal, nullptr, nullptr);\r
+ db->setImages (&normal, 0, 0);\r
db->setBounds (260, 160, 110, 25);\r
db->setTooltip ("This is a DrawableButton on a standard button background");\r
db->onClick = popupMessageCallback;\r
{\r
auto* drawable = new DrawableImage();\r
drawable->setImage (getImageFromAssets ("juce_icon.png"));\r
- return new ToolbarButton (itemId, "juce!", drawable, nullptr);\r
+ return new ToolbarButton (itemId, "juce!", drawable, 0);\r
}\r
case customComboBox: return new CustomToolbarComboBox (itemId);\r
default: break;\r
}\r
\r
auto* image = iconsFromZipFile[iconNames.indexOf (filename)]->createCopy();\r
- return new ToolbarButton (itemId, text, image, nullptr);\r
+ return new ToolbarButton (itemId, text, image, 0);\r
}\r
\r
// Demonstrates how to put a custom component into a toolbar - this one contains\r
// this loads the embedded database XML file into memory\r
void loadData()\r
{\r
- demoData = parseXML (loadEntireAssetIntoString ("demo table data.xml"));\r
+ demoData.reset (XmlDocument::parse (loadEntireAssetIntoString ("demo table data.xml")));\r
\r
dataList = demoData->getChildByName ("DATA");\r
columnList = demoData->getChildByName ("COLUMNS");\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: WindowsDemo\r
\r
void mouseDrag (const MouseEvent& e) override\r
{\r
// as there's no titlebar we have to manage the dragging ourselves\r
- dragger.dragComponent (this, e, nullptr);\r
+ dragger.dragComponent (this, e, 0);\r
}\r
\r
void paint (Graphics& g) override\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: AUv3SynthProcessor\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: Arpeggiator\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: JuceDemoPluginAudioProcessor\r
\r
public:\r
//==============================================================================\r
JuceDemoPluginAudioProcessor()\r
- : AudioProcessor (getBusesProperties()),\r
- state (*this, nullptr, "state",\r
- { std::make_unique<AudioParameterFloat> ("gain", "Gain", NormalisableRange<float> (0.0f, 1.0f), 0.9f),\r
- std::make_unique<AudioParameterFloat> ("delay", "Delay Feedback", NormalisableRange<float> (0.0f, 1.0f), 0.5f) })\r
+ : AudioProcessor (getBusesProperties())\r
{\r
lastPosInfo.resetToDefault();\r
\r
- // Add a sub-tree to store the state of our UI\r
- state.state.addChild ({ "uiState", { { "width", 400 }, { "height", 200 } }, {} }, -1, nullptr);\r
+ // This creates our parameters. We'll keep some raw pointers to them in this class,\r
+ // so that we can easily access them later, but the base class will take care of\r
+ // deleting them for us.\r
+ addParameter (gainParam = new AudioParameterFloat ("gain", "Gain", 0.0f, 1.0f, 0.9f));\r
+ addParameter (delayParam = new AudioParameterFloat ("delay", "Delay Feedback", 0.0f, 1.0f, 0.5f));\r
\r
initialiseSynth();\r
}\r
//==============================================================================\r
void getStateInformation (MemoryBlock& destData) override\r
{\r
- // Store an xml representation of our state.\r
- std::unique_ptr<XmlElement> xmlState (state.copyState().createXml());\r
+ // You should use this method to store your parameters in the memory block.\r
+ // Here's an example of how you can use XML to make it easy and more robust:\r
\r
- if (xmlState.get() != nullptr)\r
- copyXmlToBinary (*xmlState, destData);\r
+ // Create an outer XML element..\r
+ XmlElement xml ("MYPLUGINSETTINGS");\r
+\r
+ // add some attributes to it..\r
+ xml.setAttribute ("uiWidth", lastUIWidth);\r
+ xml.setAttribute ("uiHeight", lastUIHeight);\r
+\r
+ // Store the values of all our parameters, using their param ID as the XML attribute\r
+ for (auto* param : getParameters())\r
+ if (auto* p = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
+ xml.setAttribute (p->paramID, p->getValue());\r
+\r
+ // then use this helper function to stuff it into the binary blob and return it..\r
+ copyXmlToBinary (xml, destData);\r
}\r
\r
void setStateInformation (const void* data, int sizeInBytes) override\r
{\r
- // Restore our plug-in's state from the xml representation stored in the above\r
- // method.\r
+ // You should use this method to restore your parameters from this memory block,\r
+ // whose contents will have been created by the getStateInformation() call.\r
+\r
+ // This getXmlFromBinary() helper function retrieves our XML from the binary blob..\r
std::unique_ptr<XmlElement> xmlState (getXmlFromBinary (data, sizeInBytes));\r
\r
if (xmlState.get() != nullptr)\r
- state.replaceState (ValueTree::fromXml (*xmlState));\r
+ {\r
+ // make sure that it's actually our type of XML object..\r
+ if (xmlState->hasTagName ("MYPLUGINSETTINGS"))\r
+ {\r
+ // ok, now pull out our last window size..\r
+ lastUIWidth = jmax (xmlState->getIntAttribute ("uiWidth", lastUIWidth), 400);\r
+ lastUIHeight = jmax (xmlState->getIntAttribute ("uiHeight", lastUIHeight), 200);\r
+\r
+ // Now reload our parameters..\r
+ for (auto* param : getParameters())\r
+ if (auto* p = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
+ p->setValue ((float) xmlState->getDoubleAttribute (p->paramID, p->getValue()));\r
+ }\r
+ }\r
}\r
\r
//==============================================================================\r
// callback - the UI component will read this and display it.\r
AudioPlayHead::CurrentPositionInfo lastPosInfo;\r
\r
- // Our plug-in's current state\r
- AudioProcessorValueTreeState state;\r
+ // these are used to persist the UI's size - the values are stored along with the\r
+ // filter's other parameters, and the UI component will update them when it gets\r
+ // resized.\r
+ int lastUIWidth = 400, lastUIHeight = 200;\r
+\r
+ // Our parameters\r
+ AudioParameterFloat* gainParam = nullptr;\r
+ AudioParameterFloat* delayParam = nullptr;\r
\r
// Current track colour and name\r
TrackProperties trackProperties;\r
//==============================================================================\r
/** This is the editor component that our filter will display. */\r
class JuceDemoPluginAudioProcessorEditor : public AudioProcessorEditor,\r
- private Timer,\r
- private Value::Listener\r
+ private Timer\r
{\r
public:\r
JuceDemoPluginAudioProcessorEditor (JuceDemoPluginAudioProcessor& owner)\r
: AudioProcessorEditor (owner),\r
- midiKeyboard (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard),\r
- gainAttachment (owner.state, "gain", gainSlider),\r
- delayAttachment (owner.state, "delay", delaySlider)\r
+ midiKeyboard (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard)\r
{\r
// add some sliders..\r
- addAndMakeVisible (gainSlider);\r
- gainSlider.setSliderStyle (Slider::Rotary);\r
+ gainSlider.reset (new ParameterSlider (*owner.gainParam));\r
+ addAndMakeVisible (gainSlider.get());\r
+ gainSlider->setSliderStyle (Slider::Rotary);\r
\r
- addAndMakeVisible (delaySlider);\r
- delaySlider.setSliderStyle (Slider::Rotary);\r
+ delaySlider.reset (new ParameterSlider (*owner.delayParam));\r
+ addAndMakeVisible (delaySlider.get());\r
+ delaySlider->setSliderStyle (Slider::Rotary);\r
\r
// add some labels for the sliders..\r
- gainLabel.attachToComponent (&gainSlider, false);\r
+ gainLabel.attachToComponent (gainSlider.get(), false);\r
gainLabel.setFont (Font (11.0f));\r
\r
- delayLabel.attachToComponent (&delaySlider, false);\r
+ delayLabel.attachToComponent (delaySlider.get(), false);\r
delayLabel.setFont (Font (11.0f));\r
\r
// add the midi keyboard component..\r
// set resize limits for this plug-in\r
setResizeLimits (400, 200, 1024, 700);\r
\r
- lastUIWidth .referTo (owner.state.state.getChildWithName ("uiState").getPropertyAsValue ("width", nullptr));\r
- lastUIHeight.referTo (owner.state.state.getChildWithName ("uiState").getPropertyAsValue ("height", nullptr));\r
-\r
// set our component's initial size to be the last one that was stored in the filter's settings\r
- setSize (lastUIWidth.getValue(), lastUIHeight.getValue());\r
-\r
- lastUIWidth. addListener (this);\r
- lastUIHeight.addListener (this);\r
+ setSize (owner.lastUIWidth,\r
+ owner.lastUIHeight);\r
\r
updateTrackProperties();\r
\r
\r
r.removeFromTop (20);\r
auto sliderArea = r.removeFromTop (60);\r
- gainSlider.setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth() / 2)));\r
- delaySlider.setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth())));\r
+ gainSlider->setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth() / 2)));\r
+ delaySlider->setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth())));\r
\r
- lastUIWidth = getWidth();\r
- lastUIHeight = getHeight();\r
+ getProcessor().lastUIWidth = getWidth();\r
+ getProcessor().lastUIHeight = getHeight();\r
}\r
\r
void timerCallback() override\r
midiKeyboard.setVisible (! controllerIsAvailable);\r
}\r
\r
- int getControlParameterIndex (Component& control) override\r
- {\r
- if (&control == &gainSlider)\r
- return 0;\r
-\r
- if (&control == &delaySlider)\r
- return 1;\r
-\r
- return -1;\r
- }\r
-\r
void updateTrackProperties()\r
{\r
auto trackColour = getProcessor().trackProperties.colour;\r
}\r
\r
private:\r
+ //==============================================================================\r
+ // This is a handy slider subclass that controls an AudioProcessorParameter\r
+ // (may move this class into the library itself at some point in the future..)\r
+ class ParameterSlider : public Slider,\r
+ private Timer\r
+ {\r
+ public:\r
+ ParameterSlider (AudioProcessorParameter& p)\r
+ : Slider (p.getName (256)), param (p)\r
+ {\r
+ setRange (0.0, 1.0, 0.0);\r
+ startTimerHz (30);\r
+ updateSliderPos();\r
+ }\r
+\r
+ void valueChanged() override { param.setValueNotifyingHost ((float) Slider::getValue()); }\r
+\r
+ void timerCallback() override { updateSliderPos(); }\r
+\r
+ void startedDragging() override { param.beginChangeGesture(); }\r
+ void stoppedDragging() override { param.endChangeGesture(); }\r
+\r
+ double getValueFromText (const String& text) override { return param.getValueForText (text); }\r
+ String getTextFromValue (double value) override { return param.getText ((float) value, 1024); }\r
+\r
+ void updateSliderPos()\r
+ {\r
+ auto newValue = param.getValue();\r
+\r
+ if (newValue != (float) Slider::getValue() && ! isMouseButtonDown())\r
+ Slider::setValue (newValue, NotificationType::dontSendNotification);\r
+ }\r
+\r
+ AudioProcessorParameter& param;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterSlider)\r
+ };\r
+\r
MidiKeyboardComponent midiKeyboard;\r
\r
Label timecodeDisplayLabel,\r
gainLabel { {}, "Throughput level:" },\r
delayLabel { {}, "Delay:" };\r
\r
- Slider gainSlider, delaySlider;\r
- AudioProcessorValueTreeState::SliderAttachment gainAttachment, delayAttachment;\r
+ std::unique_ptr<ParameterSlider> gainSlider, delaySlider;\r
Colour backgroundColour;\r
\r
- // these are used to persist the UI's size - the values are stored along with the\r
- // filter's other parameters, and the UI component will update them when it gets\r
- // resized.\r
- Value lastUIWidth, lastUIHeight;\r
-\r
//==============================================================================\r
JuceDemoPluginAudioProcessor& getProcessor() const\r
{\r
\r
timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification);\r
}\r
-\r
- // called when the stored window size changes\r
- void valueChanged (Value&) override\r
- {\r
- setSize (lastUIWidth.getValue(), lastUIHeight.getValue());\r
- }\r
};\r
\r
//==============================================================================\r
template <typename FloatType>\r
void process (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages, AudioBuffer<FloatType>& delayBuffer)\r
{\r
- auto gainParamValue = state.getParameter ("gain") ->getValue();\r
- auto delayParamValue = state.getParameter ("delay")->getValue();\r
auto numSamples = buffer.getNumSamples();\r
\r
// In case we have more outputs than inputs, we'll clear any output\r
synth.renderNextBlock (buffer, midiMessages, 0, numSamples);\r
\r
// Apply our delay effect to the new output..\r
- applyDelay (buffer, delayBuffer, delayParamValue);\r
+ applyDelay (buffer, delayBuffer);\r
\r
- // Apply our gain change to the outgoing data..\r
- applyGain (buffer, delayBuffer, gainParamValue);\r
+ applyGain (buffer, delayBuffer); // apply our gain-change to the outgoing data..\r
\r
// Now ask the host for the current time so we can store it to be displayed later...\r
updateCurrentTimeInfoFromHost();\r
}\r
\r
template <typename FloatType>\r
- void applyGain (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer, float gainLevel)\r
+ void applyGain (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer)\r
{\r
ignoreUnused (delayBuffer);\r
+ auto gainLevel = gainParam->get();\r
\r
for (auto channel = 0; channel < getTotalNumOutputChannels(); ++channel)\r
buffer.applyGain (channel, 0, buffer.getNumSamples(), gainLevel);\r
}\r
\r
template <typename FloatType>\r
- void applyDelay (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer, float delayLevel)\r
+ void applyDelay (AudioBuffer<FloatType>& buffer, AudioBuffer<FloatType>& delayBuffer)\r
{\r
auto numSamples = buffer.getNumSamples();\r
+ auto delayLevel = delayParam->get();\r
\r
auto delayPos = 0;\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: DspModulePluginDemoAudioProcessor\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: GainProcessor\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: IAAEffectProcessor\r
\r
: AudioProcessor (BusesProperties()\r
.withInput ("Input", AudioChannelSet::stereo(), true)\r
.withOutput ("Output", AudioChannelSet::stereo(), true)),\r
- parameters (*this, nullptr, "InterAppAudioEffect",\r
- { std::make_unique<AudioParameterFloat> ("gain", "Gain", NormalisableRange<float> (0.0f, 1.0f), 1.0f / 3.14f) })\r
+ parameters (*this, nullptr)\r
{\r
+ parameters.createAndAddParameter ("gain",\r
+ "Gain",\r
+ {},\r
+ NormalisableRange<float> (0.0f, 1.0f),\r
+ (float) (1.0 / 3.14),\r
+ nullptr,\r
+ nullptr);\r
+\r
+ parameters.state = ValueTree (Identifier ("InterAppAudioEffect"));\r
}\r
\r
~IAAEffectProcessor() {}\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: MultiOutSynth\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: NoiseGate\r
\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: SamplerAudioProcessor\r
\r
source.read (&data, 0, length + 4, 0, true, true);\r
}\r
\r
- double getSampleRate() const { return sourceSampleRate; }\r
- int getLength() const { return length; }\r
- const AudioBuffer<float>& getBuffer() const { return data; }\r
+ double getSampleRate() const { return sourceSampleRate; }\r
+\r
+ int getLength() const { return length; }\r
+\r
+ const AudioSampleBuffer& getBuffer() const { return data; }\r
\r
private:\r
double sourceSampleRate;\r
int length;\r
- AudioBuffer<float> data;\r
+ AudioSampleBuffer data;\r
};\r
\r
//==============================================================================\r
juce_events, juce_graphics, juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: AudioProcessor\r
mainClass: SurroundProcessor\r
\r
juce_graphics, juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, xcode_iphone, androidstudio\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: AnalyticsCollectionDemo\r
\r
juce_graphics, juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: Box2DDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Console\r
mainClass: ChildProcessDemo\r
\r
juce_graphics, juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: CryptographyDemo\r
\r
juce_product_unlocking\r
exporters: xcode_mac, xcode_iphone, androidstudio\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: InAppPurchasesDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: JavaScriptDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: LiveConstantDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: MultithreadingDemo\r
\r
parentWidth = 50.0f, parentHeight = 50.0f;\r
\r
Colour colour;\r
- Thread::ThreadID threadId = {};\r
+ Thread::ThreadID threadId = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BouncingBallComp)\r
};\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: NetworkingDemo\r
\r
StringPairArray responseHeaders;\r
int statusCode = 0;\r
\r
- if (auto stream = std::unique_ptr<InputStream> (url.createInputStream (false, nullptr, nullptr, {},\r
- 10000, // timeout in millisecs\r
- &responseHeaders, &statusCode)))\r
- {\r
+ std::unique_ptr<InputStream> stream (url.createInputStream (false, nullptr, nullptr, {},\r
+ 10000, // timeout in millisecs\r
+ &responseHeaders, &statusCode));\r
+ if (stream.get() != nullptr)\r
return (statusCode != 0 ? "Status code: " + String (statusCode) + newLine : String())\r
+ "Response headers: " + newLine\r
+ responseHeaders.getDescription() + newLine\r
+ "----------------------------------------------------" + newLine\r
+ stream->readEntireStreamAsString();\r
- }\r
\r
if (statusCode != 0)\r
return "Failed to connect, status code = " + String (statusCode);\r
juce_gui_basics, juce_osc\r
exporters: xcode_mac, vs2017, linux_make\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: OSCDemo\r
\r
{\r
AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
"Unknown error",\r
- "An unknown error occurred while trying to disconnect from UDP port.",\r
+ "An unknown error occured while trying to disconnect from UDP port.",\r
"OK");\r
}\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, xcode_iphone, androidstudio\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: PushNotificationsDemo\r
\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: SystemInfoDemo\r
\r
//==============================================================================\r
static String getMacAddressList()\r
{\r
- String addressList;\r
+ Array<MACAddress> macAddresses;\r
+ MACAddress::findAllAddresses (macAddresses);\r
\r
- for (auto& addr : MACAddress::getAllAddresses())\r
+ String addressList;\r
+ for (auto& addr : macAddresses)\r
addressList << addr.toString() << newLine;\r
\r
return addressList;\r
\r
static String getIPAddressList()\r
{\r
+ Array<IPAddress> addresses;\r
+ IPAddress::findAllAddresses (addresses);\r
+\r
String addressList;\r
\r
- for (auto& addr : IPAddress::getAllAddresses())\r
+ for (auto& addr : addresses)\r
addressList << " " << addr.toString() << newLine;\r
\r
return addressList;\r
systemInfo\r
<< "Number of logical CPUs: " << SystemStats::getNumCpus() << newLine\r
<< "Number of physical CPUs: " << SystemStats::getNumPhysicalCpus() << newLine\r
- << "Memory size: " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine\r
- << "CPU vendor: " << SystemStats::getCpuVendor() << newLine\r
- << "CPU model: " << SystemStats::getCpuModel() << newLine\r
- << "CPU speed: " << SystemStats::getCpuSpeedInMegahertz() << " MHz" << newLine\r
- << "CPU has MMX: " << (SystemStats::hasMMX() ? "yes" : "no") << newLine\r
- << "CPU has SSE: " << (SystemStats::hasSSE() ? "yes" : "no") << newLine\r
- << "CPU has SSE2: " << (SystemStats::hasSSE2() ? "yes" : "no") << newLine\r
- << "CPU has SSE3: " << (SystemStats::hasSSE3() ? "yes" : "no") << newLine\r
- << "CPU has SSSE3: " << (SystemStats::hasSSSE3() ? "yes" : "no") << newLine\r
- << "CPU has SSE4.1: " << (SystemStats::hasSSE41() ? "yes" : "no") << newLine\r
- << "CPU has SSE4.2: " << (SystemStats::hasSSE42() ? "yes" : "no") << newLine\r
- << "CPU has 3DNOW: " << (SystemStats::has3DNow() ? "yes" : "no") << newLine\r
- << "CPU has AVX: " << (SystemStats::hasAVX() ? "yes" : "no") << newLine\r
- << "CPU has AVX2: " << (SystemStats::hasAVX2() ? "yes" : "no") << newLine\r
- << "CPU has AVX512F: " << (SystemStats::hasAVX512F() ? "yes" : "no") << newLine\r
- << "CPU has AVX512BW: " << (SystemStats::hasAVX512BW() ? "yes" : "no") << newLine\r
- << "CPU has AVX512CD: " << (SystemStats::hasAVX512CD() ? "yes" : "no") << newLine\r
- << "CPU has AVX512DQ: " << (SystemStats::hasAVX512DQ() ? "yes" : "no") << newLine\r
- << "CPU has AVX512ER: " << (SystemStats::hasAVX512ER() ? "yes" : "no") << newLine\r
- << "CPU has AVX512IFMA: " << (SystemStats::hasAVX512IFMA() ? "yes" : "no") << newLine\r
- << "CPU has AVX512PF: " << (SystemStats::hasAVX512PF() ? "yes" : "no") << newLine\r
- << "CPU has AVX512VBMI: " << (SystemStats::hasAVX512VBMI() ? "yes" : "no") << newLine\r
- << "CPU has AVX512VL: " << (SystemStats::hasAVX512VL() ? "yes" : "no") << newLine\r
- << "CPU has AVX512VPOPCNTDQ: " << (SystemStats::hasAVX512VPOPCNTDQ() ? "yes" : "no") << newLine\r
- << "CPU has Neon: " << (SystemStats::hasNeon() ? "yes" : "no") << newLine\r
+ << "Memory size: " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine\r
+ << "CPU vendor: " << SystemStats::getCpuVendor() << newLine\r
+ << "CPU model: " << SystemStats::getCpuModel() << newLine\r
+ << "CPU speed: " << SystemStats::getCpuSpeedInMegaherz() << " MHz" << newLine\r
+ << "CPU has MMX: " << (SystemStats::hasMMX() ? "yes" : "no") << newLine\r
+ << "CPU has SSE: " << (SystemStats::hasSSE() ? "yes" : "no") << newLine\r
+ << "CPU has SSE2: " << (SystemStats::hasSSE2() ? "yes" : "no") << newLine\r
+ << "CPU has SSE3: " << (SystemStats::hasSSE3() ? "yes" : "no") << newLine\r
+ << "CPU has SSSE3: " << (SystemStats::hasSSSE3() ? "yes" : "no") << newLine\r
+ << "CPU has SSE4.1: " << (SystemStats::hasSSE41() ? "yes" : "no") << newLine\r
+ << "CPU has SSE4.2: " << (SystemStats::hasSSE42() ? "yes" : "no") << newLine\r
+ << "CPU has 3DNOW: " << (SystemStats::has3DNow() ? "yes" : "no") << newLine\r
+ << "CPU has AVX: " << (SystemStats::hasAVX() ? "yes" : "no") << newLine\r
+ << "CPU has AVX2: " << (SystemStats::hasAVX2() ? "yes" : "no") << newLine\r
+ << "CPU has Neon: " << (SystemStats::hasNeon() ? "yes" : "no") << newLine\r
<< newLine;\r
\r
systemInfo\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: TimersAndEventsDemo\r
\r
juce_opengl, juce_osc, juce_product_unlocking, juce_video\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
defines: JUCE_UNIT_TESTS=1\r
\r
type: Component\r
juce_gui_basics\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: ValueTreesDemo\r
\r
juce_gui_basics, juce_gui_extra\r
exporters: xcode_mac, vs2017, linux_make, androidstudio, xcode_iphone\r
\r
- moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1\r
-\r
type: Component\r
mainClass: XMLandJSONDemo\r
\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="AKfc5m" name="AudioPerformanceTest" projectType="guiapp"\r
- bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.4.1"\r
+ bundleIdentifier="com.juce.AudioPerformanceTest" jucerVersion="5.3.1"\r
displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
companyCopyright="ROLI Ltd.">\r
<MAINGROUP id="b1eVTe" name="AudioPerformanceTest">\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+ "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
- "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
"../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
"../../../../../modules/juce_core/containers/juce_Array.h"\r
"../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
"../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
- "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
- "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
"../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
"../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
"../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
"../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
"../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
- "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_Memory.h"\r
"../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
"../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
"../../../../../modules/juce_core/memory/juce_Singleton.h"\r
"../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
"../../../../../modules/juce_core/misc/juce_Result.cpp"\r
"../../../../../modules/juce_core/misc/juce_Result.h"\r
"../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
"../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
"../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
"../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
- "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
"../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
"../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
"../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
"../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
"../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
"../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
- "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
"../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
\r
android {\r
compileSdkVersion 23\r
- buildToolsVersion "28.0.0"\r
+ buildToolsVersion "27.0.3"\r
externalNativeBuild {\r
cmake {\r
path "CMakeLists.txt"\r
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
package="com.juce.audioperformancetest">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+ <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
import android.content.pm.PackageInfo;\r
import android.content.pm.PackageManager;\r
import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
import android.net.http.SslError;\r
import android.net.Uri;\r
import android.os.Bundle;\r
//==============================================================================\r
public boolean isPermissionDeclaredInManifest (int permissionID)\r
{\r
- return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
- }\r
+ String permissionToCheck = getAndroidPermissionName(permissionID);\r
\r
- public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
- {\r
try\r
{\r
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
public final String getClipboardContent()\r
{\r
ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
- CharSequence content = clipboard.getText();\r
- return content != null ? content.toString() : new String();\r
+ return clipboard.getText().toString();\r
}\r
\r
public final void setClipboardContent (String newText)\r
implements SurfaceHolder.Callback\r
{\r
private long nativeContext = 0;\r
- private boolean forVideo;\r
\r
- NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+ NativeSurfaceView (Context context, long nativeContextPtr)\r
{\r
super (context);\r
nativeContext = nativeContextPtr;\r
- forVideo = createdForVideo;\r
}\r
\r
public Surface getNativeSurface()\r
@Override\r
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
{\r
- if (forVideo)\r
- surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
- else\r
- surfaceChangedNative (nativeContext, holder, format, width, height);\r
+ surfaceChangedNative (nativeContext, holder, format, width, height);\r
}\r
\r
@Override\r
public void surfaceCreated (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceCreatedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceCreatedNative (nativeContext, holder);\r
+ surfaceCreatedNative (nativeContext, holder);\r
}\r
\r
@Override\r
public void surfaceDestroyed (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceDestroyedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceDestroyedNative (nativeContext, holder);\r
+ surfaceDestroyedNative (nativeContext, holder);\r
}\r
\r
@Override\r
protected void dispatchDraw (Canvas canvas)\r
{\r
super.dispatchDraw (canvas);\r
-\r
- if (forVideo)\r
- dispatchDrawNativeVideo (nativeContext, canvas);\r
- else\r
- dispatchDrawNative (nativeContext, canvas);\r
+ dispatchDrawNative (nativeContext, canvas);\r
}\r
\r
//==============================================================================\r
@Override\r
- protected void onAttachedToWindow()\r
+ protected void onAttachedToWindow ()\r
{\r
super.onAttachedToWindow();\r
getHolder().addCallback (this);\r
}\r
\r
@Override\r
- protected void onDetachedFromWindow()\r
+ protected void onDetachedFromWindow ()\r
{\r
super.onDetachedFromWindow();\r
getHolder().removeCallback (this);\r
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
int format, int width, int height);\r
-\r
- private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
- private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
- int format, int width, int height);\r
}\r
\r
- public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
{\r
- return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+ return new NativeSurfaceView (this, nativeSurfacePtr);\r
}\r
\r
//==============================================================================\r
}\r
\r
\r
- //==============================================================================\r
- public class MediaControllerCallback extends MediaController.Callback\r
- {\r
- private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);\r
- private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);\r
- private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
- private native void mediaControllerSessionDestroyed (long host);\r
-\r
- MediaControllerCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
- {\r
- mediaControllerAudioInfoChanged (host, info);\r
- }\r
-\r
- @Override\r
- public void onMetadataChanged (MediaMetadata metadata)\r
- {\r
- mediaControllerMetadataChanged (host, metadata);\r
- }\r
-\r
- @Override\r
- public void onPlaybackStateChanged (PlaybackState state)\r
- {\r
- mediaControllerPlaybackStateChanged (host, state);\r
- }\r
-\r
- @Override\r
- public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
- @Override\r
- public void onSessionDestroyed()\r
- {\r
- mediaControllerSessionDestroyed (host);\r
- }\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class MediaSessionCallback extends MediaSession.Callback\r
- {\r
- private native void mediaSessionPause (long host);\r
- private native void mediaSessionPlay (long host);\r
- private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
- private native void mediaSessionSeekTo (long host, long pos);\r
- private native void mediaSessionStop (long host);\r
-\r
-\r
- MediaSessionCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onPause()\r
- {\r
- mediaSessionPause (host);\r
- }\r
-\r
- @Override\r
- public void onPlay()\r
- {\r
- mediaSessionPlay (host);\r
- }\r
-\r
- @Override\r
- public void onPlayFromMediaId (String mediaId, Bundle extras)\r
- {\r
- mediaSessionPlayFromMediaId (host, mediaId, extras);\r
- }\r
-\r
- @Override\r
- public void onSeekTo (long pos)\r
- {\r
- mediaSessionSeekTo (host, pos);\r
- }\r
-\r
- @Override\r
- public void onStop()\r
- {\r
- mediaSessionStop (host);\r
- }\r
-\r
- @Override\r
- public void onFastForward() {}\r
-\r
- @Override\r
- public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
- {\r
- return true;\r
- }\r
-\r
- @Override\r
- public void onRewind() {}\r
-\r
- @Override\r
- public void onSkipToNext() {}\r
-\r
- @Override\r
- public void onSkipToPrevious() {}\r
-\r
- @Override\r
- public void onSkipToQueueItem (long id) {}\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class SystemVolumeObserver extends ContentObserver\r
- {\r
- private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
- SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
- {\r
- super (null);\r
-\r
- activity = activityToUse;\r
- host = hostToUse;\r
- }\r
-\r
- void setEnabled (boolean shouldBeEnabled)\r
- {\r
- if (shouldBeEnabled)\r
- activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
- else\r
- activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
- }\r
-\r
- @Override\r
- public void onChange (boolean selfChange, Uri uri)\r
- {\r
- if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
- mediaSessionSystemVolumeChanged (host);\r
- }\r
-\r
- private Activity activity;\r
- private long host;\r
- }\r
-\r
-\r
//==============================================================================\r
public static final String getLocaleValue (boolean isRegion)\r
{\r
jcenter()\r
}\r
dependencies {\r
- classpath 'com.android.tools.build:gradle:3.1.3'\r
+ classpath 'com.android.tools.build:gradle:3.1.1'\r
}\r
}\r
\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := AudioPerformanceTest\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := AudioPerformanceTest\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \\r
$(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
@echo Linking "AudioPerformanceTest - App"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_gui_extra.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
clean:\r
@echo Cleaning AudioPerformanceTest\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- E1282ABB96DD2E7FA7F63559 = {
- isa = PBXBuildFile;
- fileRef = 614F2084407B35D62101F69F;
- };
- 8A0F71A4EEC7FE694352DD94 = {
- isa = PBXBuildFile;
- fileRef = 9EADBF913B7A454B6BE93A4A;
- };
- 30BE30F31D1AAED9FC893AA5 = {
- isa = PBXBuildFile;
- fileRef = 18C1CCE5684F9FA0478F27AD;
- };
- 9B19A6655FCC8086134C8656 = {
- isa = PBXBuildFile;
- fileRef = 1DA5C6A474916745AFEC6DA5;
- };
- 0319B40AD2FD96007FFA928B = {
- isa = PBXBuildFile;
- fileRef = 453777CEB7099A5D61901D13;
- };
- 5AFD011031C266431687C922 = {
- isa = PBXBuildFile;
- fileRef = 9F28F179EF6B90EB9F4DBEE9;
- };
- 5923A711C0020F2CDD598714 = {
- isa = PBXBuildFile;
- fileRef = 12C680C68A15B9A590264B18;
- };
- 3825E8984D8F6AA00DDC6BAC = {
- isa = PBXBuildFile;
- fileRef = EE758AD71415EB31BD3E82F3;
- };
- 9031C69145EE085B60904363 = {
- isa = PBXBuildFile;
- fileRef = 43775DC3D9F7917846EA5327;
- };
- F8099BB77DC0D01DCCC6AFB9 = {
- isa = PBXBuildFile;
- fileRef = 0A58FDDF6FB9253F51939A52;
- };
- 537E779F6008999191B2920A = {
- isa = PBXBuildFile;
- fileRef = 3058871156B921B9E5946C4F;
- };
- DA21A6E7A18555DCFC63B07C = {
- isa = PBXBuildFile;
- fileRef = FAAB4EAE4A57B642D3B9EC23;
- };
- 07451DA87757F9EF80E31BE8 = {
- isa = PBXBuildFile;
- fileRef = 0564535EEA7E4462926EA0C9;
- };
- 2BAED5B831BB736E77A718AE = {
- isa = PBXBuildFile;
- fileRef = 89B3243200BAA6BD72905DBB;
- };
- 01C9BC9A0A0F54B693CDA31A = {
- isa = PBXBuildFile;
- fileRef = 322D3066DCD98A8D0542236A;
- };
- 48ADBEF873A610909D727C97 = {
- isa = PBXBuildFile;
- fileRef = 9E05B63699A307598B66F829;
- };
- D145903EE5DBFD1BD98423F3 = {
- isa = PBXBuildFile;
- fileRef = 18E39207A0F5F9B8BC7EE94F;
- };
- C7B090C29D8DE4D2503204B1 = {
- isa = PBXBuildFile;
- fileRef = BAFDA8DE51E7A69E477439EB;
- };
- FFAF94080FF4A9995B33151E = {
- isa = PBXBuildFile;
- fileRef = 24425FFB0BCC7E54CADAA013;
- };
- D2CECF93178A1738DA02CA4A = {
- isa = PBXBuildFile;
- fileRef = EDD11E2CC0B18196ADA0C87B;
- };
- 7E870C094BAE67D7EB149F1C = {
- isa = PBXBuildFile;
- fileRef = 248FAA119A4FC24C522165EF;
- };
- 65FC2E13B65977FED63BDDE3 = {
- isa = PBXBuildFile;
- fileRef = 7E951216B6138C76653B1460;
- };
- 699954AF666E644C7B688381 = {
- isa = PBXBuildFile;
- fileRef = 0BC3C6A4F4FC1DD30DD8E17C;
- };
- 9D47995A33BBA693ED435B31 = {
- isa = PBXBuildFile;
- fileRef = B06AE97C86D27E7FEBCB4631;
- };
- 0564535EEA7E4462926EA0C9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 0A58FDDF6FB9253F51939A52 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 0BC3C6A4F4FC1DD30DD8E17C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 12C680C68A15B9A590264B18 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 18C1CCE5684F9FA0478F27AD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 18E39207A0F5F9B8BC7EE94F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 1DA5C6A474916745AFEC6DA5 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- 24425FFB0BCC7E54CADAA013 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 248FAA119A4FC24C522165EF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 253CCF9514FE705169600047 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 26FE7BE182FBB9E7228A082D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 3058871156B921B9E5946C4F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- 322D3066DCD98A8D0542236A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 429C7CD0E88FC64E9A72514D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainComponent.h;
- path = ../../Source/MainComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 43775DC3D9F7917846EA5327 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- 453777CEB7099A5D61901D13 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- 50FEDCEF881CC99174035167 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 614F2084407B35D62101F69F = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = AudioPerformanceTest.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 77AA9722BAADD4108205501A = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- 7E951216B6138C76653B1460 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 81017699F857F5BBFCA6E055 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 89B3243200BAA6BD72905DBB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 920FF34D4A00A5AD433EE5F4 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 9516A19EE58DED8326DD0306 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 9E05B63699A307598B66F829 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 9EADBF913B7A454B6BE93A4A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 9F28F179EF6B90EB9F4DBEE9 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- A3B86BB7483BC5697B58E417 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- A65BB8D452A2A4859FA41F8B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- AD134CACB71BED6A22743C18 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- B06AE97C86D27E7FEBCB4631 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- BAFDA8DE51E7A69E477439EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- C8EE61FDD1F06817A014B881 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- CBBC98B7CD350A07F5145FB4 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- D03C9A859FB4DBA8268D7FBA = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- E575FE2AD2F19FA6AEB536C2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- EDD11E2CC0B18196ADA0C87B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- EE758AD71415EB31BD3E82F3 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- FAAB4EAE4A57B642D3B9EC23 = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 9F54D12C977843F8FEFCF041 = {
- isa = PBXGroup;
- children = (
- 0564535EEA7E4462926EA0C9,
- 429C7CD0E88FC64E9A72514D,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 4E2981EC48DBFD725AD8E626 = {
- isa = PBXGroup;
- children = (
- 9F54D12C977843F8FEFCF041,
- );
- name = AudioPerformanceTest;
- sourceTree = "<group>";
- };
- 90489A23F0DBAD5F1550CE20 = {
- isa = PBXGroup;
- children = (
- 920FF34D4A00A5AD433EE5F4,
- A3B86BB7483BC5697B58E417,
- 253CCF9514FE705169600047,
- D03C9A859FB4DBA8268D7FBA,
- CBBC98B7CD350A07F5145FB4,
- E575FE2AD2F19FA6AEB536C2,
- 77AA9722BAADD4108205501A,
- 81017699F857F5BBFCA6E055,
- C8EE61FDD1F06817A014B881,
- 50FEDCEF881CC99174035167,
- AD134CACB71BED6A22743C18,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 0B8996A5E2671A4628476CFB = {
- isa = PBXGroup;
- children = (
- A65BB8D452A2A4859FA41F8B,
- 89B3243200BAA6BD72905DBB,
- 322D3066DCD98A8D0542236A,
- 9E05B63699A307598B66F829,
- 18E39207A0F5F9B8BC7EE94F,
- BAFDA8DE51E7A69E477439EB,
- 24425FFB0BCC7E54CADAA013,
- EDD11E2CC0B18196ADA0C87B,
- 248FAA119A4FC24C522165EF,
- 7E951216B6138C76653B1460,
- 0BC3C6A4F4FC1DD30DD8E17C,
- B06AE97C86D27E7FEBCB4631,
- 26FE7BE182FBB9E7228A082D,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- ED3C55ACC14D6DE2BC3B8A1D = {
- isa = PBXGroup;
- children = (
- 9516A19EE58DED8326DD0306,
- FAAB4EAE4A57B642D3B9EC23,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 02A7F817D49F2BC1D70F4242 = {
- isa = PBXGroup;
- children = (
- 9EADBF913B7A454B6BE93A4A,
- 18C1CCE5684F9FA0478F27AD,
- 1DA5C6A474916745AFEC6DA5,
- 453777CEB7099A5D61901D13,
- 9F28F179EF6B90EB9F4DBEE9,
- 12C680C68A15B9A590264B18,
- EE758AD71415EB31BD3E82F3,
- 43775DC3D9F7917846EA5327,
- 0A58FDDF6FB9253F51939A52,
- 3058871156B921B9E5946C4F,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 1DFEAF972822E305E013CC06 = {
- isa = PBXGroup;
- children = (
- 614F2084407B35D62101F69F,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 3BA1BA0CAFE969E99950C06B = {
- isa = PBXGroup;
- children = (
- 4E2981EC48DBFD725AD8E626,
- 90489A23F0DBAD5F1550CE20,
- 0B8996A5E2671A4628476CFB,
- ED3C55ACC14D6DE2BC3B8A1D,
- 02A7F817D49F2BC1D70F4242,
- 1DFEAF972822E305E013CC06,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 19B7C16D592FB25D09022191 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ E1282ABB96DD2E7FA7F63559 = {isa = PBXBuildFile; fileRef = 614F2084407B35D62101F69F; };
+ 8A0F71A4EEC7FE694352DD94 = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; };
+ 30BE30F31D1AAED9FC893AA5 = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; };
+ 9B19A6655FCC8086134C8656 = {isa = PBXBuildFile; fileRef = 1DA5C6A474916745AFEC6DA5; };
+ 0319B40AD2FD96007FFA928B = {isa = PBXBuildFile; fileRef = 453777CEB7099A5D61901D13; };
+ 5AFD011031C266431687C922 = {isa = PBXBuildFile; fileRef = 9F28F179EF6B90EB9F4DBEE9; };
+ 5923A711C0020F2CDD598714 = {isa = PBXBuildFile; fileRef = 12C680C68A15B9A590264B18; };
+ 3825E8984D8F6AA00DDC6BAC = {isa = PBXBuildFile; fileRef = EE758AD71415EB31BD3E82F3; };
+ 9031C69145EE085B60904363 = {isa = PBXBuildFile; fileRef = 43775DC3D9F7917846EA5327; };
+ F8099BB77DC0D01DCCC6AFB9 = {isa = PBXBuildFile; fileRef = 0A58FDDF6FB9253F51939A52; };
+ 537E779F6008999191B2920A = {isa = PBXBuildFile; fileRef = 3058871156B921B9E5946C4F; };
+ DA21A6E7A18555DCFC63B07C = {isa = PBXBuildFile; fileRef = FAAB4EAE4A57B642D3B9EC23; };
+ 07451DA87757F9EF80E31BE8 = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; };
+ 2BAED5B831BB736E77A718AE = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; };
+ 01C9BC9A0A0F54B693CDA31A = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; };
+ 48ADBEF873A610909D727C97 = {isa = PBXBuildFile; fileRef = 9E05B63699A307598B66F829; };
+ D145903EE5DBFD1BD98423F3 = {isa = PBXBuildFile; fileRef = 18E39207A0F5F9B8BC7EE94F; };
+ C7B090C29D8DE4D2503204B1 = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; };
+ FFAF94080FF4A9995B33151E = {isa = PBXBuildFile; fileRef = 24425FFB0BCC7E54CADAA013; };
+ D2CECF93178A1738DA02CA4A = {isa = PBXBuildFile; fileRef = EDD11E2CC0B18196ADA0C87B; };
+ 7E870C094BAE67D7EB149F1C = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; };
+ 65FC2E13B65977FED63BDDE3 = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; };
+ 699954AF666E644C7B688381 = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; };
+ 9D47995A33BBA693ED435B31 = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; };
+ 0564535EEA7E4462926EA0C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 0A58FDDF6FB9253F51939A52 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 0BC3C6A4F4FC1DD30DD8E17C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 12C680C68A15B9A590264B18 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 18C1CCE5684F9FA0478F27AD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 18E39207A0F5F9B8BC7EE94F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ 1DA5C6A474916745AFEC6DA5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ 24425FFB0BCC7E54CADAA013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 248FAA119A4FC24C522165EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 253CCF9514FE705169600047 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 26FE7BE182FBB9E7228A082D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 3058871156B921B9E5946C4F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ 322D3066DCD98A8D0542236A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 429C7CD0E88FC64E9A72514D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 43775DC3D9F7917846EA5327 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 453777CEB7099A5D61901D13 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 50FEDCEF881CC99174035167 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 614F2084407B35D62101F69F = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPerformanceTest.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 77AA9722BAADD4108205501A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ 7E951216B6138C76653B1460 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 81017699F857F5BBFCA6E055 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 89B3243200BAA6BD72905DBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 920FF34D4A00A5AD433EE5F4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 9516A19EE58DED8326DD0306 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 9E05B63699A307598B66F829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ 9EADBF913B7A454B6BE93A4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 9F28F179EF6B90EB9F4DBEE9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ A3B86BB7483BC5697B58E417 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ A65BB8D452A2A4859FA41F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ AD134CACB71BED6A22743C18 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ B06AE97C86D27E7FEBCB4631 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ BAFDA8DE51E7A69E477439EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ C8EE61FDD1F06817A014B881 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ CBBC98B7CD350A07F5145FB4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ D03C9A859FB4DBA8268D7FBA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ E575FE2AD2F19FA6AEB536C2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ EDD11E2CC0B18196ADA0C87B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ EE758AD71415EB31BD3E82F3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ FAAB4EAE4A57B642D3B9EC23 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 9F54D12C977843F8FEFCF041 = {isa = PBXGroup; children = (
+ 0564535EEA7E4462926EA0C9,
+ 429C7CD0E88FC64E9A72514D, ); name = Source; sourceTree = "<group>"; };
+ 4E2981EC48DBFD725AD8E626 = {isa = PBXGroup; children = (
+ 9F54D12C977843F8FEFCF041, ); name = AudioPerformanceTest; sourceTree = "<group>"; };
+ 90489A23F0DBAD5F1550CE20 = {isa = PBXGroup; children = (
+ 920FF34D4A00A5AD433EE5F4,
+ A3B86BB7483BC5697B58E417,
+ 253CCF9514FE705169600047,
+ D03C9A859FB4DBA8268D7FBA,
+ CBBC98B7CD350A07F5145FB4,
+ E575FE2AD2F19FA6AEB536C2,
+ 77AA9722BAADD4108205501A,
+ 81017699F857F5BBFCA6E055,
+ C8EE61FDD1F06817A014B881,
+ 50FEDCEF881CC99174035167,
+ AD134CACB71BED6A22743C18, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 0B8996A5E2671A4628476CFB = {isa = PBXGroup; children = (
+ A65BB8D452A2A4859FA41F8B,
+ 89B3243200BAA6BD72905DBB,
+ 322D3066DCD98A8D0542236A,
+ 9E05B63699A307598B66F829,
+ 18E39207A0F5F9B8BC7EE94F,
+ BAFDA8DE51E7A69E477439EB,
+ 24425FFB0BCC7E54CADAA013,
+ EDD11E2CC0B18196ADA0C87B,
+ 248FAA119A4FC24C522165EF,
+ 7E951216B6138C76653B1460,
+ 0BC3C6A4F4FC1DD30DD8E17C,
+ B06AE97C86D27E7FEBCB4631,
+ 26FE7BE182FBB9E7228A082D, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ ED3C55ACC14D6DE2BC3B8A1D = {isa = PBXGroup; children = (
+ 9516A19EE58DED8326DD0306,
+ FAAB4EAE4A57B642D3B9EC23, ); name = Resources; sourceTree = "<group>"; };
+ 02A7F817D49F2BC1D70F4242 = {isa = PBXGroup; children = (
+ 9EADBF913B7A454B6BE93A4A,
+ 18C1CCE5684F9FA0478F27AD,
+ 1DA5C6A474916745AFEC6DA5,
+ 453777CEB7099A5D61901D13,
+ 9F28F179EF6B90EB9F4DBEE9,
+ 12C680C68A15B9A590264B18,
+ EE758AD71415EB31BD3E82F3,
+ 43775DC3D9F7917846EA5327,
+ 0A58FDDF6FB9253F51939A52,
+ 3058871156B921B9E5946C4F, ); name = Frameworks; sourceTree = "<group>"; };
+ 1DFEAF972822E305E013CC06 = {isa = PBXGroup; children = (
+ 614F2084407B35D62101F69F, ); name = Products; sourceTree = "<group>"; };
+ 3BA1BA0CAFE969E99950C06B = {isa = PBXGroup; children = (
+ 4E2981EC48DBFD725AD8E626,
+ 90489A23F0DBAD5F1550CE20,
+ 0B8996A5E2671A4628476CFB,
+ ED3C55ACC14D6DE2BC3B8A1D,
+ 02A7F817D49F2BC1D70F4242,
+ 1DFEAF972822E305E013CC06, ); name = Source; sourceTree = "<group>"; };
+ 19B7C16D592FB25D09022191 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
- PRODUCT_NAME = "AudioPerformanceTest";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- B7A6988E30C0A68B01EDC53B = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ B7A6988E30C0A68B01EDC53B = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
- PRODUCT_NAME = "AudioPerformanceTest";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- B907CDF95622107F20CD7617 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ B907CDF95622107F20CD7617 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "AudioPerformanceTest";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- BF82CBDF63CC37CADC61A511 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ BF82CBDF63CC37CADC61A511 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "AudioPerformanceTest";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- AA3837ADCB1CEB3B0E2D20B3 = {
- isa = PBXTargetDependency;
- target = E9FD2656EC625C9C8DE30219;
- };
- 7097CF6AC086DAC346ACCCD9 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B907CDF95622107F20CD7617,
- BF82CBDF63CC37CADC61A511,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 674C2AF5989C06689C6065FC = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 19B7C16D592FB25D09022191,
- B7A6988E30C0A68B01EDC53B,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C86DD529EC94922C2AB61742 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DA21A6E7A18555DCFC63B07C,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6C2BE2DE2ECC96615ED827AB = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 07451DA87757F9EF80E31BE8,
- 2BAED5B831BB736E77A718AE,
- 01C9BC9A0A0F54B693CDA31A,
- 48ADBEF873A610909D727C97,
- D145903EE5DBFD1BD98423F3,
- C7B090C29D8DE4D2503204B1,
- FFAF94080FF4A9995B33151E,
- D2CECF93178A1738DA02CA4A,
- 7E870C094BAE67D7EB149F1C,
- 65FC2E13B65977FED63BDDE3,
- 699954AF666E644C7B688381,
- 9D47995A33BBA693ED435B31,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 409D569C572B6EF7F4F1702D = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8A0F71A4EEC7FE694352DD94,
- 30BE30F31D1AAED9FC893AA5,
- 9B19A6655FCC8086134C8656,
- 0319B40AD2FD96007FFA928B,
- 5AFD011031C266431687C922,
- 5923A711C0020F2CDD598714,
- 3825E8984D8F6AA00DDC6BAC,
- 9031C69145EE085B60904363,
- F8099BB77DC0D01DCCC6AFB9,
- 537E779F6008999191B2920A,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E9FD2656EC625C9C8DE30219 = {
- isa = PBXNativeTarget;
- buildConfigurationList = 674C2AF5989C06689C6065FC;
- buildPhases = (
- C86DD529EC94922C2AB61742,
- 6C2BE2DE2ECC96615ED827AB,
- 409D569C572B6EF7F4F1702D,
- );
- buildRules = ( );
- dependencies = ( );
- name = "AudioPerformanceTest - App";
- productName = AudioPerformanceTest;
- productReference = 614F2084407B35D62101F69F;
- productType = "com.apple.product-type.application";
- };
- 9CE2A44801B5B4BE7A9667DA = {
- isa = PBXProject;
- buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 3BA1BA0CAFE969E99950C06B;
- projectDirPath = "";
- projectRoot = "";
- targets = (E9FD2656EC625C9C8DE30219);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ AA3837ADCB1CEB3B0E2D20B3 = {isa = PBXTargetDependency; target = E9FD2656EC625C9C8DE30219; };
+ 7097CF6AC086DAC346ACCCD9 = {isa = XCConfigurationList; buildConfigurations = (
+ B907CDF95622107F20CD7617,
+ BF82CBDF63CC37CADC61A511, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 674C2AF5989C06689C6065FC = {isa = XCConfigurationList; buildConfigurations = (
+ 19B7C16D592FB25D09022191,
+ B7A6988E30C0A68B01EDC53B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ C86DD529EC94922C2AB61742 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ DA21A6E7A18555DCFC63B07C, ); runOnlyForDeploymentPostprocessing = 0; };
+ 6C2BE2DE2ECC96615ED827AB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 07451DA87757F9EF80E31BE8,
+ 2BAED5B831BB736E77A718AE,
+ 01C9BC9A0A0F54B693CDA31A,
+ 48ADBEF873A610909D727C97,
+ D145903EE5DBFD1BD98423F3,
+ C7B090C29D8DE4D2503204B1,
+ FFAF94080FF4A9995B33151E,
+ D2CECF93178A1738DA02CA4A,
+ 7E870C094BAE67D7EB149F1C,
+ 65FC2E13B65977FED63BDDE3,
+ 699954AF666E644C7B688381,
+ 9D47995A33BBA693ED435B31, ); runOnlyForDeploymentPostprocessing = 0; };
+ 409D569C572B6EF7F4F1702D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 8A0F71A4EEC7FE694352DD94,
+ 30BE30F31D1AAED9FC893AA5,
+ 9B19A6655FCC8086134C8656,
+ 0319B40AD2FD96007FFA928B,
+ 5AFD011031C266431687C922,
+ 5923A711C0020F2CDD598714,
+ 3825E8984D8F6AA00DDC6BAC,
+ 9031C69145EE085B60904363,
+ F8099BB77DC0D01DCCC6AFB9,
+ 537E779F6008999191B2920A, ); runOnlyForDeploymentPostprocessing = 0; };
+ E9FD2656EC625C9C8DE30219 = {isa = PBXNativeTarget; buildConfigurationList = 674C2AF5989C06689C6065FC; buildPhases = (
+ C86DD529EC94922C2AB61742,
+ 6C2BE2DE2ECC96615ED827AB,
+ 409D569C572B6EF7F4F1702D, ); buildRules = ( ); dependencies = ( ); name = "AudioPerformanceTest - App"; productName = AudioPerformanceTest; productReference = 614F2084407B35D62101F69F; productType = "com.apple.product-type.application"; };
+ 9CE2A44801B5B4BE7A9667DA = {isa = PBXProject; buildConfigurationList = 7097CF6AC086DAC346ACCCD9; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3BA1BA0CAFE969E99950C06B; projectDirPath = ""; projectRoot = ""; targets = (E9FD2656EC625C9C8DE30219); };
};
rootObject = 9CE2A44801B5B4BE7A9667DA;
}
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{78607AE9-F43B-3DDB-0FE1-D745771AF527}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPerformanceTest</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ItemGroup>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
</ItemGroup>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
};
objectVersion = 46;
objects = {
- E1282ABB96DD2E7FA7F63559 = {
- isa = PBXBuildFile;
- fileRef = 614F2084407B35D62101F69F;
- };
- 8A0F71A4EEC7FE694352DD94 = {
- isa = PBXBuildFile;
- fileRef = 9EADBF913B7A454B6BE93A4A;
- };
- 30BE30F31D1AAED9FC893AA5 = {
- isa = PBXBuildFile;
- fileRef = 18C1CCE5684F9FA0478F27AD;
- };
- E74C8479F0E10EC28E1E2DE1 = {
- isa = PBXBuildFile;
- fileRef = C6030BFC7A19A5075AB0EC28;
- };
- 5AFD011031C266431687C922 = {
- isa = PBXBuildFile;
- fileRef = 9F28F179EF6B90EB9F4DBEE9;
- };
- 71863EE98034AB7C3CBCAA81 = {
- isa = PBXBuildFile;
- fileRef = 24D90B40648CC05A9B1AA55B;
- };
- BF3ECEF0623C9B67C4CEAAF2 = {
- isa = PBXBuildFile;
- fileRef = 6B887CEE009353C410AB4F63;
- };
- 893A86EF99F57B81286E58A1 = {
- isa = PBXBuildFile;
- fileRef = F40C1815F7E7E4FBAF3A3091;
- };
- 5923A711C0020F2CDD598714 = {
- isa = PBXBuildFile;
- fileRef = 12C680C68A15B9A590264B18;
- };
- F749F6DA494103257C9874CC = {
- isa = PBXBuildFile;
- fileRef = 6406C6755E61B1DC93071FF0;
- };
- CC782AABFA20787BABBCED90 = {
- isa = PBXBuildFile;
- fileRef = E1BB9D521BF6C055F5B88628;
- };
- FA27764C3CB8C061B1B787CC = {
- isa = PBXBuildFile;
- fileRef = 418405DCE48C1B4926143469;
- };
- F8099BB77DC0D01DCCC6AFB9 = {
- isa = PBXBuildFile;
- fileRef = 0A58FDDF6FB9253F51939A52;
- };
- AA0C9E035BB509F01A09310B = {
- isa = PBXBuildFile;
- fileRef = 60795BF638A7024B62C0DF09;
- };
- A783F6E198806332E7FB9744 = {
- isa = PBXBuildFile;
- fileRef = 8693552B5FA53C2003A66302;
- };
- 07451DA87757F9EF80E31BE8 = {
- isa = PBXBuildFile;
- fileRef = 0564535EEA7E4462926EA0C9;
- };
- 2BAED5B831BB736E77A718AE = {
- isa = PBXBuildFile;
- fileRef = 89B3243200BAA6BD72905DBB;
- };
- 01C9BC9A0A0F54B693CDA31A = {
- isa = PBXBuildFile;
- fileRef = 322D3066DCD98A8D0542236A;
- };
- 48ADBEF873A610909D727C97 = {
- isa = PBXBuildFile;
- fileRef = 9E05B63699A307598B66F829;
- };
- D145903EE5DBFD1BD98423F3 = {
- isa = PBXBuildFile;
- fileRef = 18E39207A0F5F9B8BC7EE94F;
- };
- C7B090C29D8DE4D2503204B1 = {
- isa = PBXBuildFile;
- fileRef = BAFDA8DE51E7A69E477439EB;
- };
- FFAF94080FF4A9995B33151E = {
- isa = PBXBuildFile;
- fileRef = 24425FFB0BCC7E54CADAA013;
- };
- D2CECF93178A1738DA02CA4A = {
- isa = PBXBuildFile;
- fileRef = EDD11E2CC0B18196ADA0C87B;
- };
- 7E870C094BAE67D7EB149F1C = {
- isa = PBXBuildFile;
- fileRef = 248FAA119A4FC24C522165EF;
- };
- 65FC2E13B65977FED63BDDE3 = {
- isa = PBXBuildFile;
- fileRef = 7E951216B6138C76653B1460;
- };
- 699954AF666E644C7B688381 = {
- isa = PBXBuildFile;
- fileRef = 0BC3C6A4F4FC1DD30DD8E17C;
- };
- 9D47995A33BBA693ED435B31 = {
- isa = PBXBuildFile;
- fileRef = B06AE97C86D27E7FEBCB4631;
- };
- 0564535EEA7E4462926EA0C9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 0A58FDDF6FB9253F51939A52 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 0BC3C6A4F4FC1DD30DD8E17C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 12C680C68A15B9A590264B18 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 18C1CCE5684F9FA0478F27AD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 18E39207A0F5F9B8BC7EE94F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 24425FFB0BCC7E54CADAA013 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 248FAA119A4FC24C522165EF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 24D90B40648CC05A9B1AA55B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- 253CCF9514FE705169600047 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 26FE7BE182FBB9E7228A082D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 322D3066DCD98A8D0542236A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 418405DCE48C1B4926143469 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = MobileCoreServices.framework;
- path = System/Library/Frameworks/MobileCoreServices.framework;
- sourceTree = SDKROOT;
- };
- 429C7CD0E88FC64E9A72514D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainComponent.h;
- path = ../../Source/MainComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 50FEDCEF881CC99174035167 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 60795BF638A7024B62C0DF09 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = UIKit.framework;
- path = System/Library/Frameworks/UIKit.framework;
- sourceTree = SDKROOT;
- };
- 614F2084407B35D62101F69F = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = AudioPerformanceTest.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 6406C6755E61B1DC93071FF0 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreText.framework;
- path = System/Library/Frameworks/CoreText.framework;
- sourceTree = SDKROOT;
- };
- 6B887CEE009353C410AB4F63 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreGraphics.framework;
- path = System/Library/Frameworks/CoreGraphics.framework;
- sourceTree = SDKROOT;
- };
- 77AA9722BAADD4108205501A = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- 7E951216B6138C76653B1460 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 81017699F857F5BBFCA6E055 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 8693552B5FA53C2003A66302 = {
- isa = PBXFileReference;
- lastKnownFileType = folder.assetcatalog;
- name = Images.xcassets;
- path = AudioPerformanceTest/Images.xcassets;
- sourceTree = "SOURCE_ROOT";
- };
- 89B3243200BAA6BD72905DBB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 920FF34D4A00A5AD433EE5F4 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 9516A19EE58DED8326DD0306 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 9E05B63699A307598B66F829 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 9EADBF913B7A454B6BE93A4A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 9F28F179EF6B90EB9F4DBEE9 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- A3B86BB7483BC5697B58E417 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- A65BB8D452A2A4859FA41F8B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- AD134CACB71BED6A22743C18 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- B06AE97C86D27E7FEBCB4631 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- BAFDA8DE51E7A69E477439EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- C6030BFC7A19A5075AB0EC28 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- C8EE61FDD1F06817A014B881 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- CBBC98B7CD350A07F5145FB4 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- D03C9A859FB4DBA8268D7FBA = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- E1BB9D521BF6C055F5B88628 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Foundation.framework;
- path = System/Library/Frameworks/Foundation.framework;
- sourceTree = SDKROOT;
- };
- E575FE2AD2F19FA6AEB536C2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- EDD11E2CC0B18196ADA0C87B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- F40C1815F7E7E4FBAF3A3091 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreImage.framework;
- path = System/Library/Frameworks/CoreImage.framework;
- sourceTree = SDKROOT;
- };
- 9F54D12C977843F8FEFCF041 = {
- isa = PBXGroup;
- children = (
- 0564535EEA7E4462926EA0C9,
- 429C7CD0E88FC64E9A72514D,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 4E2981EC48DBFD725AD8E626 = {
- isa = PBXGroup;
- children = (
- 9F54D12C977843F8FEFCF041,
- );
- name = AudioPerformanceTest;
- sourceTree = "<group>";
- };
- 90489A23F0DBAD5F1550CE20 = {
- isa = PBXGroup;
- children = (
- 920FF34D4A00A5AD433EE5F4,
- A3B86BB7483BC5697B58E417,
- 253CCF9514FE705169600047,
- D03C9A859FB4DBA8268D7FBA,
- CBBC98B7CD350A07F5145FB4,
- E575FE2AD2F19FA6AEB536C2,
- 77AA9722BAADD4108205501A,
- 81017699F857F5BBFCA6E055,
- C8EE61FDD1F06817A014B881,
- 50FEDCEF881CC99174035167,
- AD134CACB71BED6A22743C18,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 0B8996A5E2671A4628476CFB = {
- isa = PBXGroup;
- children = (
- A65BB8D452A2A4859FA41F8B,
- 89B3243200BAA6BD72905DBB,
- 322D3066DCD98A8D0542236A,
- 9E05B63699A307598B66F829,
- 18E39207A0F5F9B8BC7EE94F,
- BAFDA8DE51E7A69E477439EB,
- 24425FFB0BCC7E54CADAA013,
- EDD11E2CC0B18196ADA0C87B,
- 248FAA119A4FC24C522165EF,
- 7E951216B6138C76653B1460,
- 0BC3C6A4F4FC1DD30DD8E17C,
- B06AE97C86D27E7FEBCB4631,
- 26FE7BE182FBB9E7228A082D,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- ED3C55ACC14D6DE2BC3B8A1D = {
- isa = PBXGroup;
- children = (
- 9516A19EE58DED8326DD0306,
- 8693552B5FA53C2003A66302,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 02A7F817D49F2BC1D70F4242 = {
- isa = PBXGroup;
- children = (
- 9EADBF913B7A454B6BE93A4A,
- 18C1CCE5684F9FA0478F27AD,
- C6030BFC7A19A5075AB0EC28,
- 9F28F179EF6B90EB9F4DBEE9,
- 24D90B40648CC05A9B1AA55B,
- 6B887CEE009353C410AB4F63,
- F40C1815F7E7E4FBAF3A3091,
- 12C680C68A15B9A590264B18,
- 6406C6755E61B1DC93071FF0,
- E1BB9D521BF6C055F5B88628,
- 418405DCE48C1B4926143469,
- 0A58FDDF6FB9253F51939A52,
- 60795BF638A7024B62C0DF09,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 1DFEAF972822E305E013CC06 = {
- isa = PBXGroup;
- children = (
- 614F2084407B35D62101F69F,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 3BA1BA0CAFE969E99950C06B = {
- isa = PBXGroup;
- children = (
- 4E2981EC48DBFD725AD8E626,
- 90489A23F0DBAD5F1550CE20,
- 0B8996A5E2671A4628476CFB,
- ED3C55ACC14D6DE2BC3B8A1D,
- 02A7F817D49F2BC1D70F4242,
- 1DFEAF972822E305E013CC06,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 19B7C16D592FB25D09022191 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ E1282ABB96DD2E7FA7F63559 = {isa = PBXBuildFile; fileRef = 614F2084407B35D62101F69F; };
+ 8A0F71A4EEC7FE694352DD94 = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; };
+ 30BE30F31D1AAED9FC893AA5 = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; };
+ E74C8479F0E10EC28E1E2DE1 = {isa = PBXBuildFile; fileRef = C6030BFC7A19A5075AB0EC28; };
+ 5AFD011031C266431687C922 = {isa = PBXBuildFile; fileRef = 9F28F179EF6B90EB9F4DBEE9; };
+ 71863EE98034AB7C3CBCAA81 = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; };
+ BF3ECEF0623C9B67C4CEAAF2 = {isa = PBXBuildFile; fileRef = 6B887CEE009353C410AB4F63; };
+ 893A86EF99F57B81286E58A1 = {isa = PBXBuildFile; fileRef = F40C1815F7E7E4FBAF3A3091; };
+ 5923A711C0020F2CDD598714 = {isa = PBXBuildFile; fileRef = 12C680C68A15B9A590264B18; };
+ F749F6DA494103257C9874CC = {isa = PBXBuildFile; fileRef = 6406C6755E61B1DC93071FF0; };
+ CC782AABFA20787BABBCED90 = {isa = PBXBuildFile; fileRef = E1BB9D521BF6C055F5B88628; };
+ FA27764C3CB8C061B1B787CC = {isa = PBXBuildFile; fileRef = 418405DCE48C1B4926143469; };
+ F8099BB77DC0D01DCCC6AFB9 = {isa = PBXBuildFile; fileRef = 0A58FDDF6FB9253F51939A52; };
+ AA0C9E035BB509F01A09310B = {isa = PBXBuildFile; fileRef = 60795BF638A7024B62C0DF09; };
+ A783F6E198806332E7FB9744 = {isa = PBXBuildFile; fileRef = 8693552B5FA53C2003A66302; };
+ 07451DA87757F9EF80E31BE8 = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; };
+ 2BAED5B831BB736E77A718AE = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; };
+ 01C9BC9A0A0F54B693CDA31A = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; };
+ 48ADBEF873A610909D727C97 = {isa = PBXBuildFile; fileRef = 9E05B63699A307598B66F829; };
+ D145903EE5DBFD1BD98423F3 = {isa = PBXBuildFile; fileRef = 18E39207A0F5F9B8BC7EE94F; };
+ C7B090C29D8DE4D2503204B1 = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; };
+ FFAF94080FF4A9995B33151E = {isa = PBXBuildFile; fileRef = 24425FFB0BCC7E54CADAA013; };
+ D2CECF93178A1738DA02CA4A = {isa = PBXBuildFile; fileRef = EDD11E2CC0B18196ADA0C87B; };
+ 7E870C094BAE67D7EB149F1C = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; };
+ 65FC2E13B65977FED63BDDE3 = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; };
+ 699954AF666E644C7B688381 = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; };
+ 9D47995A33BBA693ED435B31 = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; };
+ 0564535EEA7E4462926EA0C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 0A58FDDF6FB9253F51939A52 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 0BC3C6A4F4FC1DD30DD8E17C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 12C680C68A15B9A590264B18 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 18C1CCE5684F9FA0478F27AD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 18E39207A0F5F9B8BC7EE94F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ 24425FFB0BCC7E54CADAA013 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 248FAA119A4FC24C522165EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 24D90B40648CC05A9B1AA55B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ 253CCF9514FE705169600047 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 26FE7BE182FBB9E7228A082D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 322D3066DCD98A8D0542236A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 418405DCE48C1B4926143469 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+ 429C7CD0E88FC64E9A72514D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 50FEDCEF881CC99174035167 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 60795BF638A7024B62C0DF09 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 614F2084407B35D62101F69F = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPerformanceTest.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 6406C6755E61B1DC93071FF0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+ 6B887CEE009353C410AB4F63 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 77AA9722BAADD4108205501A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ 7E951216B6138C76653B1460 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 81017699F857F5BBFCA6E055 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 8693552B5FA53C2003A66302 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPerformanceTest/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+ 89B3243200BAA6BD72905DBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 920FF34D4A00A5AD433EE5F4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 9516A19EE58DED8326DD0306 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 9E05B63699A307598B66F829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ 9EADBF913B7A454B6BE93A4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 9F28F179EF6B90EB9F4DBEE9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ A3B86BB7483BC5697B58E417 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ A65BB8D452A2A4859FA41F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ AD134CACB71BED6A22743C18 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ B06AE97C86D27E7FEBCB4631 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ BAFDA8DE51E7A69E477439EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ C6030BFC7A19A5075AB0EC28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ C8EE61FDD1F06817A014B881 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ CBBC98B7CD350A07F5145FB4 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ D03C9A859FB4DBA8268D7FBA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ E1BB9D521BF6C055F5B88628 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ E575FE2AD2F19FA6AEB536C2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ EDD11E2CC0B18196ADA0C87B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ F40C1815F7E7E4FBAF3A3091 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ 9F54D12C977843F8FEFCF041 = {isa = PBXGroup; children = (
+ 0564535EEA7E4462926EA0C9,
+ 429C7CD0E88FC64E9A72514D, ); name = Source; sourceTree = "<group>"; };
+ 4E2981EC48DBFD725AD8E626 = {isa = PBXGroup; children = (
+ 9F54D12C977843F8FEFCF041, ); name = AudioPerformanceTest; sourceTree = "<group>"; };
+ 90489A23F0DBAD5F1550CE20 = {isa = PBXGroup; children = (
+ 920FF34D4A00A5AD433EE5F4,
+ A3B86BB7483BC5697B58E417,
+ 253CCF9514FE705169600047,
+ D03C9A859FB4DBA8268D7FBA,
+ CBBC98B7CD350A07F5145FB4,
+ E575FE2AD2F19FA6AEB536C2,
+ 77AA9722BAADD4108205501A,
+ 81017699F857F5BBFCA6E055,
+ C8EE61FDD1F06817A014B881,
+ 50FEDCEF881CC99174035167,
+ AD134CACB71BED6A22743C18, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 0B8996A5E2671A4628476CFB = {isa = PBXGroup; children = (
+ A65BB8D452A2A4859FA41F8B,
+ 89B3243200BAA6BD72905DBB,
+ 322D3066DCD98A8D0542236A,
+ 9E05B63699A307598B66F829,
+ 18E39207A0F5F9B8BC7EE94F,
+ BAFDA8DE51E7A69E477439EB,
+ 24425FFB0BCC7E54CADAA013,
+ EDD11E2CC0B18196ADA0C87B,
+ 248FAA119A4FC24C522165EF,
+ 7E951216B6138C76653B1460,
+ 0BC3C6A4F4FC1DD30DD8E17C,
+ B06AE97C86D27E7FEBCB4631,
+ 26FE7BE182FBB9E7228A082D, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ ED3C55ACC14D6DE2BC3B8A1D = {isa = PBXGroup; children = (
+ 9516A19EE58DED8326DD0306,
+ 8693552B5FA53C2003A66302, ); name = Resources; sourceTree = "<group>"; };
+ 02A7F817D49F2BC1D70F4242 = {isa = PBXGroup; children = (
+ 9EADBF913B7A454B6BE93A4A,
+ 18C1CCE5684F9FA0478F27AD,
+ C6030BFC7A19A5075AB0EC28,
+ 9F28F179EF6B90EB9F4DBEE9,
+ 24D90B40648CC05A9B1AA55B,
+ 6B887CEE009353C410AB4F63,
+ F40C1815F7E7E4FBAF3A3091,
+ 12C680C68A15B9A590264B18,
+ 6406C6755E61B1DC93071FF0,
+ E1BB9D521BF6C055F5B88628,
+ 418405DCE48C1B4926143469,
+ 0A58FDDF6FB9253F51939A52,
+ 60795BF638A7024B62C0DF09, ); name = Frameworks; sourceTree = "<group>"; };
+ 1DFEAF972822E305E013CC06 = {isa = PBXGroup; children = (
+ 614F2084407B35D62101F69F, ); name = Products; sourceTree = "<group>"; };
+ 3BA1BA0CAFE969E99950C06B = {isa = PBXGroup; children = (
+ 4E2981EC48DBFD725AD8E626,
+ 90489A23F0DBAD5F1550CE20,
+ 0B8996A5E2671A4628476CFB,
+ ED3C55ACC14D6DE2BC3B8A1D,
+ 02A7F817D49F2BC1D70F4242,
+ 1DFEAF972822E305E013CC06, ); name = Source; sourceTree = "<group>"; };
+ 19B7C16D592FB25D09022191 = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
- PRODUCT_NAME = "AudioPerformanceTest";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- B7A6988E30C0A68B01EDC53B = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Debug; };
+ B7A6988E30C0A68B01EDC53B = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
- PRODUCT_NAME = "AudioPerformanceTest";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- B907CDF95622107F20CD7617 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Release; };
+ B907CDF95622107F20CD7617 = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- BF82CBDF63CC37CADC61A511 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ BF82CBDF63CC37CADC61A511 = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- AA3837ADCB1CEB3B0E2D20B3 = {
- isa = PBXTargetDependency;
- target = E9FD2656EC625C9C8DE30219;
- };
- 7097CF6AC086DAC346ACCCD9 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B907CDF95622107F20CD7617,
- BF82CBDF63CC37CADC61A511,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 674C2AF5989C06689C6065FC = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 19B7C16D592FB25D09022191,
- B7A6988E30C0A68B01EDC53B,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C86DD529EC94922C2AB61742 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A783F6E198806332E7FB9744,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6C2BE2DE2ECC96615ED827AB = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 07451DA87757F9EF80E31BE8,
- 2BAED5B831BB736E77A718AE,
- 01C9BC9A0A0F54B693CDA31A,
- 48ADBEF873A610909D727C97,
- D145903EE5DBFD1BD98423F3,
- C7B090C29D8DE4D2503204B1,
- FFAF94080FF4A9995B33151E,
- D2CECF93178A1738DA02CA4A,
- 7E870C094BAE67D7EB149F1C,
- 65FC2E13B65977FED63BDDE3,
- 699954AF666E644C7B688381,
- 9D47995A33BBA693ED435B31,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 409D569C572B6EF7F4F1702D = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8A0F71A4EEC7FE694352DD94,
- 30BE30F31D1AAED9FC893AA5,
- E74C8479F0E10EC28E1E2DE1,
- 5AFD011031C266431687C922,
- 71863EE98034AB7C3CBCAA81,
- BF3ECEF0623C9B67C4CEAAF2,
- 893A86EF99F57B81286E58A1,
- 5923A711C0020F2CDD598714,
- F749F6DA494103257C9874CC,
- CC782AABFA20787BABBCED90,
- FA27764C3CB8C061B1B787CC,
- F8099BB77DC0D01DCCC6AFB9,
- AA0C9E035BB509F01A09310B,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E9FD2656EC625C9C8DE30219 = {
- isa = PBXNativeTarget;
- buildConfigurationList = 674C2AF5989C06689C6065FC;
- buildPhases = (
- C86DD529EC94922C2AB61742,
- 6C2BE2DE2ECC96615ED827AB,
- 409D569C572B6EF7F4F1702D,
- );
- buildRules = ( );
- dependencies = ( );
- name = "AudioPerformanceTest - App";
- productName = AudioPerformanceTest;
- productReference = 614F2084407B35D62101F69F;
- productType = "com.apple.product-type.application";
- };
- 9CE2A44801B5B4BE7A9667DA = {
- isa = PBXProject;
- buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 3BA1BA0CAFE969E99950C06B;
- projectDirPath = "";
- projectRoot = "";
- targets = (E9FD2656EC625C9C8DE30219);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ AA3837ADCB1CEB3B0E2D20B3 = {isa = PBXTargetDependency; target = E9FD2656EC625C9C8DE30219; };
+ 7097CF6AC086DAC346ACCCD9 = {isa = XCConfigurationList; buildConfigurations = (
+ B907CDF95622107F20CD7617,
+ BF82CBDF63CC37CADC61A511, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 674C2AF5989C06689C6065FC = {isa = XCConfigurationList; buildConfigurations = (
+ 19B7C16D592FB25D09022191,
+ B7A6988E30C0A68B01EDC53B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ C86DD529EC94922C2AB61742 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ A783F6E198806332E7FB9744, ); runOnlyForDeploymentPostprocessing = 0; };
+ 6C2BE2DE2ECC96615ED827AB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 07451DA87757F9EF80E31BE8,
+ 2BAED5B831BB736E77A718AE,
+ 01C9BC9A0A0F54B693CDA31A,
+ 48ADBEF873A610909D727C97,
+ D145903EE5DBFD1BD98423F3,
+ C7B090C29D8DE4D2503204B1,
+ FFAF94080FF4A9995B33151E,
+ D2CECF93178A1738DA02CA4A,
+ 7E870C094BAE67D7EB149F1C,
+ 65FC2E13B65977FED63BDDE3,
+ 699954AF666E644C7B688381,
+ 9D47995A33BBA693ED435B31, ); runOnlyForDeploymentPostprocessing = 0; };
+ 409D569C572B6EF7F4F1702D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 8A0F71A4EEC7FE694352DD94,
+ 30BE30F31D1AAED9FC893AA5,
+ E74C8479F0E10EC28E1E2DE1,
+ 5AFD011031C266431687C922,
+ 71863EE98034AB7C3CBCAA81,
+ BF3ECEF0623C9B67C4CEAAF2,
+ 893A86EF99F57B81286E58A1,
+ 5923A711C0020F2CDD598714,
+ F749F6DA494103257C9874CC,
+ CC782AABFA20787BABBCED90,
+ FA27764C3CB8C061B1B787CC,
+ F8099BB77DC0D01DCCC6AFB9,
+ AA0C9E035BB509F01A09310B, ); runOnlyForDeploymentPostprocessing = 0; };
+ E9FD2656EC625C9C8DE30219 = {isa = PBXNativeTarget; buildConfigurationList = 674C2AF5989C06689C6065FC; buildPhases = (
+ C86DD529EC94922C2AB61742,
+ 6C2BE2DE2ECC96615ED827AB,
+ 409D569C572B6EF7F4F1702D, ); buildRules = ( ); dependencies = ( ); name = "AudioPerformanceTest - App"; productName = AudioPerformanceTest; productReference = 614F2084407B35D62101F69F; productType = "com.apple.product-type.application"; };
+ 9CE2A44801B5B4BE7A9667DA = {isa = PBXProject; buildConfigurationList = 7097CF6AC086DAC346ACCCD9; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3BA1BA0CAFE969E99950C06B; projectDirPath = ""; projectRoot = ""; targets = (E9FD2656EC625C9C8DE30219); };
};
rootObject = 9CE2A44801B5B4BE7A9667DA;
}
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_events flags:\r
\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
//#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
namespace ProjectInfo\r
{\r
const char* const projectName = "AudioPerformanceTest";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
\r
<JUCERPROJECT id="NTe0XB0ij" name="AudioPluginHost" projectType="guiapp" version="1.0.0"\r
juceFolder="../../../juce" vstFolderMac="~/SDKs/vstsdk2.4" vstFolderPC="c:\SDKs\vstsdk2.4"\r
- bundleIdentifier="com.roli.juce.pluginhost" jucerVersion="5.4.1"\r
+ bundleIdentifier="com.roli.juce.pluginhost" jucerVersion="5.3.1"\r
companyName="ROLI Ltd." displaySplashScreen="0" reportAppUsage="0"\r
companyCopyright="ROLI Ltd.">\r
<EXPORTFORMATS>\r
<XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="" rtasFolder="~/SDKs/PT_80_SDK"\r
- objCExtraSuffix="M73TRi" extraCompilerFlags="-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi"\r
- smallIcon="c97aUr" bigIcon="c97aUr" microphonePermissionNeeded="1">\r
+ objCExtraSuffix="M73TRi" vst3Folder="" extraCompilerFlags="-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi"\r
+ smallIcon="c97aUr" bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
<CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="AudioPluginHost"/>\r
<MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
</MODULEPATHS>\r
</LINUX_MAKE>\r
- <VS2013 targetFolder="Builds/VisualStudio2013" vstFolder="" smallIcon="c97aUr"\r
- bigIcon="c97aUr">\r
+ <VS2013 targetFolder="Builds/VisualStudio2013" vstFolder="" vst3Folder=""\r
+ smallIcon="c97aUr" bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" winArchitecture="32-bit" isDebug="1" optimisation="1"\r
targetName="AudioPluginHost"/>\r
<MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
</MODULEPATHS>\r
</VS2013>\r
- <VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" smallIcon="c97aUr"\r
- bigIcon="c97aUr">\r
+ <VS2015 targetFolder="Builds/VisualStudio2015" vstFolder="" vst3Folder=""\r
+ smallIcon="c97aUr" bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
<CONFIGURATION name="Release" isDebug="0" targetName="AudioPluginHost" debugInformationFormat="ProgramDatabase"/>\r
<MODULEPATH id="juce_audio_basics" path="../../modules"/>\r
</MODULEPATHS>\r
</VS2015>\r
- <VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="c97aUr" bigIcon="c97aUr"\r
- extraCompilerFlags="/w44265 /w45038 /w44062">\r
+ <VS2017 targetFolder="Builds/VisualStudio2017" vst3Folder="" smallIcon="c97aUr"\r
+ bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost"/>\r
<CONFIGURATION name="Release" isDebug="0" targetName="AudioPluginHost" debugInformationFormat="ProgramDatabase"/>\r
</VS2017>\r
<XCODE_IPHONE targetFolder="Builds/iOS" iosScreenOrientation="portraitlandscape"\r
iPadScreenOrientation="portraitlandscape" iosDeviceFamily="1,2"\r
- microphonePermissionNeeded="1" iosBackgroundAudio="1" iosBackgroundBle="1"\r
- smallIcon="c97aUr" bigIcon="c97aUr">\r
+ vst3Folder="" microphonePermissionNeeded="1" iosBackgroundAudio="1"\r
+ iosBackgroundBle="1" smallIcon="c97aUr" bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" enablePluginBinaryCopyStep="1" isDebug="1" optimisation="1"\r
linkTimeOptimisation="0" targetName="Plugin Host"/>\r
androidMinimumSDK="23" androidInternetNeeded="1" microphonePermissionNeeded="1"\r
androidBluetoothNeeded="1" smallIcon="c97aUr" bigIcon="c97aUr">\r
<CONFIGURATIONS>\r
- <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
- optimisation="1" linkTimeOptimisation="0" targetName="Plugin Host"/>\r
+ <CONFIGURATION name="Debug" androidArchitectures="armeabi x86" isDebug="1" optimisation="1"\r
+ linkTimeOptimisation="0" targetName="Plugin Host"/>\r
<CONFIGURATION name="Release" androidArchitectures="" isDebug="0" optimisation="3"\r
linkTimeOptimisation="1" targetName="Plugin Host"/>\r
</CONFIGURATIONS>\r
</MAINGROUP>\r
<JUCEOPTIONS JUCE_WASAPI="1" JUCE_DIRECTSOUND="1" JUCE_ALSA="1" JUCE_QUICKTIME="disabled"\r
JUCE_USE_FLAC="0" JUCE_USE_OGGVORBIS="0" JUCE_USE_CDBURNER="0"\r
- JUCE_USE_CDREADER="0" JUCE_USE_CAMERA="0" JUCE_PLUGINHOST_AU="1"\r
- JUCE_WEB_BROWSER="0" JUCE_PLUGINHOST_VST3="1" JUCE_PLUGINHOST_LADSPA="1"/>\r
+ JUCE_USE_CDREADER="0" JUCE_USE_CAMERA="0" JUCE_PLUGINHOST_VST="1"\r
+ JUCE_PLUGINHOST_AU="1" JUCE_WEB_BROWSER="0" JUCE_PLUGINHOST_VST3="1"\r
+ JUCE_PLUGINHOST_LADSPA="1"/>\r
<MODULES>\r
<MODULE id="juce_audio_basics" showAllCode="1"/>\r
<MODULE id="juce_audio_devices" showAllCode="1"/>\r
add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=23" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_roli_juce_pluginhost_AudioPluginHost" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/roli/juce/pluginhost/AudioPluginHost\"" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSNAME=com_roli_juce_pluginhost_SharingContentProvider" "-DJUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH=\"com/roli/juce/pluginhost/SharingContentProvider\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCE_ANDROID_GL_ES_VERSION_3_0=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000")\r
\r
include_directories( AFTER\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK"\r
"../../../JuceLibraryCode"\r
"../../../../../modules"\r
"${ANDROID_NDK}/sources/android/cpufeatures"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+ "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
- "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
"../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
"../../../../../modules/juce_core/containers/juce_Array.h"\r
"../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
"../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
- "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
- "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
"../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
"../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
"../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
"../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
"../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
- "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_Memory.h"\r
"../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
"../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
"../../../../../modules/juce_core/memory/juce_Singleton.h"\r
"../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
"../../../../../modules/juce_core/misc/juce_Result.cpp"\r
"../../../../../modules/juce_core/misc/juce_Result.h"\r
"../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
"../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
"../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
"../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
- "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
"../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
"../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
"../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
"../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
"../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
"../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
- "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
"../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
"../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"\r
"../../../../../modules/juce_video/capture/juce_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_android_CameraDevice.h"\r
- "../../../../../modules/juce_video/native/juce_android_Video.h"\r
"../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"\r
"../../../../../modules/juce_video/native/juce_mac_Video.h"\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
\r
android {\r
compileSdkVersion 23\r
- buildToolsVersion "28.0.0"\r
+ buildToolsVersion "27.0.3"\r
externalNativeBuild {\r
cmake {\r
path "CMakeLists.txt"\r
productFlavors {\r
debug_ {\r
ndk {\r
- abiFilters "armeabi-v7a", "x86"\r
+ abiFilters "armeabi", "x86"\r
}\r
externalNativeBuild {\r
cmake {\r
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
package="com.roli.juce.pluginhost">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+ <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
import android.content.pm.PackageInfo;\r
import android.content.pm.PackageManager;\r
import android.hardware.camera2.*;\r
-import android.database.ContentObserver;\r
-import android.media.session.*;\r
-import android.media.MediaMetadata;\r
import android.net.http.SslError;\r
import android.net.Uri;\r
import android.os.Bundle;\r
//==============================================================================\r
public boolean isPermissionDeclaredInManifest (int permissionID)\r
{\r
- return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
- }\r
+ String permissionToCheck = getAndroidPermissionName(permissionID);\r
\r
- public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
- {\r
try\r
{\r
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
public final String getClipboardContent()\r
{\r
ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
- CharSequence content = clipboard.getText();\r
- return content != null ? content.toString() : new String();\r
+ return clipboard.getText().toString();\r
}\r
\r
public final void setClipboardContent (String newText)\r
implements SurfaceHolder.Callback\r
{\r
private long nativeContext = 0;\r
- private boolean forVideo;\r
\r
- NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+ NativeSurfaceView (Context context, long nativeContextPtr)\r
{\r
super (context);\r
nativeContext = nativeContextPtr;\r
- forVideo = createdForVideo;\r
}\r
\r
public Surface getNativeSurface()\r
@Override\r
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
{\r
- if (forVideo)\r
- surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
- else\r
- surfaceChangedNative (nativeContext, holder, format, width, height);\r
+ surfaceChangedNative (nativeContext, holder, format, width, height);\r
}\r
\r
@Override\r
public void surfaceCreated (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceCreatedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceCreatedNative (nativeContext, holder);\r
+ surfaceCreatedNative (nativeContext, holder);\r
}\r
\r
@Override\r
public void surfaceDestroyed (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceDestroyedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceDestroyedNative (nativeContext, holder);\r
+ surfaceDestroyedNative (nativeContext, holder);\r
}\r
\r
@Override\r
protected void dispatchDraw (Canvas canvas)\r
{\r
super.dispatchDraw (canvas);\r
-\r
- if (forVideo)\r
- dispatchDrawNativeVideo (nativeContext, canvas);\r
- else\r
- dispatchDrawNative (nativeContext, canvas);\r
+ dispatchDrawNative (nativeContext, canvas);\r
}\r
\r
//==============================================================================\r
@Override\r
- protected void onAttachedToWindow()\r
+ protected void onAttachedToWindow ()\r
{\r
super.onAttachedToWindow();\r
getHolder().addCallback (this);\r
}\r
\r
@Override\r
- protected void onDetachedFromWindow()\r
+ protected void onDetachedFromWindow ()\r
{\r
super.onDetachedFromWindow();\r
getHolder().removeCallback (this);\r
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
int format, int width, int height);\r
-\r
- private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
- private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
- int format, int width, int height);\r
}\r
\r
- public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
{\r
- return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+ return new NativeSurfaceView (this, nativeSurfacePtr);\r
}\r
\r
//==============================================================================\r
}\r
\r
\r
- //==============================================================================\r
- public class MediaControllerCallback extends MediaController.Callback\r
- {\r
- private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);\r
- private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);\r
- private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
- private native void mediaControllerSessionDestroyed (long host);\r
-\r
- MediaControllerCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
- {\r
- mediaControllerAudioInfoChanged (host, info);\r
- }\r
-\r
- @Override\r
- public void onMetadataChanged (MediaMetadata metadata)\r
- {\r
- mediaControllerMetadataChanged (host, metadata);\r
- }\r
-\r
- @Override\r
- public void onPlaybackStateChanged (PlaybackState state)\r
- {\r
- mediaControllerPlaybackStateChanged (host, state);\r
- }\r
-\r
- @Override\r
- public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
- @Override\r
- public void onSessionDestroyed()\r
- {\r
- mediaControllerSessionDestroyed (host);\r
- }\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class MediaSessionCallback extends MediaSession.Callback\r
- {\r
- private native void mediaSessionPause (long host);\r
- private native void mediaSessionPlay (long host);\r
- private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
- private native void mediaSessionSeekTo (long host, long pos);\r
- private native void mediaSessionStop (long host);\r
-\r
-\r
- MediaSessionCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onPause()\r
- {\r
- mediaSessionPause (host);\r
- }\r
-\r
- @Override\r
- public void onPlay()\r
- {\r
- mediaSessionPlay (host);\r
- }\r
-\r
- @Override\r
- public void onPlayFromMediaId (String mediaId, Bundle extras)\r
- {\r
- mediaSessionPlayFromMediaId (host, mediaId, extras);\r
- }\r
-\r
- @Override\r
- public void onSeekTo (long pos)\r
- {\r
- mediaSessionSeekTo (host, pos);\r
- }\r
-\r
- @Override\r
- public void onStop()\r
- {\r
- mediaSessionStop (host);\r
- }\r
-\r
- @Override\r
- public void onFastForward() {}\r
-\r
- @Override\r
- public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
- {\r
- return true;\r
- }\r
-\r
- @Override\r
- public void onRewind() {}\r
-\r
- @Override\r
- public void onSkipToNext() {}\r
-\r
- @Override\r
- public void onSkipToPrevious() {}\r
-\r
- @Override\r
- public void onSkipToQueueItem (long id) {}\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class SystemVolumeObserver extends ContentObserver\r
- {\r
- private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
- SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
- {\r
- super (null);\r
-\r
- activity = activityToUse;\r
- host = hostToUse;\r
- }\r
-\r
- void setEnabled (boolean shouldBeEnabled)\r
- {\r
- if (shouldBeEnabled)\r
- activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
- else\r
- activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
- }\r
-\r
- @Override\r
- public void onChange (boolean selfChange, Uri uri)\r
- {\r
- if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
- mediaSessionSystemVolumeChanged (host);\r
- }\r
-\r
- private Activity activity;\r
- private long host;\r
- }\r
-\r
-\r
//==============================================================================\r
public static final String getLocaleValue (boolean isRegion)\r
{\r
jcenter()\r
}\r
dependencies {\r
- classpath 'com.android.tools.build:gradle:3.1.3'\r
+ classpath 'com.android.tools.build:gradle:3.1.1'\r
}\r
}\r
\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := AudioPluginHost\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := AudioPluginHost\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o \\r
$(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors alsa freetype2 x11 xext xinerama libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
@echo Linking "AudioPluginHost - App"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_video.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama\r
+\r
clean:\r
@echo Cleaning AudioPluginHost\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- FCDB1F8A93F59E0F97821456 = {
- isa = PBXBuildFile;
- fileRef = 8D8BBC353637DA442C5575DA;
- };
- 73E371F1B912FCCAE0CD7E5D = {
- isa = PBXBuildFile;
- fileRef = 86CA337014D3F67E906FFD28;
- };
- 21D330A5B13178B12BEAFC3C = {
- isa = PBXBuildFile;
- fileRef = D4EBC17BDB7F88CCBC76730B;
- };
- B288A89F96704F142ED8E939 = {
- isa = PBXBuildFile;
- fileRef = 5ACC21AA45BBF48C3C64D56D;
- };
- 851C1165C9E4ACDD19C56A96 = {
- isa = PBXBuildFile;
- fileRef = 942A0F04EFB8D0B2FF9780BA;
- };
- AF42316D915057E930A5624E = {
- isa = PBXBuildFile;
- fileRef = A4B568E26157FC282214976F;
- };
- 2B4B9CF71F94BDD1E3AC89AE = {
- isa = PBXBuildFile;
- fileRef = B0935EBBA4F6E2B05F3D1C0A;
- };
- AC3BED74AC7C6D9F5739F38B = {
- isa = PBXBuildFile;
- fileRef = 9794142D24966F93FFDE51A1;
- };
- E3CB85BA817BC9E3942A8AB0 = {
- isa = PBXBuildFile;
- fileRef = 9F9B445E6755CAA19E4344ED;
- };
- 70580743C3D5695F065FF698 = {
- isa = PBXBuildFile;
- fileRef = E68018DE199135B7F738FB17;
- };
- 3470F40DA5D68EC217872906 = {
- isa = PBXBuildFile;
- fileRef = 31D55A751C790CB81F58DDB7;
- };
- E092A70431B046BF1F50A482 = {
- isa = PBXBuildFile;
- fileRef = 5AF0CA7CDFCA90B4DE1F55C3;
- };
- E2BAA7CFC729809530FD71EE = {
- isa = PBXBuildFile;
- fileRef = B8774D8AD307D798831C0DF7;
- };
- 68FBFDA1FE637B3EDA09A592 = {
- isa = PBXBuildFile;
- fileRef = 4DF6E6E41E10965AD169143B;
- };
- BBA1733CF8B064A5FD0B4CF4 = {
- isa = PBXBuildFile;
- fileRef = D313CF37B25D7FD313C4F336;
- };
- A02C9F4C4B840C27B6CAFEBD = {
- isa = PBXBuildFile;
- fileRef = 89309C0C5F3269BD06BE7F27;
- };
- 4DB15177DDC357F4503F88CF = {
- isa = PBXBuildFile;
- fileRef = B457EE687507BF1DEEA7581F;
- };
- D92C7BF86C9CCF6B4D14F809 = {
- isa = PBXBuildFile;
- fileRef = 7DA35787B5F6F7440D667CC8;
- };
- 443244451A0F2064D4767337 = {
- isa = PBXBuildFile;
- fileRef = 2A6983F82B13F9E8B10299AE;
- };
- 2E74188531792924F0C73142 = {
- isa = PBXBuildFile;
- fileRef = 05863BDFC582C9552A86DF49;
- };
- C8423A9611C8AAF27468847D = {
- isa = PBXBuildFile;
- fileRef = 336FD30C38BD0A176161B8AE;
- };
- 786AF545C1C1E4D11140C3DF = {
- isa = PBXBuildFile;
- fileRef = 43647951ECC7F030B9953965;
- };
- 3E1689E23B9C85F03209DCEF = {
- isa = PBXBuildFile;
- fileRef = 3D78A731234A833CA112AE45;
- };
- F635D974599DEC2ED91E6A88 = {
- isa = PBXBuildFile;
- fileRef = 04AABCD3491318FB32E844B4;
- };
- A1B0416DA378BB0C3AD6F74B = {
- isa = PBXBuildFile;
- fileRef = A66EFAC64B1B67B536C73415;
- };
- A0144A682BF4843C8CF53FE4 = {
- isa = PBXBuildFile;
- fileRef = 6D107D7946DC5976B766345B;
- };
- 15CCE43D7DCFC649638919D4 = {
- isa = PBXBuildFile;
- fileRef = 4C7D82F9274A4F9DBF11235C;
- };
- 5C4D406B924230F83E3580AD = {
- isa = PBXBuildFile;
- fileRef = 65968EA1B476D71F14DE1D58;
- };
- F4DD98B9310B679D50A2C8A6 = {
- isa = PBXBuildFile;
- fileRef = 5D250A57C7DEA80248F30EED;
- };
- CAF0DE157C8F7D9F168AA3B6 = {
- isa = PBXBuildFile;
- fileRef = 5FBD6C402617272052BB4D81;
- };
- 0F20A4AE04736634F097F5A6 = {
- isa = PBXBuildFile;
- fileRef = B285CAB91AE928C476CA4F9C;
- };
- 76A80851698FC773D2479B4E = {
- isa = PBXBuildFile;
- fileRef = 683CEE986A2467C850FE99E6;
- };
- E4A926EF695823F0F13268FF = {
- isa = PBXBuildFile;
- fileRef = B8E24A5CEE6B7055537725CF;
- };
- A09E93F1B354E1FF8B3E9ABE = {
- isa = PBXBuildFile;
- fileRef = 5EF1D381F42AA8764597F189;
- };
- 7DE202DC1D876F49266D9E7D = {
- isa = PBXBuildFile;
- fileRef = 8290D7BAC160B3A56B66891A;
- };
- 075C54DDDBDEA5AAD2F60154 = {
- isa = PBXBuildFile;
- fileRef = 82800DBA287EF4BAB13B42FB;
- };
- 2C3D221D2AA87F07B3F1044D = {
- isa = PBXBuildFile;
- fileRef = 8FE7B37CDE0818DB27BDDEBD;
- };
- C38D14DC58F1941DD5E4BF60 = {
- isa = PBXBuildFile;
- fileRef = 2BE6C2DFD6EBB9A89109AEB5;
- };
- 2727A191DB1BAAC9C04B9081 = {
- isa = PBXBuildFile;
- fileRef = 37E4D5C341406B7072120006;
- };
- 84BAFE82A102D9C350672689 = {
- isa = PBXBuildFile;
- fileRef = 29D746FC68F69751796671A2;
- };
- 04AABCD3491318FB32E844B4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = MainHostWindow.cpp;
- path = ../../Source/UI/MainHostWindow.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 04DB9A49969ECC740CC25665 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = GraphEditorPanel.h;
- path = ../../Source/UI/GraphEditorPanel.h;
- sourceTree = "SOURCE_ROOT";
- };
- 05863BDFC582C9552A86DF49 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = FilterGraph.cpp;
- path = ../../Source/Filters/FilterGraph.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 1DADAD8E34AAF4AFF1C69DC4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = BinaryData.h;
- path = ../../JuceLibraryCode/BinaryData.h;
- sourceTree = "SOURCE_ROOT";
- };
- 29D746FC68F69751796671A2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_video.mm";
- path = "../../JuceLibraryCode/include_juce_video.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 2A6983F82B13F9E8B10299AE = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- 2BE6C2DFD6EBB9A89109AEB5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 30F22843EFEBF7AA841EB4D6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 31D55A751C790CB81F58DDB7 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMedia.framework;
- path = System/Library/Frameworks/CoreMedia.framework;
- sourceTree = SDKROOT;
- };
- 336FD30C38BD0A176161B8AE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = FilterIOConfiguration.cpp;
- path = ../../Source/Filters/FilterIOConfiguration.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 37E4D5C341406B7072120006 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 3C070DD522CDD11FFC87425D = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- 3D57FE2A8877F12A61054726 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 3D78A731234A833CA112AE45 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = GraphEditorPanel.cpp;
- path = ../../Source/UI/GraphEditorPanel.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 43647951ECC7F030B9953965 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = InternalFilters.cpp;
- path = ../../Source/Filters/InternalFilters.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 4C7D82F9274A4F9DBF11235C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 4DF6E6E41E10965AD169143B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- 5313EB852E41EE58B199B9A2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 545D57A6AA801B38548B0CAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = FilterGraph.h;
- path = ../../Source/Filters/FilterGraph.h;
- sourceTree = "SOURCE_ROOT";
- };
- 57DF618F1DE781556B7AFC32 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 59842A98E5EBBC54B50C04CD = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 5ACC21AA45BBF48C3C64D56D = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioUnit.framework;
- path = System/Library/Frameworks/AudioUnit.framework;
- sourceTree = SDKROOT;
- };
- 5AF0CA7CDFCA90B4DE1F55C3 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 5D250A57C7DEA80248F30EED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5EF1D381F42AA8764597F189 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5FBD6C402617272052BB4D81 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 65968EA1B476D71F14DE1D58 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 683CEE986A2467C850FE99E6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 6A71B2BCAC4239072BC2BD7E = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 6D107D7946DC5976B766345B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = BinaryData.cpp;
- path = ../../JuceLibraryCode/BinaryData.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 725D0D9C8C7FF7B3FB3020ED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = FilterIOConfiguration.h;
- path = ../../Source/Filters/FilterIOConfiguration.h;
- sourceTree = "SOURCE_ROOT";
- };
- 7DA35787B5F6F7440D667CC8 = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 81C1A7770E082F56FE5A90A7 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 82800DBA287EF4BAB13B42FB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 8290D7BAC160B3A56B66891A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 86CA337014D3F67E906FFD28 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 89309C0C5F3269BD06BE7F27 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 8D8BBC353637DA442C5575DA = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = AudioPluginHost.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 8FE7B37CDE0818DB27BDDEBD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 938AE72315C6C93949F6220E = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 942A0F04EFB8D0B2FF9780BA = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- 94CB96C8E4B51F52776C2638 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 97918AB43AD460AFA8FA2FFE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = PluginWindow.h;
- path = ../../Source/UI/PluginWindow.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9794142D24966F93FFDE51A1 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- 9EBEE3AE5856E877478607C7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = InternalFilters.h;
- path = ../../Source/Filters/InternalFilters.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9F9B445E6755CAA19E4344ED = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- A4B568E26157FC282214976F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVKit.framework;
- path = System/Library/Frameworks/AVKit.framework;
- sourceTree = SDKROOT;
- };
- A5DFC13E4F09134B0D226A3E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainHostWindow.h;
- path = ../../Source/UI/MainHostWindow.h;
- sourceTree = "SOURCE_ROOT";
- };
- A5E7CA8A71D049BE2BD33861 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- A66EFAC64B1B67B536C73415 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = HostStartup.cpp;
- path = ../../Source/HostStartup.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- B0935EBBA4F6E2B05F3D1C0A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- B285CAB91AE928C476CA4F9C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- B2A1E626CC120982805754F6 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = JUCEAppIcon.png;
- path = ../../Source/JUCEAppIcon.png;
- sourceTree = "SOURCE_ROOT";
- };
- B457EE687507BF1DEEA7581F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- B86B918291E1090C6A720971 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- B8774D8AD307D798831C0DF7 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- B8E24A5CEE6B7055537725CF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- D313CF37B25D7FD313C4F336 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGL.framework;
- path = System/Library/Frameworks/OpenGL.framework;
- sourceTree = SDKROOT;
- };
- D4EBC17BDB7F88CCBC76730B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- DDE115D3084ACA6DD6AA4471 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_video";
- path = "../../../../modules/juce_video";
- sourceTree = "SOURCE_ROOT";
- };
- E68018DE199135B7F738FB17 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- F299BECFB2AEA6105F014848 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- F9AC862E9A3583B6C1488EE0 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- FA21631C5536EA3DF55C7FA6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- FAF867E9E731D0880D40511F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- AA37F82D57C9BB4BE78FCCB9 = {
- isa = PBXGroup;
- children = (
- 05863BDFC582C9552A86DF49,
- 545D57A6AA801B38548B0CAC,
- 336FD30C38BD0A176161B8AE,
- 725D0D9C8C7FF7B3FB3020ED,
- 43647951ECC7F030B9953965,
- 9EBEE3AE5856E877478607C7,
- );
- name = Filters;
- sourceTree = "<group>";
- };
- DE7B77306553B1204071B39A = {
- isa = PBXGroup;
- children = (
- 3D78A731234A833CA112AE45,
- 04DB9A49969ECC740CC25665,
- 04AABCD3491318FB32E844B4,
- A5DFC13E4F09134B0D226A3E,
- 97918AB43AD460AFA8FA2FFE,
- );
- name = UI;
- sourceTree = "<group>";
- };
- B225B7F2CAABD28A41E7C339 = {
- isa = PBXGroup;
- children = (
- AA37F82D57C9BB4BE78FCCB9,
- DE7B77306553B1204071B39A,
- A66EFAC64B1B67B536C73415,
- B2A1E626CC120982805754F6,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 97790EAEA01CFA5C3CA9737A = {
- isa = PBXGroup;
- children = (
- B225B7F2CAABD28A41E7C339,
- );
- name = AudioPluginHost;
- sourceTree = "<group>";
- };
- 9D8FE1F65CAD416AA606C47A = {
- isa = PBXGroup;
- children = (
- 6A71B2BCAC4239072BC2BD7E,
- 5313EB852E41EE58B199B9A2,
- F9AC862E9A3583B6C1488EE0,
- FAF867E9E731D0880D40511F,
- 3C070DD522CDD11FFC87425D,
- 3D57FE2A8877F12A61054726,
- FA21631C5536EA3DF55C7FA6,
- B86B918291E1090C6A720971,
- 59842A98E5EBBC54B50C04CD,
- 94CB96C8E4B51F52776C2638,
- 938AE72315C6C93949F6220E,
- F299BECFB2AEA6105F014848,
- 81C1A7770E082F56FE5A90A7,
- DDE115D3084ACA6DD6AA4471,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 7E30376DDAD775FEFE64944C = {
- isa = PBXGroup;
- children = (
- 30F22843EFEBF7AA841EB4D6,
- 6D107D7946DC5976B766345B,
- 1DADAD8E34AAF4AFF1C69DC4,
- 4C7D82F9274A4F9DBF11235C,
- 65968EA1B476D71F14DE1D58,
- 5D250A57C7DEA80248F30EED,
- 5FBD6C402617272052BB4D81,
- B285CAB91AE928C476CA4F9C,
- 683CEE986A2467C850FE99E6,
- B8E24A5CEE6B7055537725CF,
- 5EF1D381F42AA8764597F189,
- 8290D7BAC160B3A56B66891A,
- 82800DBA287EF4BAB13B42FB,
- 8FE7B37CDE0818DB27BDDEBD,
- 2BE6C2DFD6EBB9A89109AEB5,
- 37E4D5C341406B7072120006,
- 29D746FC68F69751796671A2,
- A5E7CA8A71D049BE2BD33861,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- A97EE73C79DA3F729D46AF48 = {
- isa = PBXGroup;
- children = (
- 57DF618F1DE781556B7AFC32,
- 7DA35787B5F6F7440D667CC8,
- 2A6983F82B13F9E8B10299AE,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- D1C4804CD275CB57A5C89A2D = {
- isa = PBXGroup;
- children = (
- 86CA337014D3F67E906FFD28,
- D4EBC17BDB7F88CCBC76730B,
- 5ACC21AA45BBF48C3C64D56D,
- 942A0F04EFB8D0B2FF9780BA,
- A4B568E26157FC282214976F,
- B0935EBBA4F6E2B05F3D1C0A,
- 9794142D24966F93FFDE51A1,
- 9F9B445E6755CAA19E4344ED,
- E68018DE199135B7F738FB17,
- 31D55A751C790CB81F58DDB7,
- 5AF0CA7CDFCA90B4DE1F55C3,
- B8774D8AD307D798831C0DF7,
- 4DF6E6E41E10965AD169143B,
- D313CF37B25D7FD313C4F336,
- 89309C0C5F3269BD06BE7F27,
- B457EE687507BF1DEEA7581F,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- D85C0D11EE4F6C73B9EB5BCD = {
- isa = PBXGroup;
- children = (
- 8D8BBC353637DA442C5575DA,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 65BEFC705A89E5C8A9E35C97 = {
- isa = PBXGroup;
- children = (
- 97790EAEA01CFA5C3CA9737A,
- 9D8FE1F65CAD416AA606C47A,
- 7E30376DDAD775FEFE64944C,
- A97EE73C79DA3F729D46AF48,
- D1C4804CD275CB57A5C89A2D,
- D85C0D11EE4F6C73B9EB5BCD,
- );
- name = Source;
- sourceTree = "<group>";
- };
- C8B793AC1BEFBE7A99BE8352 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ FCDB1F8A93F59E0F97821456 = {isa = PBXBuildFile; fileRef = 8D8BBC353637DA442C5575DA; };
+ 73E371F1B912FCCAE0CD7E5D = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; };
+ 21D330A5B13178B12BEAFC3C = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; };
+ B288A89F96704F142ED8E939 = {isa = PBXBuildFile; fileRef = 5ACC21AA45BBF48C3C64D56D; };
+ 851C1165C9E4ACDD19C56A96 = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; };
+ AF42316D915057E930A5624E = {isa = PBXBuildFile; fileRef = A4B568E26157FC282214976F; };
+ 2B4B9CF71F94BDD1E3AC89AE = {isa = PBXBuildFile; fileRef = B0935EBBA4F6E2B05F3D1C0A; };
+ AC3BED74AC7C6D9F5739F38B = {isa = PBXBuildFile; fileRef = 9794142D24966F93FFDE51A1; };
+ E3CB85BA817BC9E3942A8AB0 = {isa = PBXBuildFile; fileRef = 9F9B445E6755CAA19E4344ED; };
+ 70580743C3D5695F065FF698 = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; };
+ 3470F40DA5D68EC217872906 = {isa = PBXBuildFile; fileRef = 31D55A751C790CB81F58DDB7; };
+ E092A70431B046BF1F50A482 = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; };
+ E2BAA7CFC729809530FD71EE = {isa = PBXBuildFile; fileRef = B8774D8AD307D798831C0DF7; };
+ 68FBFDA1FE637B3EDA09A592 = {isa = PBXBuildFile; fileRef = 4DF6E6E41E10965AD169143B; };
+ BBA1733CF8B064A5FD0B4CF4 = {isa = PBXBuildFile; fileRef = D313CF37B25D7FD313C4F336; };
+ A02C9F4C4B840C27B6CAFEBD = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; };
+ 4DB15177DDC357F4503F88CF = {isa = PBXBuildFile; fileRef = B457EE687507BF1DEEA7581F; };
+ D92C7BF86C9CCF6B4D14F809 = {isa = PBXBuildFile; fileRef = 7DA35787B5F6F7440D667CC8; };
+ 443244451A0F2064D4767337 = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; };
+ 2E74188531792924F0C73142 = {isa = PBXBuildFile; fileRef = 05863BDFC582C9552A86DF49; };
+ C8423A9611C8AAF27468847D = {isa = PBXBuildFile; fileRef = 336FD30C38BD0A176161B8AE; };
+ 786AF545C1C1E4D11140C3DF = {isa = PBXBuildFile; fileRef = 43647951ECC7F030B9953965; };
+ 3E1689E23B9C85F03209DCEF = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; };
+ F635D974599DEC2ED91E6A88 = {isa = PBXBuildFile; fileRef = 04AABCD3491318FB32E844B4; };
+ A1B0416DA378BB0C3AD6F74B = {isa = PBXBuildFile; fileRef = A66EFAC64B1B67B536C73415; };
+ A0144A682BF4843C8CF53FE4 = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; };
+ 15CCE43D7DCFC649638919D4 = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; };
+ 5C4D406B924230F83E3580AD = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; };
+ F4DD98B9310B679D50A2C8A6 = {isa = PBXBuildFile; fileRef = 5D250A57C7DEA80248F30EED; };
+ CAF0DE157C8F7D9F168AA3B6 = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; };
+ 0F20A4AE04736634F097F5A6 = {isa = PBXBuildFile; fileRef = B285CAB91AE928C476CA4F9C; };
+ 76A80851698FC773D2479B4E = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; };
+ E4A926EF695823F0F13268FF = {isa = PBXBuildFile; fileRef = B8E24A5CEE6B7055537725CF; };
+ A09E93F1B354E1FF8B3E9ABE = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; };
+ 7DE202DC1D876F49266D9E7D = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; };
+ 075C54DDDBDEA5AAD2F60154 = {isa = PBXBuildFile; fileRef = 82800DBA287EF4BAB13B42FB; };
+ 2C3D221D2AA87F07B3F1044D = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; };
+ C38D14DC58F1941DD5E4BF60 = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; };
+ 2727A191DB1BAAC9C04B9081 = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; };
+ 84BAFE82A102D9C350672689 = {isa = PBXBuildFile; fileRef = 29D746FC68F69751796671A2; };
+ 04AABCD3491318FB32E844B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainHostWindow.cpp; path = ../../Source/UI/MainHostWindow.cpp; sourceTree = "SOURCE_ROOT"; };
+ 04DB9A49969ECC740CC25665 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/UI/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
+ 05863BDFC582C9552A86DF49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterGraph.cpp; path = ../../Source/Filters/FilterGraph.cpp; sourceTree = "SOURCE_ROOT"; };
+ 1DADAD8E34AAF4AFF1C69DC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+ 29D746FC68F69751796671A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+ 2A6983F82B13F9E8B10299AE = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ 2BE6C2DFD6EBB9A89109AEB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 30F22843EFEBF7AA841EB4D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 31D55A751C790CB81F58DDB7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+ 336FD30C38BD0A176161B8AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterIOConfiguration.cpp; path = ../../Source/Filters/FilterIOConfiguration.cpp; sourceTree = "SOURCE_ROOT"; };
+ 37E4D5C341406B7072120006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 3C070DD522CDD11FFC87425D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ 3D57FE2A8877F12A61054726 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 3D78A731234A833CA112AE45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GraphEditorPanel.cpp; path = ../../Source/UI/GraphEditorPanel.cpp; sourceTree = "SOURCE_ROOT"; };
+ 43647951ECC7F030B9953965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InternalFilters.cpp; path = ../../Source/Filters/InternalFilters.cpp; sourceTree = "SOURCE_ROOT"; };
+ 4C7D82F9274A4F9DBF11235C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 4DF6E6E41E10965AD169143B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 5313EB852E41EE58B199B9A2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 545D57A6AA801B38548B0CAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterGraph.h; path = ../../Source/Filters/FilterGraph.h; sourceTree = "SOURCE_ROOT"; };
+ 57DF618F1DE781556B7AFC32 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 59842A98E5EBBC54B50C04CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 5ACC21AA45BBF48C3C64D56D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
+ 5AF0CA7CDFCA90B4DE1F55C3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 5D250A57C7DEA80248F30EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5EF1D381F42AA8764597F189 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5FBD6C402617272052BB4D81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ 65968EA1B476D71F14DE1D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 683CEE986A2467C850FE99E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6A71B2BCAC4239072BC2BD7E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 6D107D7946DC5976B766345B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 725D0D9C8C7FF7B3FB3020ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterIOConfiguration.h; path = ../../Source/Filters/FilterIOConfiguration.h; sourceTree = "SOURCE_ROOT"; };
+ 7DA35787B5F6F7440D667CC8 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 81C1A7770E082F56FE5A90A7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 82800DBA287EF4BAB13B42FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 8290D7BAC160B3A56B66891A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 86CA337014D3F67E906FFD28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 89309C0C5F3269BD06BE7F27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 8D8BBC353637DA442C5575DA = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioPluginHost.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 8FE7B37CDE0818DB27BDDEBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 938AE72315C6C93949F6220E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 942A0F04EFB8D0B2FF9780BA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ 94CB96C8E4B51F52776C2638 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 97918AB43AD460AFA8FA2FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = "SOURCE_ROOT"; };
+ 9794142D24966F93FFDE51A1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 9EBEE3AE5856E877478607C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalFilters.h; path = ../../Source/Filters/InternalFilters.h; sourceTree = "SOURCE_ROOT"; };
+ 9F9B445E6755CAA19E4344ED = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ A4B568E26157FC282214976F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+ A5DFC13E4F09134B0D226A3E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = "SOURCE_ROOT"; };
+ A5E7CA8A71D049BE2BD33861 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ A66EFAC64B1B67B536C73415 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = "SOURCE_ROOT"; };
+ B0935EBBA4F6E2B05F3D1C0A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ B285CAB91AE928C476CA4F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ B2A1E626CC120982805754F6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+ B457EE687507BF1DEEA7581F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ B86B918291E1090C6A720971 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ B8774D8AD307D798831C0DF7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ B8E24A5CEE6B7055537725CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ D313CF37B25D7FD313C4F336 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+ D4EBC17BDB7F88CCBC76730B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ DDE115D3084ACA6DD6AA4471 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+ E68018DE199135B7F738FB17 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ F299BECFB2AEA6105F014848 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ F9AC862E9A3583B6C1488EE0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ FA21631C5536EA3DF55C7FA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ FAF867E9E731D0880D40511F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ AA37F82D57C9BB4BE78FCCB9 = {isa = PBXGroup; children = (
+ 05863BDFC582C9552A86DF49,
+ 545D57A6AA801B38548B0CAC,
+ 336FD30C38BD0A176161B8AE,
+ 725D0D9C8C7FF7B3FB3020ED,
+ 43647951ECC7F030B9953965,
+ 9EBEE3AE5856E877478607C7, ); name = Filters; sourceTree = "<group>"; };
+ DE7B77306553B1204071B39A = {isa = PBXGroup; children = (
+ 3D78A731234A833CA112AE45,
+ 04DB9A49969ECC740CC25665,
+ 04AABCD3491318FB32E844B4,
+ A5DFC13E4F09134B0D226A3E,
+ 97918AB43AD460AFA8FA2FFE, ); name = UI; sourceTree = "<group>"; };
+ B225B7F2CAABD28A41E7C339 = {isa = PBXGroup; children = (
+ AA37F82D57C9BB4BE78FCCB9,
+ DE7B77306553B1204071B39A,
+ A66EFAC64B1B67B536C73415,
+ B2A1E626CC120982805754F6, ); name = Source; sourceTree = "<group>"; };
+ 97790EAEA01CFA5C3CA9737A = {isa = PBXGroup; children = (
+ B225B7F2CAABD28A41E7C339, ); name = AudioPluginHost; sourceTree = "<group>"; };
+ 9D8FE1F65CAD416AA606C47A = {isa = PBXGroup; children = (
+ 6A71B2BCAC4239072BC2BD7E,
+ 5313EB852E41EE58B199B9A2,
+ F9AC862E9A3583B6C1488EE0,
+ FAF867E9E731D0880D40511F,
+ 3C070DD522CDD11FFC87425D,
+ 3D57FE2A8877F12A61054726,
+ FA21631C5536EA3DF55C7FA6,
+ B86B918291E1090C6A720971,
+ 59842A98E5EBBC54B50C04CD,
+ 94CB96C8E4B51F52776C2638,
+ 938AE72315C6C93949F6220E,
+ F299BECFB2AEA6105F014848,
+ 81C1A7770E082F56FE5A90A7,
+ DDE115D3084ACA6DD6AA4471, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 7E30376DDAD775FEFE64944C = {isa = PBXGroup; children = (
+ 30F22843EFEBF7AA841EB4D6,
+ 6D107D7946DC5976B766345B,
+ 1DADAD8E34AAF4AFF1C69DC4,
+ 4C7D82F9274A4F9DBF11235C,
+ 65968EA1B476D71F14DE1D58,
+ 5D250A57C7DEA80248F30EED,
+ 5FBD6C402617272052BB4D81,
+ B285CAB91AE928C476CA4F9C,
+ 683CEE986A2467C850FE99E6,
+ B8E24A5CEE6B7055537725CF,
+ 5EF1D381F42AA8764597F189,
+ 8290D7BAC160B3A56B66891A,
+ 82800DBA287EF4BAB13B42FB,
+ 8FE7B37CDE0818DB27BDDEBD,
+ 2BE6C2DFD6EBB9A89109AEB5,
+ 37E4D5C341406B7072120006,
+ 29D746FC68F69751796671A2,
+ A5E7CA8A71D049BE2BD33861, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ A97EE73C79DA3F729D46AF48 = {isa = PBXGroup; children = (
+ 57DF618F1DE781556B7AFC32,
+ 7DA35787B5F6F7440D667CC8,
+ 2A6983F82B13F9E8B10299AE, ); name = Resources; sourceTree = "<group>"; };
+ D1C4804CD275CB57A5C89A2D = {isa = PBXGroup; children = (
+ 86CA337014D3F67E906FFD28,
+ D4EBC17BDB7F88CCBC76730B,
+ 5ACC21AA45BBF48C3C64D56D,
+ 942A0F04EFB8D0B2FF9780BA,
+ A4B568E26157FC282214976F,
+ B0935EBBA4F6E2B05F3D1C0A,
+ 9794142D24966F93FFDE51A1,
+ 9F9B445E6755CAA19E4344ED,
+ E68018DE199135B7F738FB17,
+ 31D55A751C790CB81F58DDB7,
+ 5AF0CA7CDFCA90B4DE1F55C3,
+ B8774D8AD307D798831C0DF7,
+ 4DF6E6E41E10965AD169143B,
+ D313CF37B25D7FD313C4F336,
+ 89309C0C5F3269BD06BE7F27,
+ B457EE687507BF1DEEA7581F, ); name = Frameworks; sourceTree = "<group>"; };
+ D85C0D11EE4F6C73B9EB5BCD = {isa = PBXGroup; children = (
+ 8D8BBC353637DA442C5575DA, ); name = Products; sourceTree = "<group>"; };
+ 65BEFC705A89E5C8A9E35C97 = {isa = PBXGroup; children = (
+ 97790EAEA01CFA5C3CA9737A,
+ 9D8FE1F65CAD416AA606C47A,
+ 7E30376DDAD775FEFE64944C,
+ A97EE73C79DA3F729D46AF48,
+ D1C4804CD275CB57A5C89A2D,
+ D85C0D11EE4F6C73B9EB5BCD, ); name = Source; sourceTree = "<group>"; };
+ C8B793AC1BEFBE7A99BE8352 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi";
PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
- PRODUCT_NAME = "AudioPluginHost";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 49453CC5AD9F08D2738464AC = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 49453CC5AD9F08D2738464AC = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wstrict-aliasing -Wconversion -Wsign-compare -Woverloaded-virtual -Wextra-semi";
PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
- PRODUCT_NAME = "AudioPluginHost";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- 8D1CA827F1EFD443BDCF198A = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ 8D1CA827F1EFD443BDCF198A = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "AudioPluginHost";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- C9295196717FABE454A210B7 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ C9295196717FABE454A210B7 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "AudioPluginHost";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- B9D79D85AC7DE5BED1B6547C = {
- isa = PBXTargetDependency;
- target = DE12B7643D374BFF7E4FEB1C;
- };
- 493C2C5E457692E5149C5525 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 8D1CA827F1EFD443BDCF198A,
- C9295196717FABE454A210B7,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- E4ECAE24A646A7D1585F776C = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C8B793AC1BEFBE7A99BE8352,
- 49453CC5AD9F08D2738464AC,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 2429BB4D705CC57F49418CFB = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D92C7BF86C9CCF6B4D14F809,
- 443244451A0F2064D4767337,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E8E94B3C187DA578BFCBDA98 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2E74188531792924F0C73142,
- C8423A9611C8AAF27468847D,
- 786AF545C1C1E4D11140C3DF,
- 3E1689E23B9C85F03209DCEF,
- F635D974599DEC2ED91E6A88,
- A1B0416DA378BB0C3AD6F74B,
- A0144A682BF4843C8CF53FE4,
- 15CCE43D7DCFC649638919D4,
- 5C4D406B924230F83E3580AD,
- F4DD98B9310B679D50A2C8A6,
- CAF0DE157C8F7D9F168AA3B6,
- 0F20A4AE04736634F097F5A6,
- 76A80851698FC773D2479B4E,
- E4A926EF695823F0F13268FF,
- A09E93F1B354E1FF8B3E9ABE,
- 7DE202DC1D876F49266D9E7D,
- 075C54DDDBDEA5AAD2F60154,
- 2C3D221D2AA87F07B3F1044D,
- C38D14DC58F1941DD5E4BF60,
- 2727A191DB1BAAC9C04B9081,
- 84BAFE82A102D9C350672689,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C515A1FE1A53D3968C22FAEF = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 73E371F1B912FCCAE0CD7E5D,
- 21D330A5B13178B12BEAFC3C,
- B288A89F96704F142ED8E939,
- 851C1165C9E4ACDD19C56A96,
- AF42316D915057E930A5624E,
- 2B4B9CF71F94BDD1E3AC89AE,
- AC3BED74AC7C6D9F5739F38B,
- E3CB85BA817BC9E3942A8AB0,
- 70580743C3D5695F065FF698,
- 3470F40DA5D68EC217872906,
- E092A70431B046BF1F50A482,
- E2BAA7CFC729809530FD71EE,
- 68FBFDA1FE637B3EDA09A592,
- BBA1733CF8B064A5FD0B4CF4,
- A02C9F4C4B840C27B6CAFEBD,
- 4DB15177DDC357F4503F88CF,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DE12B7643D374BFF7E4FEB1C = {
- isa = PBXNativeTarget;
- buildConfigurationList = E4ECAE24A646A7D1585F776C;
- buildPhases = (
- 2429BB4D705CC57F49418CFB,
- E8E94B3C187DA578BFCBDA98,
- C515A1FE1A53D3968C22FAEF,
- );
- buildRules = ( );
- dependencies = ( );
- name = "AudioPluginHost - App";
- productName = AudioPluginHost;
- productReference = 8D8BBC353637DA442C5575DA;
- productType = "com.apple.product-type.application";
- };
- ADE6E539DB98A302483A82D0 = {
- isa = PBXProject;
- buildConfigurationList = 493C2C5E457692E5149C5525;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 65BEFC705A89E5C8A9E35C97;
- projectDirPath = "";
- projectRoot = "";
- targets = (DE12B7643D374BFF7E4FEB1C);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ B9D79D85AC7DE5BED1B6547C = {isa = PBXTargetDependency; target = DE12B7643D374BFF7E4FEB1C; };
+ 493C2C5E457692E5149C5525 = {isa = XCConfigurationList; buildConfigurations = (
+ 8D1CA827F1EFD443BDCF198A,
+ C9295196717FABE454A210B7, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ E4ECAE24A646A7D1585F776C = {isa = XCConfigurationList; buildConfigurations = (
+ C8B793AC1BEFBE7A99BE8352,
+ 49453CC5AD9F08D2738464AC, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 2429BB4D705CC57F49418CFB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ D92C7BF86C9CCF6B4D14F809,
+ 443244451A0F2064D4767337, ); runOnlyForDeploymentPostprocessing = 0; };
+ E8E94B3C187DA578BFCBDA98 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 2E74188531792924F0C73142,
+ C8423A9611C8AAF27468847D,
+ 786AF545C1C1E4D11140C3DF,
+ 3E1689E23B9C85F03209DCEF,
+ F635D974599DEC2ED91E6A88,
+ A1B0416DA378BB0C3AD6F74B,
+ A0144A682BF4843C8CF53FE4,
+ 15CCE43D7DCFC649638919D4,
+ 5C4D406B924230F83E3580AD,
+ F4DD98B9310B679D50A2C8A6,
+ CAF0DE157C8F7D9F168AA3B6,
+ 0F20A4AE04736634F097F5A6,
+ 76A80851698FC773D2479B4E,
+ E4A926EF695823F0F13268FF,
+ A09E93F1B354E1FF8B3E9ABE,
+ 7DE202DC1D876F49266D9E7D,
+ 075C54DDDBDEA5AAD2F60154,
+ 2C3D221D2AA87F07B3F1044D,
+ C38D14DC58F1941DD5E4BF60,
+ 2727A191DB1BAAC9C04B9081,
+ 84BAFE82A102D9C350672689, ); runOnlyForDeploymentPostprocessing = 0; };
+ C515A1FE1A53D3968C22FAEF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 73E371F1B912FCCAE0CD7E5D,
+ 21D330A5B13178B12BEAFC3C,
+ B288A89F96704F142ED8E939,
+ 851C1165C9E4ACDD19C56A96,
+ AF42316D915057E930A5624E,
+ 2B4B9CF71F94BDD1E3AC89AE,
+ AC3BED74AC7C6D9F5739F38B,
+ E3CB85BA817BC9E3942A8AB0,
+ 70580743C3D5695F065FF698,
+ 3470F40DA5D68EC217872906,
+ E092A70431B046BF1F50A482,
+ E2BAA7CFC729809530FD71EE,
+ 68FBFDA1FE637B3EDA09A592,
+ BBA1733CF8B064A5FD0B4CF4,
+ A02C9F4C4B840C27B6CAFEBD,
+ 4DB15177DDC357F4503F88CF, ); runOnlyForDeploymentPostprocessing = 0; };
+ DE12B7643D374BFF7E4FEB1C = {isa = PBXNativeTarget; buildConfigurationList = E4ECAE24A646A7D1585F776C; buildPhases = (
+ 2429BB4D705CC57F49418CFB,
+ E8E94B3C187DA578BFCBDA98,
+ C515A1FE1A53D3968C22FAEF, ); buildRules = ( ); dependencies = ( ); name = "AudioPluginHost - App"; productName = AudioPluginHost; productReference = 8D8BBC353637DA442C5575DA; productType = "com.apple.product-type.application"; };
+ ADE6E539DB98A302483A82D0 = {isa = PBXProject; buildConfigurationList = 493C2C5E457692E5149C5525; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 65BEFC705A89E5C8A9E35C97; projectDirPath = ""; projectRoot = ""; targets = (DE12B7643D374BFF7E4FEB1C); };
};
rootObject = ADE6E539DB98A302483A82D0;
}
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
<plist>\r
<dict>\r
- <key>NSMicrophoneUsageDescription</key>\r
- <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
<key>CFBundleExecutable</key>\r
<string>${EXECUTABLE_NAME}</string>\r
<key>CFBundleIconFile</key>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AudioPluginHost</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
<Midl>\r
<ClCompile>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
</Midl>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
<None Include=".\icon.ico"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPluginHost</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<ClCompile>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
</Midl>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
<None Include=".\icon.ico"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{5666EAA2-C82B-D06A-5228-D0E810428536}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AudioPluginHost</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<ClCompile>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
</Midl>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
- <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <AdditionalIncludeDirectories>C:\SDKs\VST_SDK\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<None Include="..\..\Source\JUCEAppIcon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
<None Include=".\icon.ico"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
};
objectVersion = 46;
objects = {
- FCDB1F8A93F59E0F97821456 = {
- isa = PBXBuildFile;
- fileRef = 8D8BBC353637DA442C5575DA;
- };
- 73E371F1B912FCCAE0CD7E5D = {
- isa = PBXBuildFile;
- fileRef = 86CA337014D3F67E906FFD28;
- };
- 21D330A5B13178B12BEAFC3C = {
- isa = PBXBuildFile;
- fileRef = D4EBC17BDB7F88CCBC76730B;
- };
- 851C1165C9E4ACDD19C56A96 = {
- isa = PBXBuildFile;
- fileRef = 942A0F04EFB8D0B2FF9780BA;
- };
- AF42316D915057E930A5624E = {
- isa = PBXBuildFile;
- fileRef = A4B568E26157FC282214976F;
- };
- E3CB85BA817BC9E3942A8AB0 = {
- isa = PBXBuildFile;
- fileRef = 9F9B445E6755CAA19E4344ED;
- };
- 70580743C3D5695F065FF698 = {
- isa = PBXBuildFile;
- fileRef = E68018DE199135B7F738FB17;
- };
- 1570FCC5CDB7A44DF0077E39 = {
- isa = PBXBuildFile;
- fileRef = 2F7D965A1284CEF0B20EB657;
- };
- B0D5475F716126465FCE1586 = {
- isa = PBXBuildFile;
- fileRef = CFFA8E9A7820C5A27B4393C9;
- };
- 3470F40DA5D68EC217872906 = {
- isa = PBXBuildFile;
- fileRef = 31D55A751C790CB81F58DDB7;
- };
- E092A70431B046BF1F50A482 = {
- isa = PBXBuildFile;
- fileRef = 5AF0CA7CDFCA90B4DE1F55C3;
- };
- 92EE84159C7027A137F06204 = {
- isa = PBXBuildFile;
- fileRef = 66643EDF46AE8C5B7956B91D;
- };
- 9056B642BEF870098DE344E5 = {
- isa = PBXBuildFile;
- fileRef = 03FA420AACDD03D50AA16E4A;
- };
- 7DE81C004B0FBC563040CC5F = {
- isa = PBXBuildFile;
- fileRef = B1CD9599EB12D77E8AF9241D;
- };
- 2AB9A26C9359C40CA0A937ED = {
- isa = PBXBuildFile;
- fileRef = D0026F0A29B486D87E92BB8B;
- };
- A02C9F4C4B840C27B6CAFEBD = {
- isa = PBXBuildFile;
- fileRef = 89309C0C5F3269BD06BE7F27;
- };
- 50AFD116DCA6EC228EFB322D = {
- isa = PBXBuildFile;
- fileRef = F9EDC54DFBCF3A63E0AA5D73;
- };
- 59F4F23BFFDAB414B4801F85 = {
- isa = PBXBuildFile;
- fileRef = 29E0972229FB44D969035B4E;
- };
- 443244451A0F2064D4767337 = {
- isa = PBXBuildFile;
- fileRef = 2A6983F82B13F9E8B10299AE;
- };
- 2E74188531792924F0C73142 = {
- isa = PBXBuildFile;
- fileRef = 05863BDFC582C9552A86DF49;
- };
- C8423A9611C8AAF27468847D = {
- isa = PBXBuildFile;
- fileRef = 336FD30C38BD0A176161B8AE;
- };
- 786AF545C1C1E4D11140C3DF = {
- isa = PBXBuildFile;
- fileRef = 43647951ECC7F030B9953965;
- };
- 3E1689E23B9C85F03209DCEF = {
- isa = PBXBuildFile;
- fileRef = 3D78A731234A833CA112AE45;
- };
- F635D974599DEC2ED91E6A88 = {
- isa = PBXBuildFile;
- fileRef = 04AABCD3491318FB32E844B4;
- };
- A1B0416DA378BB0C3AD6F74B = {
- isa = PBXBuildFile;
- fileRef = A66EFAC64B1B67B536C73415;
- };
- A0144A682BF4843C8CF53FE4 = {
- isa = PBXBuildFile;
- fileRef = 6D107D7946DC5976B766345B;
- };
- 15CCE43D7DCFC649638919D4 = {
- isa = PBXBuildFile;
- fileRef = 4C7D82F9274A4F9DBF11235C;
- };
- 5C4D406B924230F83E3580AD = {
- isa = PBXBuildFile;
- fileRef = 65968EA1B476D71F14DE1D58;
- };
- F4DD98B9310B679D50A2C8A6 = {
- isa = PBXBuildFile;
- fileRef = 5D250A57C7DEA80248F30EED;
- };
- CAF0DE157C8F7D9F168AA3B6 = {
- isa = PBXBuildFile;
- fileRef = 5FBD6C402617272052BB4D81;
- };
- 0F20A4AE04736634F097F5A6 = {
- isa = PBXBuildFile;
- fileRef = B285CAB91AE928C476CA4F9C;
- };
- 76A80851698FC773D2479B4E = {
- isa = PBXBuildFile;
- fileRef = 683CEE986A2467C850FE99E6;
- };
- E4A926EF695823F0F13268FF = {
- isa = PBXBuildFile;
- fileRef = B8E24A5CEE6B7055537725CF;
- };
- A09E93F1B354E1FF8B3E9ABE = {
- isa = PBXBuildFile;
- fileRef = 5EF1D381F42AA8764597F189;
- };
- 7DE202DC1D876F49266D9E7D = {
- isa = PBXBuildFile;
- fileRef = 8290D7BAC160B3A56B66891A;
- };
- 075C54DDDBDEA5AAD2F60154 = {
- isa = PBXBuildFile;
- fileRef = 82800DBA287EF4BAB13B42FB;
- };
- 2C3D221D2AA87F07B3F1044D = {
- isa = PBXBuildFile;
- fileRef = 8FE7B37CDE0818DB27BDDEBD;
- };
- C38D14DC58F1941DD5E4BF60 = {
- isa = PBXBuildFile;
- fileRef = 2BE6C2DFD6EBB9A89109AEB5;
- };
- 2727A191DB1BAAC9C04B9081 = {
- isa = PBXBuildFile;
- fileRef = 37E4D5C341406B7072120006;
- };
- 84BAFE82A102D9C350672689 = {
- isa = PBXBuildFile;
- fileRef = 29D746FC68F69751796671A2;
- };
- 03FA420AACDD03D50AA16E4A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Foundation.framework;
- path = System/Library/Frameworks/Foundation.framework;
- sourceTree = SDKROOT;
- };
- 04AABCD3491318FB32E844B4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = MainHostWindow.cpp;
- path = ../../Source/UI/MainHostWindow.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 04DB9A49969ECC740CC25665 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = GraphEditorPanel.h;
- path = ../../Source/UI/GraphEditorPanel.h;
- sourceTree = "SOURCE_ROOT";
- };
- 05863BDFC582C9552A86DF49 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = FilterGraph.cpp;
- path = ../../Source/Filters/FilterGraph.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 1DADAD8E34AAF4AFF1C69DC4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = BinaryData.h;
- path = ../../JuceLibraryCode/BinaryData.h;
- sourceTree = "SOURCE_ROOT";
- };
- 29D746FC68F69751796671A2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_video.mm";
- path = "../../JuceLibraryCode/include_juce_video.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 29E0972229FB44D969035B4E = {
- isa = PBXFileReference;
- lastKnownFileType = folder.assetcatalog;
- name = Images.xcassets;
- path = AudioPluginHost/Images.xcassets;
- sourceTree = "SOURCE_ROOT";
- };
- 2A6983F82B13F9E8B10299AE = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- 2BE6C2DFD6EBB9A89109AEB5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 2F7D965A1284CEF0B20EB657 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreGraphics.framework;
- path = System/Library/Frameworks/CoreGraphics.framework;
- sourceTree = SDKROOT;
- };
- 30F22843EFEBF7AA841EB4D6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 31D55A751C790CB81F58DDB7 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMedia.framework;
- path = System/Library/Frameworks/CoreMedia.framework;
- sourceTree = SDKROOT;
- };
- 336FD30C38BD0A176161B8AE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = FilterIOConfiguration.cpp;
- path = ../../Source/Filters/FilterIOConfiguration.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 37E4D5C341406B7072120006 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 3C070DD522CDD11FFC87425D = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- 3D57FE2A8877F12A61054726 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 3D78A731234A833CA112AE45 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = GraphEditorPanel.cpp;
- path = ../../Source/UI/GraphEditorPanel.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 43647951ECC7F030B9953965 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = InternalFilters.cpp;
- path = ../../Source/Filters/InternalFilters.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 4C7D82F9274A4F9DBF11235C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5313EB852E41EE58B199B9A2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 545D57A6AA801B38548B0CAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = FilterGraph.h;
- path = ../../Source/Filters/FilterGraph.h;
- sourceTree = "SOURCE_ROOT";
- };
- 57DF618F1DE781556B7AFC32 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 59842A98E5EBBC54B50C04CD = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 5AF0CA7CDFCA90B4DE1F55C3 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 5D250A57C7DEA80248F30EED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5EF1D381F42AA8764597F189 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5FBD6C402617272052BB4D81 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 65968EA1B476D71F14DE1D58 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 66643EDF46AE8C5B7956B91D = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreText.framework;
- path = System/Library/Frameworks/CoreText.framework;
- sourceTree = SDKROOT;
- };
- 683CEE986A2467C850FE99E6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 6A71B2BCAC4239072BC2BD7E = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 6D107D7946DC5976B766345B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = BinaryData.cpp;
- path = ../../JuceLibraryCode/BinaryData.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 725D0D9C8C7FF7B3FB3020ED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = FilterIOConfiguration.h;
- path = ../../Source/Filters/FilterIOConfiguration.h;
- sourceTree = "SOURCE_ROOT";
- };
- 81C1A7770E082F56FE5A90A7 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 82800DBA287EF4BAB13B42FB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 8290D7BAC160B3A56B66891A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 86CA337014D3F67E906FFD28 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 89309C0C5F3269BD06BE7F27 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 8D8BBC353637DA442C5575DA = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = "Plugin Host.app";
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 8FE7B37CDE0818DB27BDDEBD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 938AE72315C6C93949F6220E = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 942A0F04EFB8D0B2FF9780BA = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- 94CB96C8E4B51F52776C2638 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 97918AB43AD460AFA8FA2FFE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = PluginWindow.h;
- path = ../../Source/UI/PluginWindow.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9EBEE3AE5856E877478607C7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = InternalFilters.h;
- path = ../../Source/Filters/InternalFilters.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9F9B445E6755CAA19E4344ED = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- A4B568E26157FC282214976F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVKit.framework;
- path = System/Library/Frameworks/AVKit.framework;
- sourceTree = SDKROOT;
- };
- A5DFC13E4F09134B0D226A3E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MainHostWindow.h;
- path = ../../Source/UI/MainHostWindow.h;
- sourceTree = "SOURCE_ROOT";
- };
- A5E7CA8A71D049BE2BD33861 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- A66EFAC64B1B67B536C73415 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = HostStartup.cpp;
- path = ../../Source/HostStartup.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- B1CD9599EB12D77E8AF9241D = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = MobileCoreServices.framework;
- path = System/Library/Frameworks/MobileCoreServices.framework;
- sourceTree = SDKROOT;
- };
- B285CAB91AE928C476CA4F9C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- B2A1E626CC120982805754F6 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = JUCEAppIcon.png;
- path = ../../Source/JUCEAppIcon.png;
- sourceTree = "SOURCE_ROOT";
- };
- B86B918291E1090C6A720971 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- B8E24A5CEE6B7055537725CF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- CFFA8E9A7820C5A27B4393C9 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreImage.framework;
- path = System/Library/Frameworks/CoreImage.framework;
- sourceTree = SDKROOT;
- };
- D0026F0A29B486D87E92BB8B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGLES.framework;
- path = System/Library/Frameworks/OpenGLES.framework;
- sourceTree = SDKROOT;
- };
- D4EBC17BDB7F88CCBC76730B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- DDE115D3084ACA6DD6AA4471 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_video";
- path = "../../../../modules/juce_video";
- sourceTree = "SOURCE_ROOT";
- };
- E68018DE199135B7F738FB17 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- F299BECFB2AEA6105F014848 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- F9AC862E9A3583B6C1488EE0 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- F9EDC54DFBCF3A63E0AA5D73 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = UIKit.framework;
- path = System/Library/Frameworks/UIKit.framework;
- sourceTree = SDKROOT;
- };
- FA21631C5536EA3DF55C7FA6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- FAF867E9E731D0880D40511F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- AA37F82D57C9BB4BE78FCCB9 = {
- isa = PBXGroup;
- children = (
- 05863BDFC582C9552A86DF49,
- 545D57A6AA801B38548B0CAC,
- 336FD30C38BD0A176161B8AE,
- 725D0D9C8C7FF7B3FB3020ED,
- 43647951ECC7F030B9953965,
- 9EBEE3AE5856E877478607C7,
- );
- name = Filters;
- sourceTree = "<group>";
- };
- DE7B77306553B1204071B39A = {
- isa = PBXGroup;
- children = (
- 3D78A731234A833CA112AE45,
- 04DB9A49969ECC740CC25665,
- 04AABCD3491318FB32E844B4,
- A5DFC13E4F09134B0D226A3E,
- 97918AB43AD460AFA8FA2FFE,
- );
- name = UI;
- sourceTree = "<group>";
- };
- B225B7F2CAABD28A41E7C339 = {
- isa = PBXGroup;
- children = (
- AA37F82D57C9BB4BE78FCCB9,
- DE7B77306553B1204071B39A,
- A66EFAC64B1B67B536C73415,
- B2A1E626CC120982805754F6,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 97790EAEA01CFA5C3CA9737A = {
- isa = PBXGroup;
- children = (
- B225B7F2CAABD28A41E7C339,
- );
- name = AudioPluginHost;
- sourceTree = "<group>";
- };
- 9D8FE1F65CAD416AA606C47A = {
- isa = PBXGroup;
- children = (
- 6A71B2BCAC4239072BC2BD7E,
- 5313EB852E41EE58B199B9A2,
- F9AC862E9A3583B6C1488EE0,
- FAF867E9E731D0880D40511F,
- 3C070DD522CDD11FFC87425D,
- 3D57FE2A8877F12A61054726,
- FA21631C5536EA3DF55C7FA6,
- B86B918291E1090C6A720971,
- 59842A98E5EBBC54B50C04CD,
- 94CB96C8E4B51F52776C2638,
- 938AE72315C6C93949F6220E,
- F299BECFB2AEA6105F014848,
- 81C1A7770E082F56FE5A90A7,
- DDE115D3084ACA6DD6AA4471,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 7E30376DDAD775FEFE64944C = {
- isa = PBXGroup;
- children = (
- 30F22843EFEBF7AA841EB4D6,
- 6D107D7946DC5976B766345B,
- 1DADAD8E34AAF4AFF1C69DC4,
- 4C7D82F9274A4F9DBF11235C,
- 65968EA1B476D71F14DE1D58,
- 5D250A57C7DEA80248F30EED,
- 5FBD6C402617272052BB4D81,
- B285CAB91AE928C476CA4F9C,
- 683CEE986A2467C850FE99E6,
- B8E24A5CEE6B7055537725CF,
- 5EF1D381F42AA8764597F189,
- 8290D7BAC160B3A56B66891A,
- 82800DBA287EF4BAB13B42FB,
- 8FE7B37CDE0818DB27BDDEBD,
- 2BE6C2DFD6EBB9A89109AEB5,
- 37E4D5C341406B7072120006,
- 29D746FC68F69751796671A2,
- A5E7CA8A71D049BE2BD33861,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- A97EE73C79DA3F729D46AF48 = {
- isa = PBXGroup;
- children = (
- 57DF618F1DE781556B7AFC32,
- 29E0972229FB44D969035B4E,
- 2A6983F82B13F9E8B10299AE,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- D1C4804CD275CB57A5C89A2D = {
- isa = PBXGroup;
- children = (
- 86CA337014D3F67E906FFD28,
- D4EBC17BDB7F88CCBC76730B,
- 942A0F04EFB8D0B2FF9780BA,
- A4B568E26157FC282214976F,
- 9F9B445E6755CAA19E4344ED,
- E68018DE199135B7F738FB17,
- 2F7D965A1284CEF0B20EB657,
- CFFA8E9A7820C5A27B4393C9,
- 31D55A751C790CB81F58DDB7,
- 5AF0CA7CDFCA90B4DE1F55C3,
- 66643EDF46AE8C5B7956B91D,
- 03FA420AACDD03D50AA16E4A,
- B1CD9599EB12D77E8AF9241D,
- D0026F0A29B486D87E92BB8B,
- 89309C0C5F3269BD06BE7F27,
- F9EDC54DFBCF3A63E0AA5D73,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- D85C0D11EE4F6C73B9EB5BCD = {
- isa = PBXGroup;
- children = (
- 8D8BBC353637DA442C5575DA,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 65BEFC705A89E5C8A9E35C97 = {
- isa = PBXGroup;
- children = (
- 97790EAEA01CFA5C3CA9737A,
- 9D8FE1F65CAD416AA606C47A,
- 7E30376DDAD775FEFE64944C,
- A97EE73C79DA3F729D46AF48,
- D1C4804CD275CB57A5C89A2D,
- D85C0D11EE4F6C73B9EB5BCD,
- );
- name = Source;
- sourceTree = "<group>";
- };
- C8B793AC1BEFBE7A99BE8352 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ FCDB1F8A93F59E0F97821456 = {isa = PBXBuildFile; fileRef = 8D8BBC353637DA442C5575DA; };
+ 73E371F1B912FCCAE0CD7E5D = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; };
+ 21D330A5B13178B12BEAFC3C = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; };
+ 851C1165C9E4ACDD19C56A96 = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; };
+ AF42316D915057E930A5624E = {isa = PBXBuildFile; fileRef = A4B568E26157FC282214976F; };
+ E3CB85BA817BC9E3942A8AB0 = {isa = PBXBuildFile; fileRef = 9F9B445E6755CAA19E4344ED; };
+ 70580743C3D5695F065FF698 = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; };
+ 1570FCC5CDB7A44DF0077E39 = {isa = PBXBuildFile; fileRef = 2F7D965A1284CEF0B20EB657; };
+ B0D5475F716126465FCE1586 = {isa = PBXBuildFile; fileRef = CFFA8E9A7820C5A27B4393C9; };
+ 3470F40DA5D68EC217872906 = {isa = PBXBuildFile; fileRef = 31D55A751C790CB81F58DDB7; };
+ E092A70431B046BF1F50A482 = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; };
+ 92EE84159C7027A137F06204 = {isa = PBXBuildFile; fileRef = 66643EDF46AE8C5B7956B91D; };
+ 9056B642BEF870098DE344E5 = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; };
+ 7DE81C004B0FBC563040CC5F = {isa = PBXBuildFile; fileRef = B1CD9599EB12D77E8AF9241D; };
+ 2AB9A26C9359C40CA0A937ED = {isa = PBXBuildFile; fileRef = D0026F0A29B486D87E92BB8B; };
+ A02C9F4C4B840C27B6CAFEBD = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; };
+ 50AFD116DCA6EC228EFB322D = {isa = PBXBuildFile; fileRef = F9EDC54DFBCF3A63E0AA5D73; };
+ 59F4F23BFFDAB414B4801F85 = {isa = PBXBuildFile; fileRef = 29E0972229FB44D969035B4E; };
+ 443244451A0F2064D4767337 = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; };
+ 2E74188531792924F0C73142 = {isa = PBXBuildFile; fileRef = 05863BDFC582C9552A86DF49; };
+ C8423A9611C8AAF27468847D = {isa = PBXBuildFile; fileRef = 336FD30C38BD0A176161B8AE; };
+ 786AF545C1C1E4D11140C3DF = {isa = PBXBuildFile; fileRef = 43647951ECC7F030B9953965; };
+ 3E1689E23B9C85F03209DCEF = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; };
+ F635D974599DEC2ED91E6A88 = {isa = PBXBuildFile; fileRef = 04AABCD3491318FB32E844B4; };
+ A1B0416DA378BB0C3AD6F74B = {isa = PBXBuildFile; fileRef = A66EFAC64B1B67B536C73415; };
+ A0144A682BF4843C8CF53FE4 = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; };
+ 15CCE43D7DCFC649638919D4 = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; };
+ 5C4D406B924230F83E3580AD = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; };
+ F4DD98B9310B679D50A2C8A6 = {isa = PBXBuildFile; fileRef = 5D250A57C7DEA80248F30EED; };
+ CAF0DE157C8F7D9F168AA3B6 = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; };
+ 0F20A4AE04736634F097F5A6 = {isa = PBXBuildFile; fileRef = B285CAB91AE928C476CA4F9C; };
+ 76A80851698FC773D2479B4E = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; };
+ E4A926EF695823F0F13268FF = {isa = PBXBuildFile; fileRef = B8E24A5CEE6B7055537725CF; };
+ A09E93F1B354E1FF8B3E9ABE = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; };
+ 7DE202DC1D876F49266D9E7D = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; };
+ 075C54DDDBDEA5AAD2F60154 = {isa = PBXBuildFile; fileRef = 82800DBA287EF4BAB13B42FB; };
+ 2C3D221D2AA87F07B3F1044D = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; };
+ C38D14DC58F1941DD5E4BF60 = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; };
+ 2727A191DB1BAAC9C04B9081 = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; };
+ 84BAFE82A102D9C350672689 = {isa = PBXBuildFile; fileRef = 29D746FC68F69751796671A2; };
+ 03FA420AACDD03D50AA16E4A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 04AABCD3491318FB32E844B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainHostWindow.cpp; path = ../../Source/UI/MainHostWindow.cpp; sourceTree = "SOURCE_ROOT"; };
+ 04DB9A49969ECC740CC25665 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/UI/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
+ 05863BDFC582C9552A86DF49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterGraph.cpp; path = ../../Source/Filters/FilterGraph.cpp; sourceTree = "SOURCE_ROOT"; };
+ 1DADAD8E34AAF4AFF1C69DC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+ 29D746FC68F69751796671A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+ 29E0972229FB44D969035B4E = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPluginHost/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+ 2A6983F82B13F9E8B10299AE = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ 2BE6C2DFD6EBB9A89109AEB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 2F7D965A1284CEF0B20EB657 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 30F22843EFEBF7AA841EB4D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 31D55A751C790CB81F58DDB7 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+ 336FD30C38BD0A176161B8AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterIOConfiguration.cpp; path = ../../Source/Filters/FilterIOConfiguration.cpp; sourceTree = "SOURCE_ROOT"; };
+ 37E4D5C341406B7072120006 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 3C070DD522CDD11FFC87425D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ 3D57FE2A8877F12A61054726 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 3D78A731234A833CA112AE45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GraphEditorPanel.cpp; path = ../../Source/UI/GraphEditorPanel.cpp; sourceTree = "SOURCE_ROOT"; };
+ 43647951ECC7F030B9953965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InternalFilters.cpp; path = ../../Source/Filters/InternalFilters.cpp; sourceTree = "SOURCE_ROOT"; };
+ 4C7D82F9274A4F9DBF11235C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5313EB852E41EE58B199B9A2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 545D57A6AA801B38548B0CAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterGraph.h; path = ../../Source/Filters/FilterGraph.h; sourceTree = "SOURCE_ROOT"; };
+ 57DF618F1DE781556B7AFC32 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 59842A98E5EBBC54B50C04CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 5AF0CA7CDFCA90B4DE1F55C3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 5D250A57C7DEA80248F30EED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5EF1D381F42AA8764597F189 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5FBD6C402617272052BB4D81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ 65968EA1B476D71F14DE1D58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 66643EDF46AE8C5B7956B91D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+ 683CEE986A2467C850FE99E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6A71B2BCAC4239072BC2BD7E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 6D107D7946DC5976B766345B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 725D0D9C8C7FF7B3FB3020ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterIOConfiguration.h; path = ../../Source/Filters/FilterIOConfiguration.h; sourceTree = "SOURCE_ROOT"; };
+ 81C1A7770E082F56FE5A90A7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 82800DBA287EF4BAB13B42FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 8290D7BAC160B3A56B66891A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 86CA337014D3F67E906FFD28 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 89309C0C5F3269BD06BE7F27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 8D8BBC353637DA442C5575DA = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plugin Host.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 8FE7B37CDE0818DB27BDDEBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 938AE72315C6C93949F6220E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 942A0F04EFB8D0B2FF9780BA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ 94CB96C8E4B51F52776C2638 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 97918AB43AD460AFA8FA2FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = "SOURCE_ROOT"; };
+ 9EBEE3AE5856E877478607C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalFilters.h; path = ../../Source/Filters/InternalFilters.h; sourceTree = "SOURCE_ROOT"; };
+ 9F9B445E6755CAA19E4344ED = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ A4B568E26157FC282214976F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+ A5DFC13E4F09134B0D226A3E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = "SOURCE_ROOT"; };
+ A5E7CA8A71D049BE2BD33861 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ A66EFAC64B1B67B536C73415 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = "SOURCE_ROOT"; };
+ B1CD9599EB12D77E8AF9241D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+ B285CAB91AE928C476CA4F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ B2A1E626CC120982805754F6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = "SOURCE_ROOT"; };
+ B86B918291E1090C6A720971 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ B8E24A5CEE6B7055537725CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ CFFA8E9A7820C5A27B4393C9 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ D0026F0A29B486D87E92BB8B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+ D4EBC17BDB7F88CCBC76730B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ DDE115D3084ACA6DD6AA4471 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+ E68018DE199135B7F738FB17 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ F299BECFB2AEA6105F014848 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ F9AC862E9A3583B6C1488EE0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ F9EDC54DFBCF3A63E0AA5D73 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ FA21631C5536EA3DF55C7FA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ FAF867E9E731D0880D40511F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ AA37F82D57C9BB4BE78FCCB9 = {isa = PBXGroup; children = (
+ 05863BDFC582C9552A86DF49,
+ 545D57A6AA801B38548B0CAC,
+ 336FD30C38BD0A176161B8AE,
+ 725D0D9C8C7FF7B3FB3020ED,
+ 43647951ECC7F030B9953965,
+ 9EBEE3AE5856E877478607C7, ); name = Filters; sourceTree = "<group>"; };
+ DE7B77306553B1204071B39A = {isa = PBXGroup; children = (
+ 3D78A731234A833CA112AE45,
+ 04DB9A49969ECC740CC25665,
+ 04AABCD3491318FB32E844B4,
+ A5DFC13E4F09134B0D226A3E,
+ 97918AB43AD460AFA8FA2FFE, ); name = UI; sourceTree = "<group>"; };
+ B225B7F2CAABD28A41E7C339 = {isa = PBXGroup; children = (
+ AA37F82D57C9BB4BE78FCCB9,
+ DE7B77306553B1204071B39A,
+ A66EFAC64B1B67B536C73415,
+ B2A1E626CC120982805754F6, ); name = Source; sourceTree = "<group>"; };
+ 97790EAEA01CFA5C3CA9737A = {isa = PBXGroup; children = (
+ B225B7F2CAABD28A41E7C339, ); name = AudioPluginHost; sourceTree = "<group>"; };
+ 9D8FE1F65CAD416AA606C47A = {isa = PBXGroup; children = (
+ 6A71B2BCAC4239072BC2BD7E,
+ 5313EB852E41EE58B199B9A2,
+ F9AC862E9A3583B6C1488EE0,
+ FAF867E9E731D0880D40511F,
+ 3C070DD522CDD11FFC87425D,
+ 3D57FE2A8877F12A61054726,
+ FA21631C5536EA3DF55C7FA6,
+ B86B918291E1090C6A720971,
+ 59842A98E5EBBC54B50C04CD,
+ 94CB96C8E4B51F52776C2638,
+ 938AE72315C6C93949F6220E,
+ F299BECFB2AEA6105F014848,
+ 81C1A7770E082F56FE5A90A7,
+ DDE115D3084ACA6DD6AA4471, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 7E30376DDAD775FEFE64944C = {isa = PBXGroup; children = (
+ 30F22843EFEBF7AA841EB4D6,
+ 6D107D7946DC5976B766345B,
+ 1DADAD8E34AAF4AFF1C69DC4,
+ 4C7D82F9274A4F9DBF11235C,
+ 65968EA1B476D71F14DE1D58,
+ 5D250A57C7DEA80248F30EED,
+ 5FBD6C402617272052BB4D81,
+ B285CAB91AE928C476CA4F9C,
+ 683CEE986A2467C850FE99E6,
+ B8E24A5CEE6B7055537725CF,
+ 5EF1D381F42AA8764597F189,
+ 8290D7BAC160B3A56B66891A,
+ 82800DBA287EF4BAB13B42FB,
+ 8FE7B37CDE0818DB27BDDEBD,
+ 2BE6C2DFD6EBB9A89109AEB5,
+ 37E4D5C341406B7072120006,
+ 29D746FC68F69751796671A2,
+ A5E7CA8A71D049BE2BD33861, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ A97EE73C79DA3F729D46AF48 = {isa = PBXGroup; children = (
+ 57DF618F1DE781556B7AFC32,
+ 29E0972229FB44D969035B4E,
+ 2A6983F82B13F9E8B10299AE, ); name = Resources; sourceTree = "<group>"; };
+ D1C4804CD275CB57A5C89A2D = {isa = PBXGroup; children = (
+ 86CA337014D3F67E906FFD28,
+ D4EBC17BDB7F88CCBC76730B,
+ 942A0F04EFB8D0B2FF9780BA,
+ A4B568E26157FC282214976F,
+ 9F9B445E6755CAA19E4344ED,
+ E68018DE199135B7F738FB17,
+ 2F7D965A1284CEF0B20EB657,
+ CFFA8E9A7820C5A27B4393C9,
+ 31D55A751C790CB81F58DDB7,
+ 5AF0CA7CDFCA90B4DE1F55C3,
+ 66643EDF46AE8C5B7956B91D,
+ 03FA420AACDD03D50AA16E4A,
+ B1CD9599EB12D77E8AF9241D,
+ D0026F0A29B486D87E92BB8B,
+ 89309C0C5F3269BD06BE7F27,
+ F9EDC54DFBCF3A63E0AA5D73, ); name = Frameworks; sourceTree = "<group>"; };
+ D85C0D11EE4F6C73B9EB5BCD = {isa = PBXGroup; children = (
+ 8D8BBC353637DA442C5575DA, ); name = Products; sourceTree = "<group>"; };
+ 65BEFC705A89E5C8A9E35C97 = {isa = PBXGroup; children = (
+ 97790EAEA01CFA5C3CA9737A,
+ 9D8FE1F65CAD416AA606C47A,
+ 7E30376DDAD775FEFE64944C,
+ A97EE73C79DA3F729D46AF48,
+ D1C4804CD275CB57A5C89A2D,
+ D85C0D11EE4F6C73B9EB5BCD, ); name = Source; sourceTree = "<group>"; };
+ C8B793AC1BEFBE7A99BE8352 = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
- PRODUCT_NAME = "Plugin Host";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 49453CC5AD9F08D2738464AC = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 49453CC5AD9F08D2738464AC = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("~/SDKs/VST_SDK/VST3_SDK", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.roli.juce.pluginhost;
- PRODUCT_NAME = "Plugin Host";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- 8D1CA827F1EFD443BDCF198A = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Release; };
+ 8D1CA827F1EFD443BDCF198A = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- C9295196717FABE454A210B7 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ C9295196717FABE454A210B7 = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- B9D79D85AC7DE5BED1B6547C = {
- isa = PBXTargetDependency;
- target = DE12B7643D374BFF7E4FEB1C;
- };
- 493C2C5E457692E5149C5525 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 8D1CA827F1EFD443BDCF198A,
- C9295196717FABE454A210B7,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- E4ECAE24A646A7D1585F776C = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C8B793AC1BEFBE7A99BE8352,
- 49453CC5AD9F08D2738464AC,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 2429BB4D705CC57F49418CFB = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 59F4F23BFFDAB414B4801F85,
- 443244451A0F2064D4767337,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E8E94B3C187DA578BFCBDA98 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2E74188531792924F0C73142,
- C8423A9611C8AAF27468847D,
- 786AF545C1C1E4D11140C3DF,
- 3E1689E23B9C85F03209DCEF,
- F635D974599DEC2ED91E6A88,
- A1B0416DA378BB0C3AD6F74B,
- A0144A682BF4843C8CF53FE4,
- 15CCE43D7DCFC649638919D4,
- 5C4D406B924230F83E3580AD,
- F4DD98B9310B679D50A2C8A6,
- CAF0DE157C8F7D9F168AA3B6,
- 0F20A4AE04736634F097F5A6,
- 76A80851698FC773D2479B4E,
- E4A926EF695823F0F13268FF,
- A09E93F1B354E1FF8B3E9ABE,
- 7DE202DC1D876F49266D9E7D,
- 075C54DDDBDEA5AAD2F60154,
- 2C3D221D2AA87F07B3F1044D,
- C38D14DC58F1941DD5E4BF60,
- 2727A191DB1BAAC9C04B9081,
- 84BAFE82A102D9C350672689,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C515A1FE1A53D3968C22FAEF = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 73E371F1B912FCCAE0CD7E5D,
- 21D330A5B13178B12BEAFC3C,
- 851C1165C9E4ACDD19C56A96,
- AF42316D915057E930A5624E,
- E3CB85BA817BC9E3942A8AB0,
- 70580743C3D5695F065FF698,
- 1570FCC5CDB7A44DF0077E39,
- B0D5475F716126465FCE1586,
- 3470F40DA5D68EC217872906,
- E092A70431B046BF1F50A482,
- 92EE84159C7027A137F06204,
- 9056B642BEF870098DE344E5,
- 7DE81C004B0FBC563040CC5F,
- 2AB9A26C9359C40CA0A937ED,
- A02C9F4C4B840C27B6CAFEBD,
- 50AFD116DCA6EC228EFB322D,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DE12B7643D374BFF7E4FEB1C = {
- isa = PBXNativeTarget;
- buildConfigurationList = E4ECAE24A646A7D1585F776C;
- buildPhases = (
- 2429BB4D705CC57F49418CFB,
- E8E94B3C187DA578BFCBDA98,
- C515A1FE1A53D3968C22FAEF,
- );
- buildRules = ( );
- dependencies = ( );
- name = "AudioPluginHost - App";
- productName = AudioPluginHost;
- productReference = 8D8BBC353637DA442C5575DA;
- productType = "com.apple.product-type.application";
- };
- ADE6E539DB98A302483A82D0 = {
- isa = PBXProject;
- buildConfigurationList = 493C2C5E457692E5149C5525;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 65BEFC705A89E5C8A9E35C97;
- projectDirPath = "";
- projectRoot = "";
- targets = (DE12B7643D374BFF7E4FEB1C);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ B9D79D85AC7DE5BED1B6547C = {isa = PBXTargetDependency; target = DE12B7643D374BFF7E4FEB1C; };
+ 493C2C5E457692E5149C5525 = {isa = XCConfigurationList; buildConfigurations = (
+ 8D1CA827F1EFD443BDCF198A,
+ C9295196717FABE454A210B7, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ E4ECAE24A646A7D1585F776C = {isa = XCConfigurationList; buildConfigurations = (
+ C8B793AC1BEFBE7A99BE8352,
+ 49453CC5AD9F08D2738464AC, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 2429BB4D705CC57F49418CFB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 59F4F23BFFDAB414B4801F85,
+ 443244451A0F2064D4767337, ); runOnlyForDeploymentPostprocessing = 0; };
+ E8E94B3C187DA578BFCBDA98 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 2E74188531792924F0C73142,
+ C8423A9611C8AAF27468847D,
+ 786AF545C1C1E4D11140C3DF,
+ 3E1689E23B9C85F03209DCEF,
+ F635D974599DEC2ED91E6A88,
+ A1B0416DA378BB0C3AD6F74B,
+ A0144A682BF4843C8CF53FE4,
+ 15CCE43D7DCFC649638919D4,
+ 5C4D406B924230F83E3580AD,
+ F4DD98B9310B679D50A2C8A6,
+ CAF0DE157C8F7D9F168AA3B6,
+ 0F20A4AE04736634F097F5A6,
+ 76A80851698FC773D2479B4E,
+ E4A926EF695823F0F13268FF,
+ A09E93F1B354E1FF8B3E9ABE,
+ 7DE202DC1D876F49266D9E7D,
+ 075C54DDDBDEA5AAD2F60154,
+ 2C3D221D2AA87F07B3F1044D,
+ C38D14DC58F1941DD5E4BF60,
+ 2727A191DB1BAAC9C04B9081,
+ 84BAFE82A102D9C350672689, ); runOnlyForDeploymentPostprocessing = 0; };
+ C515A1FE1A53D3968C22FAEF = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 73E371F1B912FCCAE0CD7E5D,
+ 21D330A5B13178B12BEAFC3C,
+ 851C1165C9E4ACDD19C56A96,
+ AF42316D915057E930A5624E,
+ E3CB85BA817BC9E3942A8AB0,
+ 70580743C3D5695F065FF698,
+ 1570FCC5CDB7A44DF0077E39,
+ B0D5475F716126465FCE1586,
+ 3470F40DA5D68EC217872906,
+ E092A70431B046BF1F50A482,
+ 92EE84159C7027A137F06204,
+ 9056B642BEF870098DE344E5,
+ 7DE81C004B0FBC563040CC5F,
+ 2AB9A26C9359C40CA0A937ED,
+ A02C9F4C4B840C27B6CAFEBD,
+ 50AFD116DCA6EC228EFB322D, ); runOnlyForDeploymentPostprocessing = 0; };
+ DE12B7643D374BFF7E4FEB1C = {isa = PBXNativeTarget; buildConfigurationList = E4ECAE24A646A7D1585F776C; buildPhases = (
+ 2429BB4D705CC57F49418CFB,
+ E8E94B3C187DA578BFCBDA98,
+ C515A1FE1A53D3968C22FAEF, ); buildRules = ( ); dependencies = ( ); name = "AudioPluginHost - App"; productName = AudioPluginHost; productReference = 8D8BBC353637DA442C5575DA; productType = "com.apple.product-type.application"; };
+ ADE6E539DB98A302483A82D0 = {isa = PBXProject; buildConfigurationList = 493C2C5E457692E5149C5525; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 65BEFC705A89E5C8A9E35C97; projectDirPath = ""; projectRoot = ""; targets = (DE12B7643D374BFF7E4FEB1C); };
};
rootObject = ADE6E539DB98A302483A82D0;
}
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
<plist>\r
<dict>\r
- <key>NSMicrophoneUsageDescription</key>\r
- <string>This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone.</string>\r
<key>LSRequiresIPhoneOS</key>\r
<true/>\r
+ <key>NSMicrophoneUsageDescription</key>\r
+ <string>This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone.</string>\r
<key>UIViewControllerBasedStatusBarAppearance</key>\r
<false/>\r
<key>CFBundleExecutable</key>\r
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
// juce_audio_processors flags:\r
\r
#ifndef JUCE_PLUGINHOST_VST\r
- //#define JUCE_PLUGINHOST_VST 0\r
+ #define JUCE_PLUGINHOST_VST 1\r
#endif\r
\r
#ifndef JUCE_PLUGINHOST_VST3\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_events flags:\r
\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_USE_CAMERA\r
#define JUCE_USE_CAMERA 0\r
#endif\r
-\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
{\r
unsigned int hash = 0;\r
-\r
- if (resourceNameUTF8 != nullptr)\r
+ if (resourceNameUTF8 != 0)\r
while (*resourceNameUTF8 != 0)\r
hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
\r
namespace ProjectInfo\r
{\r
const char* const projectName = "AudioPluginHost";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
formatManager (fm)\r
{\r
newDocument();\r
+\r
graph.addListener (this);\r
+ graph.addChangeListener (this);\r
+\r
+ setChangedFlag (false);\r
}\r
\r
FilterGraph::~FilterGraph()\r
\r
FilterGraph::NodeID FilterGraph::getNextUID() noexcept\r
{\r
- return FilterGraph::NodeID (++(lastUID.uid));\r
+ return ++lastUID;\r
}\r
\r
//==============================================================================\r
closeAnyOpenPluginWindows();\r
#else\r
for (auto* w : activePluginWindows)\r
- if (w->node.get() == node && w->type == type)\r
+ if (w->node == node && w->type == type)\r
return w;\r
#endif\r
\r
}\r
}\r
\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! node->properties["DPIAware"]\r
- && ! node->getProcessor()->getName().contains ("Kontakt")) // Kontakt doesn't behave correctly in DPI unaware mode...\r
- {\r
- ScopedDPIAwarenessDisabler disableDPIAwareness;\r
- return activePluginWindows.add (new PluginWindow (node, type, activePluginWindows));\r
- }\r
- #endif\r
-\r
return activePluginWindows.add (new PluginWindow (node, type, activePluginWindows));\r
}\r
\r
clear();\r
setFile ({});\r
\r
- graph.removeChangeListener (this);\r
-\r
InternalPluginFormat internalFormat;\r
\r
addPlugin (internalFormat.audioInDesc, { 0.5, 0.1 });\r
addPlugin (internalFormat.midiInDesc, { 0.25, 0.1 });\r
addPlugin (internalFormat.audioOutDesc, { 0.5, 0.9 });\r
\r
- MessageManager::callAsync ([this] () {\r
- setChangedFlag (false);\r
- graph.addChangeListener (this);\r
- } );\r
+ setChangedFlag (false);\r
}\r
\r
Result FilterGraph::loadDocument (const File& file)\r
if (xml == nullptr || ! xml->hasTagName ("FILTERGRAPH"))\r
return Result::fail ("Not a valid filter graph file");\r
\r
- graph.removeChangeListener (this);\r
restoreFromXml (*xml);\r
-\r
- MessageManager::callAsync ([this] () {\r
- setChangedFlag (false);\r
- graph.addChangeListener (this);\r
- } );\r
-\r
return Result::ok();\r
}\r
\r
if (auto* plugin = dynamic_cast<AudioPluginInstance*> (node->getProcessor()))\r
{\r
auto e = new XmlElement ("FILTER");\r
- e->setAttribute ("uid", (int) node->nodeID.uid);\r
+ e->setAttribute ("uid", (int) node->nodeID);\r
e->setAttribute ("x", node->properties ["x"].toString());\r
e->setAttribute ("y", node->properties ["y"].toString());\r
\r
instance->setBusesLayout (layout);\r
}\r
\r
- if (auto node = graph.addNode (instance, NodeID ((uint32) xml.getIntAttribute ("uid"))))\r
+ if (auto node = graph.addNode (instance, (NodeID) xml.getIntAttribute ("uid")))\r
{\r
if (auto* state = xml.getChildByName ("STATE"))\r
{\r
{\r
auto e = xml->createNewChildElement ("CONNECTION");\r
\r
- e->setAttribute ("srcFilter", (int) connection.source.nodeID.uid);\r
+ e->setAttribute ("srcFilter", (int) connection.source.nodeID);\r
e->setAttribute ("srcChannel", connection.source.channelIndex);\r
- e->setAttribute ("dstFilter", (int) connection.destination.nodeID.uid);\r
+ e->setAttribute ("dstFilter", (int) connection.destination.nodeID);\r
e->setAttribute ("dstChannel", connection.destination.channelIndex);\r
}\r
\r
\r
forEachXmlChildElementWithTagName (xml, e, "CONNECTION")\r
{\r
- graph.addConnection ({ { NodeID ((uint32) e->getIntAttribute ("srcFilter")), e->getIntAttribute ("srcChannel") },\r
- { NodeID ((uint32) e->getIntAttribute ("dstFilter")), e->getIntAttribute ("dstChannel") } });\r
+ graph.addConnection ({ { (NodeID) e->getIntAttribute ("srcFilter"), e->getIntAttribute ("srcChannel") },\r
+ { (NodeID) e->getIntAttribute ("dstFilter"), e->getIntAttribute ("dstChannel") } });\r
}\r
\r
graph.removeIllegalConnections();\r
~FilterGraph();\r
\r
//==============================================================================\r
- using NodeID = AudioProcessorGraph::NodeID;\r
+ typedef AudioProcessorGraph::NodeID NodeID;\r
\r
void addPlugin (const PluginDescription&, Point<double>);\r
\r
AudioPluginFormatManager& formatManager;\r
OwnedArray<PluginWindow> activePluginWindows;\r
\r
- NodeID lastUID;\r
+ NodeID lastUID = 0;\r
NodeID getNextUID() noexcept;\r
\r
void createNodeFromXml (const XmlElement& xml);\r
auto nodeID = getNodeID();\r
\r
if (auto* graph = getGraph())\r
- if (nodeID != AudioProcessorGraph::NodeID())\r
+ if (nodeID != 0)\r
graph->disconnectNode (nodeID);\r
\r
if (auto* graphEditor = getGraphEditor())\r
if (node->getProcessor() == getAudioProcessor())\r
return node->nodeID;\r
\r
- return {};\r
+ return 0;\r
}\r
\r
MainHostWindow* FilterIOConfigurationWindow::getMainWindow() const\r
double /*initialSampleRate*/,\r
int /*initialBufferSize*/,\r
void* userData,\r
- PluginCreationCallback callback)\r
+ void (*callback) (void*, AudioPluginInstance*, const String&))\r
{\r
auto* p = createInstance (desc.name);\r
\r
private:\r
//==============================================================================\r
void createPluginInstance (const PluginDescription&, double initialSampleRate, int initialBufferSize,\r
- void* userData, PluginCreationCallback) override;\r
+ void* userData, void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
AudioPluginInstance* createInstance (const String& name);\r
\r
bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
\r
void mouseDown (const MouseEvent& e) override\r
{\r
- AudioProcessorGraph::NodeAndChannel dummy { {}, 0 };\r
+ AudioProcessorGraph::NodeAndChannel dummy { 0, 0 };\r
\r
panel.beginConnectorDrag (isInput ? dummy : pin,\r
isInput ? pin : dummy,\r
public Timer,\r
private AudioProcessorParameter::Listener\r
{\r
- FilterComponent (GraphEditorPanel& p, AudioProcessorGraph::NodeID id) : panel (p), graph (p.graph), pluginID (id)\r
+ FilterComponent (GraphEditorPanel& p, uint32 id) : panel (p), graph (p.graph), pluginID (id)\r
{\r
shadow.setShadowProperties (DropShadow (Colours::black.withAlpha (0.5f), 3, { 0, 1 }));\r
setComponentEffect (&shadow);\r
menu->addItem (10, "Show plugin GUI");\r
menu->addItem (11, "Show all programs");\r
menu->addItem (12, "Show all parameters");\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- auto isTicked = false;\r
- if (auto* node = graph.graph.getNodeForId (pluginID))\r
- isTicked = node->properties["DPIAware"];\r
-\r
- menu->addItem (13, "Enable DPI awareness", true, isTicked);\r
- #endif\r
}\r
\r
menu->addSeparator();\r
}\r
case 10: showWindow (PluginWindow::Type::normal); break;\r
case 11: showWindow (PluginWindow::Type::programs); break;\r
- case 12: showWindow (PluginWindow::Type::generic) ; break;\r
- case 13:\r
- {\r
- if (auto* node = graph.graph.getNodeForId (pluginID))\r
- node->properties.set ("DPIAware", ! node->properties ["DPIAware"]);\r
- break;\r
- }\r
+ case 12: showWindow (PluginWindow::Type::generic); break;\r
case 20: showWindow (PluginWindow::Type::audioIO); break;\r
case 21: testStateSaveLoad(); break;\r
\r
getDistancesFromEnds (getPosition().toFloat() + e.position, distanceFromStart, distanceFromEnd);\r
const bool isNearerSource = (distanceFromStart < distanceFromEnd);\r
\r
- AudioProcessorGraph::NodeAndChannel dummy { {}, 0 };\r
+ AudioProcessorGraph::NodeAndChannel dummy { 0, 0 };\r
\r
panel.beginConnectorDrag (isNearerSource ? dummy : connection.source,\r
isNearerSource ? connection.destination : dummy,\r
\r
GraphEditorPanel& panel;\r
FilterGraph& graph;\r
- AudioProcessorGraph::Connection connection { { {}, 0 }, { {}, 0 } };\r
+ AudioProcessorGraph::Connection connection { { 0, 0 }, { 0, 0 } };\r
Point<float> lastInputPos, lastOutputPos;\r
Path linePath, hitPath;\r
bool dragging = false;\r
graph.addPlugin (desc, position.toDouble() / Point<double> ((double) getWidth(), (double) getHeight()));\r
}\r
\r
-GraphEditorPanel::FilterComponent* GraphEditorPanel::getComponentForFilter (AudioProcessorGraph::NodeID nodeID) const\r
+GraphEditorPanel::FilterComponent* GraphEditorPanel::getComponentForFilter (const uint32 filterID) const\r
{\r
for (auto* fc : nodes)\r
- if (fc->pluginID == nodeID)\r
+ if (fc->pluginID == filterID)\r
return fc;\r
\r
return nullptr;\r
{\r
auto connection = draggingConnector->connection;\r
\r
- if (connection.source.nodeID == AudioProcessorGraph::NodeID() && ! pin->isInput)\r
+ if (connection.source.nodeID == 0 && ! pin->isInput)\r
{\r
connection.source = pin->pin;\r
}\r
- else if (connection.destination.nodeID == AudioProcessorGraph::NodeID() && pin->isInput)\r
+ else if (connection.destination.nodeID == 0 && pin->isInput)\r
{\r
connection.destination = pin->pin;\r
}\r
}\r
}\r
\r
- if (draggingConnector->connection.source.nodeID == AudioProcessorGraph::NodeID())\r
+ if (draggingConnector->connection.source.nodeID == 0)\r
draggingConnector->dragStart (pos);\r
else\r
draggingConnector->dragEnd (pos);\r
\r
if (auto* pin = findPinAt (e2.position))\r
{\r
- if (connection.source.nodeID == AudioProcessorGraph::NodeID())\r
+ if (connection.source.nodeID == 0)\r
{\r
if (pin->isInput)\r
return;\r
formatManager.addDefaultFormats();\r
formatManager.addFormat (new InternalPluginFormat());\r
\r
- auto safeThis = SafePointer<MainHostWindow> (this);\r
RuntimePermissions::request (RuntimePermissions::recordAudio,\r
- [safeThis] (bool granted) mutable\r
+ [safeThis = SafePointer<MainHostWindow> (this)] (bool granted) mutable\r
{\r
std::unique_ptr<XmlElement> savedAudioState (getAppProperties().getUserSettings()\r
->getXmlValue ("audioDeviceState"));\r
o.resizable = false;\r
\r
auto* w = o.create();\r
- auto safeThis = SafePointer<MainHostWindow> (this);\r
-\r
w->enterModalState (true,\r
ModalCallbackFunction::create\r
- ([safeThis] (int)\r
+ ([safeThis = SafePointer<MainHostWindow> (this)] (int)\r
{\r
std::unique_ptr<XmlElement> audioState (safeThis->deviceManager.createStateXml());\r
\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="3t6YqETY1" name="BinaryBuilder" projectType="consoleapp"\r
- juceFolder="../../../juce" jucerVersion="5.4.1" bundleIdentifier="com.roli.binarybuilder"\r
+ juceFolder="../../../juce" jucerVersion="5.3.1" bundleIdentifier="com.roli.binarybuilder"\r
displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
companyCopyright="ROLI Ltd.">\r
<EXPORTFORMATS>\r
endif\r
\r
JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_CONSOLEAPP := BinaryBuilder\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
endif\r
\r
JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_CONSOLEAPP := BinaryBuilder\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS)\r
$(JUCE_OBJDIR)/Main_90ebc5c2.o \\r
$(JUCE_OBJDIR)/include_juce_core_f26d17db.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : check-pkg-config $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
@echo Linking "BinaryBuilder - ConsoleApp"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_core.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors libcurl\r
+\r
clean:\r
@echo Cleaning BinaryBuilder\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- 281394C38788919D523BE021 = {
- isa = PBXBuildFile;
- fileRef = 799073185F72F5FAD05253C3;
- };
- 4B72EFB0E9D74CA7227F6CAB = {
- isa = PBXBuildFile;
- fileRef = 57DDB771ED96A256F190ADF8;
- };
- 0D53D8B0AEE37C02C147344B = {
- isa = PBXBuildFile;
- fileRef = F769CD634476C91F4C9D0596;
- };
- 542006E949BB022F198DF0F2 = {
- isa = PBXBuildFile;
- fileRef = 1A71A586C0F50B6B328D877B;
- };
- 3C6FF7689E2FD827A48E2303 = {
- isa = PBXBuildFile;
- fileRef = 50B7C64414A3E778021F5EC4;
- };
- 9E4D85A3D54739A0FA80A446 = {
- isa = PBXBuildFile;
- fileRef = D186E2D509765FAE0758F17D;
- };
- 1A71A586C0F50B6B328D877B = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 50B7C64414A3E778021F5EC4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 57DDB771ED96A256F190ADF8 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- 799073185F72F5FAD05253C3 = {
- isa = PBXFileReference;
- explicitFileType = "compiled.mach-o.executable";
- includeInIndex = 0;
- path = BinaryBuilder;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 7E86227B01E504302C234A04 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 8702176D2368B6F785546D2B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- D186E2D509765FAE0758F17D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- D6C3594C8BEC94040AF108FE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- F769CD634476C91F4C9D0596 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- AF0451FEC95312712E8145CD = {
- isa = PBXGroup;
- children = (
- 50B7C64414A3E778021F5EC4,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 9DC13797237D190C48A242C9 = {
- isa = PBXGroup;
- children = (
- AF0451FEC95312712E8145CD,
- );
- name = BinaryBuilder;
- sourceTree = "<group>";
- };
- 5D4B80BC67BBCEDCC3B6BAB8 = {
- isa = PBXGroup;
- children = (
- 8702176D2368B6F785546D2B,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 8905BD956C24F83087634C3A = {
- isa = PBXGroup;
- children = (
- 7E86227B01E504302C234A04,
- D186E2D509765FAE0758F17D,
- D6C3594C8BEC94040AF108FE,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- 87ECE820BF4D73DD50D614CB = {
- isa = PBXGroup;
- children = (
- 1A71A586C0F50B6B328D877B,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- E28F51A0038F01E08E22F853 = {
- isa = PBXGroup;
- children = (
- 57DDB771ED96A256F190ADF8,
- F769CD634476C91F4C9D0596,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 70A875922C34E55D4F48A196 = {
- isa = PBXGroup;
- children = (
- 799073185F72F5FAD05253C3,
- );
- name = Products;
- sourceTree = "<group>";
- };
- C18D022743CF5BD14D6A6A9E = {
- isa = PBXGroup;
- children = (
- 9DC13797237D190C48A242C9,
- 5D4B80BC67BBCEDCC3B6BAB8,
- 8905BD956C24F83087634C3A,
- 87ECE820BF4D73DD50D614CB,
- E28F51A0038F01E08E22F853,
- 70A875922C34E55D4F48A196,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 00F18709927DE6070FBA7BD0 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ 281394C38788919D523BE021 = {isa = PBXBuildFile; fileRef = 799073185F72F5FAD05253C3; };
+ 4B72EFB0E9D74CA7227F6CAB = {isa = PBXBuildFile; fileRef = 57DDB771ED96A256F190ADF8; };
+ 0D53D8B0AEE37C02C147344B = {isa = PBXBuildFile; fileRef = F769CD634476C91F4C9D0596; };
+ 542006E949BB022F198DF0F2 = {isa = PBXBuildFile; fileRef = 1A71A586C0F50B6B328D877B; };
+ 3C6FF7689E2FD827A48E2303 = {isa = PBXBuildFile; fileRef = 50B7C64414A3E778021F5EC4; };
+ 9E4D85A3D54739A0FA80A446 = {isa = PBXBuildFile; fileRef = D186E2D509765FAE0758F17D; };
+ 1A71A586C0F50B6B328D877B = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 50B7C64414A3E778021F5EC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 57DDB771ED96A256F190ADF8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 799073185F72F5FAD05253C3 = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BinaryBuilder; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 7E86227B01E504302C234A04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 8702176D2368B6F785546D2B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ D186E2D509765FAE0758F17D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ D6C3594C8BEC94040AF108FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ F769CD634476C91F4C9D0596 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ AF0451FEC95312712E8145CD = {isa = PBXGroup; children = (
+ 50B7C64414A3E778021F5EC4, ); name = Source; sourceTree = "<group>"; };
+ 9DC13797237D190C48A242C9 = {isa = PBXGroup; children = (
+ AF0451FEC95312712E8145CD, ); name = BinaryBuilder; sourceTree = "<group>"; };
+ 5D4B80BC67BBCEDCC3B6BAB8 = {isa = PBXGroup; children = (
+ 8702176D2368B6F785546D2B, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 8905BD956C24F83087634C3A = {isa = PBXGroup; children = (
+ 7E86227B01E504302C234A04,
+ D186E2D509765FAE0758F17D,
+ D6C3594C8BEC94040AF108FE, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ 87ECE820BF4D73DD50D614CB = {isa = PBXGroup; children = (
+ 1A71A586C0F50B6B328D877B, ); name = Resources; sourceTree = "<group>"; };
+ E28F51A0038F01E08E22F853 = {isa = PBXGroup; children = (
+ 57DDB771ED96A256F190ADF8,
+ F769CD634476C91F4C9D0596, ); name = Frameworks; sourceTree = "<group>"; };
+ 70A875922C34E55D4F48A196 = {isa = PBXGroup; children = (
+ 799073185F72F5FAD05253C3, ); name = Products; sourceTree = "<group>"; };
+ C18D022743CF5BD14D6A6A9E = {isa = PBXGroup; children = (
+ 9DC13797237D190C48A242C9,
+ 5D4B80BC67BBCEDCC3B6BAB8,
+ 8905BD956C24F83087634C3A,
+ 87ECE820BF4D73DD50D614CB,
+ E28F51A0038F01E08E22F853,
+ 70A875922C34E55D4F48A196, ); name = Source; sourceTree = "<group>"; };
+ 00F18709927DE6070FBA7BD0 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INSTALL_PATH = "/usr/bin";
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.roli.binarybuilder;
- PRODUCT_NAME = "BinaryBuilder";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 8A190EF24B99F557190320DA = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 8A190EF24B99F557190320DA = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INSTALL_PATH = "/usr/bin";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.roli.binarybuilder;
- PRODUCT_NAME = "BinaryBuilder";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- D9552CAECBA3D7D5725848E5 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ D9552CAECBA3D7D5725848E5 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "BinaryBuilder";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 7545BE591FD462C37E44B903 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 7545BE591FD462C37E44B903 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "BinaryBuilder";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 78C9910DF129FD687A56D083 = {
- isa = PBXTargetDependency;
- target = 80B70DE094998C267F152DD5;
- };
- E4C85B0464A93027D035AA1F = {
- isa = XCConfigurationList;
- buildConfigurations = (
- D9552CAECBA3D7D5725848E5,
- 7545BE591FD462C37E44B903,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A88E30959D785F48A594450E = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 00F18709927DE6070FBA7BD0,
- 8A190EF24B99F557190320DA,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 4F5C64675AD3AC67829798FF = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 542006E949BB022F198DF0F2,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- A69CF4AD8F7015A8D3228FDE = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3C6FF7689E2FD827A48E2303,
- 9E4D85A3D54739A0FA80A446,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2722C90F3B5DAD661891FDF4 = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 4B72EFB0E9D74CA7227F6CAB,
- 0D53D8B0AEE37C02C147344B,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 80B70DE094998C267F152DD5 = {
- isa = PBXNativeTarget;
- buildConfigurationList = A88E30959D785F48A594450E;
- buildPhases = (
- 4F5C64675AD3AC67829798FF,
- A69CF4AD8F7015A8D3228FDE,
- 2722C90F3B5DAD661891FDF4,
- );
- buildRules = ( );
- dependencies = ( );
- name = "BinaryBuilder - ConsoleApp";
- productName = BinaryBuilder;
- productReference = 799073185F72F5FAD05253C3;
- productType = "com.apple.product-type.tool";
- };
- 36B6F402BC83F21646259DEF = {
- isa = PBXProject;
- buildConfigurationList = E4C85B0464A93027D035AA1F;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = C18D022743CF5BD14D6A6A9E;
- projectDirPath = "";
- projectRoot = "";
- targets = (80B70DE094998C267F152DD5);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ 78C9910DF129FD687A56D083 = {isa = PBXTargetDependency; target = 80B70DE094998C267F152DD5; };
+ E4C85B0464A93027D035AA1F = {isa = XCConfigurationList; buildConfigurations = (
+ D9552CAECBA3D7D5725848E5,
+ 7545BE591FD462C37E44B903, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ A88E30959D785F48A594450E = {isa = XCConfigurationList; buildConfigurations = (
+ 00F18709927DE6070FBA7BD0,
+ 8A190EF24B99F557190320DA, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 4F5C64675AD3AC67829798FF = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 542006E949BB022F198DF0F2, ); runOnlyForDeploymentPostprocessing = 0; };
+ A69CF4AD8F7015A8D3228FDE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 3C6FF7689E2FD827A48E2303,
+ 9E4D85A3D54739A0FA80A446, ); runOnlyForDeploymentPostprocessing = 0; };
+ 2722C90F3B5DAD661891FDF4 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 4B72EFB0E9D74CA7227F6CAB,
+ 0D53D8B0AEE37C02C147344B, ); runOnlyForDeploymentPostprocessing = 0; };
+ 80B70DE094998C267F152DD5 = {isa = PBXNativeTarget; buildConfigurationList = A88E30959D785F48A594450E; buildPhases = (
+ 4F5C64675AD3AC67829798FF,
+ A69CF4AD8F7015A8D3228FDE,
+ 2722C90F3B5DAD661891FDF4, ); buildRules = ( ); dependencies = ( ); name = "BinaryBuilder - ConsoleApp"; productName = BinaryBuilder; productReference = 799073185F72F5FAD05253C3; productType = "com.apple.product-type.tool"; };
+ 36B6F402BC83F21646259DEF = {isa = PBXProject; buildConfigurationList = E4C85B0464A93027D035AA1F; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = C18D022743CF5BD14D6A6A9E; projectDirPath = ""; projectRoot = ""; targets = (80B70DE094998C267F152DD5); };
};
rootObject = 36B6F402BC83F21646259DEF;
}
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{88983F7C-DB65-9E04-84E7-05F8979E0383}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\ConsoleApp\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">BinaryBuilder</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
-\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
namespace ProjectInfo\r
{\r
const char* const projectName = "BinaryBuilder";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp"\r
- "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"\r
"../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"\r
"../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt"\r
- "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h"\r
+ "../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"\r
"../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"\r
- "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"\r
"../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"\r
"../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp"\r
"../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h"\r
- "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.cpp"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.mm"\r
"../../../../../modules/juce_audio_processors/juce_audio_processors.h"\r
"../../../../../modules/juce_core/containers/juce_AbstractFifo.h"\r
"../../../../../modules/juce_core/containers/juce_Array.h"\r
"../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp"\r
- "../../../../../modules/juce_core/containers/juce_ArrayBase.h"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"\r
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"\r
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"\r
"../../../../../modules/juce_core/containers/juce_ListenerList.h"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"\r
"../../../../../modules/juce_core/containers/juce_NamedValueSet.h"\r
- "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_OwnedArray.h"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.cpp"\r
"../../../../../modules/juce_core/containers/juce_PropertySet.h"\r
- "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp"\r
"../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"\r
"../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"\r
"../../../../../modules/juce_core/containers/juce_SortedSet.h"\r
"../../../../../modules/juce_core/memory/juce_ByteOrder.h"\r
"../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"\r
"../../../../../modules/juce_core/memory/juce_HeapBlock.h"\r
- "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"\r
"../../../../../modules/juce_core/memory/juce_Memory.h"\r
"../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"\r
"../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"\r
"../../../../../modules/juce_core/memory/juce_Singleton.h"\r
"../../../../../modules/juce_core/memory/juce_WeakReference.h"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp"\r
- "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h"\r
"../../../../../modules/juce_core/misc/juce_Result.cpp"\r
"../../../../../modules/juce_core/misc/juce_Result.h"\r
"../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"\r
"../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"\r
"../../../../../modules/juce_core/native/juce_mac_Threads.mm"\r
"../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"\r
- "../../../../../modules/juce_core/native/juce_posix_IPAddress.h"\r
"../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"\r
"../../../../../modules/juce_core/native/juce_posix_SharedCode.h"\r
"../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"\r
"../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp"\r
- "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"\r
"../../../../../modules/juce_events/messages/juce_ApplicationBase.h"\r
"../../../../../modules/juce_events/messages/juce_CallbackMessage.h"\r
"../../../../../modules/juce_gui_basics/components/juce_Component.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"\r
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"\r
"../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp"\r
- "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"\r
"../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"\r
"../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"\r
"../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h"\r
- "../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h"\r
"../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h"\r
"../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
-set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)\r
set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)\r
\r
android {\r
compileSdkVersion 10\r
- buildToolsVersion "28.0.0"\r
+ buildToolsVersion "27.0.3"\r
externalNativeBuild {\r
cmake {\r
path "CMakeLists.txt"\r
productFlavors {\r
debug_ {\r
ndk {\r
- abiFilters "armeabi-v7a", "x86"\r
+ abiFilters "armeabi", "armeabi-v7a", "x86"\r
}\r
externalNativeBuild {\r
cmake {\r
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.0"
package="com.juce.networkgraphicsdemo">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
+ <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
//==============================================================================\r
public boolean isPermissionDeclaredInManifest (int permissionID)\r
{\r
- return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
- }\r
+ String permissionToCheck = getAndroidPermissionName(permissionID);\r
\r
- public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
- {\r
try\r
{\r
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
public final String getClipboardContent()\r
{\r
ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
- CharSequence content = clipboard.getText();\r
- return content != null ? content.toString() : new String();\r
+ return clipboard.getText().toString();\r
}\r
\r
public final void setClipboardContent (String newText)\r
implements SurfaceHolder.Callback\r
{\r
private long nativeContext = 0;\r
- private boolean forVideo;\r
\r
- NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+ NativeSurfaceView (Context context, long nativeContextPtr)\r
{\r
super (context);\r
nativeContext = nativeContextPtr;\r
- forVideo = createdForVideo;\r
}\r
\r
public Surface getNativeSurface()\r
@Override\r
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
{\r
- if (forVideo)\r
- surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
- else\r
- surfaceChangedNative (nativeContext, holder, format, width, height);\r
+ surfaceChangedNative (nativeContext, holder, format, width, height);\r
}\r
\r
@Override\r
public void surfaceCreated (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceCreatedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceCreatedNative (nativeContext, holder);\r
+ surfaceCreatedNative (nativeContext, holder);\r
}\r
\r
@Override\r
public void surfaceDestroyed (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceDestroyedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceDestroyedNative (nativeContext, holder);\r
+ surfaceDestroyedNative (nativeContext, holder);\r
}\r
\r
@Override\r
protected void dispatchDraw (Canvas canvas)\r
{\r
super.dispatchDraw (canvas);\r
-\r
- if (forVideo)\r
- dispatchDrawNativeVideo (nativeContext, canvas);\r
- else\r
- dispatchDrawNative (nativeContext, canvas);\r
+ dispatchDrawNative (nativeContext, canvas);\r
}\r
\r
//==============================================================================\r
@Override\r
- protected void onAttachedToWindow()\r
+ protected void onAttachedToWindow ()\r
{\r
super.onAttachedToWindow();\r
getHolder().addCallback (this);\r
}\r
\r
@Override\r
- protected void onDetachedFromWindow()\r
+ protected void onDetachedFromWindow ()\r
{\r
super.onDetachedFromWindow();\r
getHolder().removeCallback (this);\r
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
int format, int width, int height);\r
-\r
- private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
- private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
- int format, int width, int height);\r
}\r
\r
- public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
{\r
- return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+ return new NativeSurfaceView (this, nativeSurfacePtr);\r
}\r
\r
//==============================================================================\r
jcenter()\r
}\r
dependencies {\r
- classpath 'com.android.tools.build:gradle:3.1.3'\r
+ classpath 'com.android.tools.build:gradle:3.1.1'\r
}\r
}\r
\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o \\r
$(JUCE_OBJDIR)/include_juce_osc_f3df604d.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
@echo Linking "NetworkGraphicsDemo - App"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_osc.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
clean:\r
@echo Cleaning NetworkGraphicsDemo\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- F468E8C7B02DFD4D53911277 = {
- isa = PBXBuildFile;
- fileRef = E4162459ED4C829EF7B19691;
- };
- 80EE2C27B466BAFD83881D3F = {
- isa = PBXBuildFile;
- fileRef = 2E13A899F4E3C99054A3656F;
- };
- C4D6C466C41173D6970553D2 = {
- isa = PBXBuildFile;
- fileRef = 9E8129263CD42C6029FC2CAD;
- };
- BED88ADEA4DC91AA8C810FA8 = {
- isa = PBXBuildFile;
- fileRef = 398A945EFD9ED923162982B1;
- };
- 3C30D7C28C86F4054257DCD5 = {
- isa = PBXBuildFile;
- fileRef = C78806A6727F44EACFDED4A5;
- };
- 67DF295E93E54432043126DF = {
- isa = PBXBuildFile;
- fileRef = 6799B056504F9F017998B9E2;
- };
- CA694B2A73FCF12D7F9E7E49 = {
- isa = PBXBuildFile;
- fileRef = 448838BE6E937D450A3C84CE;
- };
- 80B9F7ED2009922C693B7DD4 = {
- isa = PBXBuildFile;
- fileRef = CB82A14817C3E2ABBBBC3864;
- };
- 77745BF98931B91341FE17F6 = {
- isa = PBXBuildFile;
- fileRef = F3292E3563DB7ABB076DB400;
- };
- B323E5E5FBD5663B21A8E623 = {
- isa = PBXBuildFile;
- fileRef = 996E743A20FC78671766BF59;
- };
- EC14DA30C090DDC62084DB4C = {
- isa = PBXBuildFile;
- fileRef = 935CA85EF98714D3A17AE737;
- };
- 8ECB0767EE340DD83869E37D = {
- isa = PBXBuildFile;
- fileRef = EC794872987FEA2E129C589A;
- };
- 65B2C4ED19229E0EDC8EF993 = {
- isa = PBXBuildFile;
- fileRef = 696F7896036B652369517438;
- };
- 006DF460F8DF66EFFA80D968 = {
- isa = PBXBuildFile;
- fileRef = 70F1CAF3C4C561DD81E6AFC1;
- };
- 987CBD5330E76B404F0D966C = {
- isa = PBXBuildFile;
- fileRef = 77C0AC21C1028911123844FC;
- };
- 9F618C008A503063D10076C4 = {
- isa = PBXBuildFile;
- fileRef = 74711D7544168CCAC4969A07;
- };
- BB9A9692D99DD0DDB1047B60 = {
- isa = PBXBuildFile;
- fileRef = 6D1F9E505D20C09647124F0A;
- };
- 6C2200C52B65E1BE80544E50 = {
- isa = PBXBuildFile;
- fileRef = AF330F41D1A4865108690E3C;
- };
- A1F34D09F4E4338775917ED1 = {
- isa = PBXBuildFile;
- fileRef = C6E2284D86D93F1D9D5C7666;
- };
- 2E28F61A64DEF942FE7B94C4 = {
- isa = PBXBuildFile;
- fileRef = AED58461CE961C62A0E0A552;
- };
- EA487FA4116517A8DFEE85B0 = {
- isa = PBXBuildFile;
- fileRef = FCEBB157FB526741DB6791D1;
- };
- 0977FEC02DAF29438583198A = {
- isa = PBXBuildFile;
- fileRef = 01E0EEF68A11C1CAF180E173;
- };
- 0FA2A3321630EBE83E439D99 = {
- isa = PBXBuildFile;
- fileRef = AFF729977947528F3E4AAA96;
- };
- 9EFD2AA2FFF3C125FDAA4279 = {
- isa = PBXBuildFile;
- fileRef = 7525879E73E8AF32FFA0CDDE;
- };
- C5E7BAD864E02CF37F7BD707 = {
- isa = PBXBuildFile;
- fileRef = 33AA348465F512DBA8778DAF;
- };
- CBC8F7E5225C73CEDFB3B72E = {
- isa = PBXBuildFile;
- fileRef = A7FF2B353C8568B5A7A80117;
- };
- CADEA83EAAC94E0011C07908 = {
- isa = PBXBuildFile;
- fileRef = 84B287BB2AD252B7D69AC47E;
- };
- 3717B9F9A0F7C9CB95F1BE7F = {
- isa = PBXBuildFile;
- fileRef = 7BE6330821794919A88ED8ED;
- };
- 61B523C52EBA17F738FFE31A = {
- isa = PBXBuildFile;
- fileRef = 660F1970CF687A7AE8371C6D;
- };
- C6348C6B1D0312580E97EA19 = {
- isa = PBXBuildFile;
- fileRef = 3BF06B70407FFDBE9534F942;
- };
- 01E0EEF68A11C1CAF180E173 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 0555BAE6156EAF15CA77A2D8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 0ADF0DECFCB1DB4D3A847EB5 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = "juce_icon.png";
- path = "../../Source/juce_icon.png";
- sourceTree = "SOURCE_ROOT";
- };
- 18BFEBD944DDE4809C89F27A = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 1FD6DBAC73414DD4C152E34E = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 25DEDA8C9F94A6C8DFC8E53E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SharedCanvas.h;
- path = ../../Source/SharedCanvas.h;
- sourceTree = "SOURCE_ROOT";
- };
- 2E13A899F4E3C99054A3656F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 33AA348465F512DBA8778DAF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 398A945EFD9ED923162982B1 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- 3BF06B70407FFDBE9534F942 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_osc.cpp";
- path = "../../JuceLibraryCode/include_juce_osc.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 448838BE6E937D450A3C84CE = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 4FF648D72D6F1A78956CDA1B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = Demos.h;
- path = ../../Source/Demos.h;
- sourceTree = "SOURCE_ROOT";
- };
- 55CB060922ABCBC105FE38D2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_osc";
- path = "../../../../modules/juce_osc";
- sourceTree = "SOURCE_ROOT";
- };
- 660F1970CF687A7AE8371C6D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 6799B056504F9F017998B9E2 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- 68EBC0BF5F01E05FDCB3EEAF = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 696F7896036B652369517438 = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 6D1F9E505D20C09647124F0A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 70F1CAF3C4C561DD81E6AFC1 = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- 74711D7544168CCAC4969A07 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = BinaryData.cpp;
- path = ../../JuceLibraryCode/BinaryData.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 7525879E73E8AF32FFA0CDDE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 77C0AC21C1028911123844FC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 7BE6330821794919A88ED8ED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 84B287BB2AD252B7D69AC47E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 89583CD42AD218E9753DF11C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 8E2F72AFA0CDA64F0C07F105 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SlaveComponent.h;
- path = ../../Source/SlaveComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 8EACAADD3A23DED3E252C92F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 92800676AF753D1A60108F11 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = BinaryData.h;
- path = ../../JuceLibraryCode/BinaryData.h;
- sourceTree = "SOURCE_ROOT";
- };
- 935CA85EF98714D3A17AE737 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 996E743A20FC78671766BF59 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGL.framework;
- path = System/Library/Frameworks/OpenGL.framework;
- sourceTree = SDKROOT;
- };
- 9982F39121710EFFD5FEEAEF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MasterComponent.h;
- path = ../../Source/MasterComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9C67BD1915C7FD5747C2BA8F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 9C689AFBF364CB167C422D29 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- 9E8129263CD42C6029FC2CAD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- A505E1DABB2ED630EFBA96DB = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- A7FF2B353C8568B5A7A80117 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AED58461CE961C62A0E0A552 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AF330F41D1A4865108690E3C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AFF729977947528F3E4AAA96 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- B5433B00F012AD87AADBFCD6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- B76F10A7778664E164A01934 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- BA2E40409255F1B078406221 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- C6E2284D86D93F1D9D5C7666 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- C78806A6727F44EACFDED4A5 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- CB82A14817C3E2ABBBBC3864 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- D12A0DFFE18728E84D9AB739 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- E4162459ED4C829EF7B19691 = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = "JUCE Network Graphics Demo.app";
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- E4EA870A22A0C6649E55DD30 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- EC794872987FEA2E129C589A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- F3292E3563DB7ABB076DB400 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- F98A4DAA0502EE9252EBE06F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- FA0A789443FD480003E40435 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- FCEBB157FB526741DB6791D1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5A58AF0A052C539F0E342A88 = {
- isa = PBXGroup;
- children = (
- 4FF648D72D6F1A78956CDA1B,
- 77C0AC21C1028911123844FC,
- 9982F39121710EFFD5FEEAEF,
- 8E2F72AFA0CDA64F0C07F105,
- 25DEDA8C9F94A6C8DFC8E53E,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 856518502A948813C90E6761 = {
- isa = PBXGroup;
- children = (
- 5A58AF0A052C539F0E342A88,
- 0ADF0DECFCB1DB4D3A847EB5,
- );
- name = NetworkGraphicsDemo;
- sourceTree = "<group>";
- };
- EF0AACA84F1CEE7F45F56339 = {
- isa = PBXGroup;
- children = (
- B76F10A7778664E164A01934,
- 89583CD42AD218E9753DF11C,
- 9C67BD1915C7FD5747C2BA8F,
- A505E1DABB2ED630EFBA96DB,
- E4EA870A22A0C6649E55DD30,
- 8EACAADD3A23DED3E252C92F,
- B5433B00F012AD87AADBFCD6,
- BA2E40409255F1B078406221,
- F98A4DAA0502EE9252EBE06F,
- 18BFEBD944DDE4809C89F27A,
- FA0A789443FD480003E40435,
- 9C689AFBF364CB167C422D29,
- 68EBC0BF5F01E05FDCB3EEAF,
- 55CB060922ABCBC105FE38D2,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- C20D4DECE1291BF6AF8711DC = {
- isa = PBXGroup;
- children = (
- 0555BAE6156EAF15CA77A2D8,
- 74711D7544168CCAC4969A07,
- 92800676AF753D1A60108F11,
- 6D1F9E505D20C09647124F0A,
- AF330F41D1A4865108690E3C,
- C6E2284D86D93F1D9D5C7666,
- AED58461CE961C62A0E0A552,
- FCEBB157FB526741DB6791D1,
- 01E0EEF68A11C1CAF180E173,
- AFF729977947528F3E4AAA96,
- 7525879E73E8AF32FFA0CDDE,
- 33AA348465F512DBA8778DAF,
- A7FF2B353C8568B5A7A80117,
- 84B287BB2AD252B7D69AC47E,
- 7BE6330821794919A88ED8ED,
- 660F1970CF687A7AE8371C6D,
- 3BF06B70407FFDBE9534F942,
- D12A0DFFE18728E84D9AB739,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- 4AA57E2B5FD5374D348EEF7F = {
- isa = PBXGroup;
- children = (
- 1FD6DBAC73414DD4C152E34E,
- 696F7896036B652369517438,
- 70F1CAF3C4C561DD81E6AFC1,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 71F5560BE0EE3A17A9CE44F6 = {
- isa = PBXGroup;
- children = (
- 2E13A899F4E3C99054A3656F,
- 9E8129263CD42C6029FC2CAD,
- 398A945EFD9ED923162982B1,
- C78806A6727F44EACFDED4A5,
- 6799B056504F9F017998B9E2,
- 448838BE6E937D450A3C84CE,
- CB82A14817C3E2ABBBBC3864,
- F3292E3563DB7ABB076DB400,
- 996E743A20FC78671766BF59,
- 935CA85EF98714D3A17AE737,
- EC794872987FEA2E129C589A,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 8B59A884C62D960EE9DFEF47 = {
- isa = PBXGroup;
- children = (
- E4162459ED4C829EF7B19691,
- );
- name = Products;
- sourceTree = "<group>";
- };
- D2EB65517396C974F0415A7F = {
- isa = PBXGroup;
- children = (
- 856518502A948813C90E6761,
- EF0AACA84F1CEE7F45F56339,
- C20D4DECE1291BF6AF8711DC,
- 4AA57E2B5FD5374D348EEF7F,
- 71F5560BE0EE3A17A9CE44F6,
- 8B59A884C62D960EE9DFEF47,
- );
- name = Source;
- sourceTree = "<group>";
- };
- EE7498599191DDC73ECB55B0 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ F468E8C7B02DFD4D53911277 = {isa = PBXBuildFile; fileRef = E4162459ED4C829EF7B19691; };
+ 80EE2C27B466BAFD83881D3F = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; };
+ C4D6C466C41173D6970553D2 = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; };
+ BED88ADEA4DC91AA8C810FA8 = {isa = PBXBuildFile; fileRef = 398A945EFD9ED923162982B1; };
+ 3C30D7C28C86F4054257DCD5 = {isa = PBXBuildFile; fileRef = C78806A6727F44EACFDED4A5; };
+ 67DF295E93E54432043126DF = {isa = PBXBuildFile; fileRef = 6799B056504F9F017998B9E2; };
+ CA694B2A73FCF12D7F9E7E49 = {isa = PBXBuildFile; fileRef = 448838BE6E937D450A3C84CE; };
+ 80B9F7ED2009922C693B7DD4 = {isa = PBXBuildFile; fileRef = CB82A14817C3E2ABBBBC3864; };
+ 77745BF98931B91341FE17F6 = {isa = PBXBuildFile; fileRef = F3292E3563DB7ABB076DB400; };
+ B323E5E5FBD5663B21A8E623 = {isa = PBXBuildFile; fileRef = 996E743A20FC78671766BF59; };
+ EC14DA30C090DDC62084DB4C = {isa = PBXBuildFile; fileRef = 935CA85EF98714D3A17AE737; };
+ 8ECB0767EE340DD83869E37D = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; };
+ 65B2C4ED19229E0EDC8EF993 = {isa = PBXBuildFile; fileRef = 696F7896036B652369517438; };
+ 006DF460F8DF66EFFA80D968 = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; };
+ 987CBD5330E76B404F0D966C = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; };
+ 9F618C008A503063D10076C4 = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; };
+ BB9A9692D99DD0DDB1047B60 = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; };
+ 6C2200C52B65E1BE80544E50 = {isa = PBXBuildFile; fileRef = AF330F41D1A4865108690E3C; };
+ A1F34D09F4E4338775917ED1 = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; };
+ 2E28F61A64DEF942FE7B94C4 = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; };
+ EA487FA4116517A8DFEE85B0 = {isa = PBXBuildFile; fileRef = FCEBB157FB526741DB6791D1; };
+ 0977FEC02DAF29438583198A = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; };
+ 0FA2A3321630EBE83E439D99 = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; };
+ 9EFD2AA2FFF3C125FDAA4279 = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; };
+ C5E7BAD864E02CF37F7BD707 = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; };
+ CBC8F7E5225C73CEDFB3B72E = {isa = PBXBuildFile; fileRef = A7FF2B353C8568B5A7A80117; };
+ CADEA83EAAC94E0011C07908 = {isa = PBXBuildFile; fileRef = 84B287BB2AD252B7D69AC47E; };
+ 3717B9F9A0F7C9CB95F1BE7F = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; };
+ 61B523C52EBA17F738FFE31A = {isa = PBXBuildFile; fileRef = 660F1970CF687A7AE8371C6D; };
+ C6348C6B1D0312580E97EA19 = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; };
+ 01E0EEF68A11C1CAF180E173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 0555BAE6156EAF15CA77A2D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 0ADF0DECFCB1DB4D3A847EB5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+ 18BFEBD944DDE4809C89F27A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 1FD6DBAC73414DD4C152E34E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 25DEDA8C9F94A6C8DFC8E53E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = "SOURCE_ROOT"; };
+ 2E13A899F4E3C99054A3656F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 33AA348465F512DBA8778DAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 398A945EFD9ED923162982B1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ 3BF06B70407FFDBE9534F942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 448838BE6E937D450A3C84CE = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 4FF648D72D6F1A78956CDA1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = "SOURCE_ROOT"; };
+ 55CB060922ABCBC105FE38D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+ 660F1970CF687A7AE8371C6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6799B056504F9F017998B9E2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 68EBC0BF5F01E05FDCB3EEAF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 696F7896036B652369517438 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 6D1F9E505D20C09647124F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 70F1CAF3C4C561DD81E6AFC1 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ 74711D7544168CCAC4969A07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 7525879E73E8AF32FFA0CDDE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 77C0AC21C1028911123844FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 7BE6330821794919A88ED8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 84B287BB2AD252B7D69AC47E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 89583CD42AD218E9753DF11C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 8E2F72AFA0CDA64F0C07F105 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SlaveComponent.h; path = ../../Source/SlaveComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 8EACAADD3A23DED3E252C92F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 92800676AF753D1A60108F11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+ 935CA85EF98714D3A17AE737 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 996E743A20FC78671766BF59 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+ 9982F39121710EFFD5FEEAEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MasterComponent.h; path = ../../Source/MasterComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 9C67BD1915C7FD5747C2BA8F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 9C689AFBF364CB167C422D29 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ 9E8129263CD42C6029FC2CAD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ A505E1DABB2ED630EFBA96DB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ A7FF2B353C8568B5A7A80117 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ AED58461CE961C62A0E0A552 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ AF330F41D1A4865108690E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ AFF729977947528F3E4AAA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ B5433B00F012AD87AADBFCD6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ B76F10A7778664E164A01934 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ BA2E40409255F1B078406221 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ C6E2284D86D93F1D9D5C7666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ C78806A6727F44EACFDED4A5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ CB82A14817C3E2ABBBBC3864 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ D12A0DFFE18728E84D9AB739 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ E4162459ED4C829EF7B19691 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "JUCE Network Graphics Demo.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ E4EA870A22A0C6649E55DD30 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ EC794872987FEA2E129C589A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ F3292E3563DB7ABB076DB400 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ F98A4DAA0502EE9252EBE06F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ FA0A789443FD480003E40435 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ FCEBB157FB526741DB6791D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5A58AF0A052C539F0E342A88 = {isa = PBXGroup; children = (
+ 4FF648D72D6F1A78956CDA1B,
+ 77C0AC21C1028911123844FC,
+ 9982F39121710EFFD5FEEAEF,
+ 8E2F72AFA0CDA64F0C07F105,
+ 25DEDA8C9F94A6C8DFC8E53E, ); name = Source; sourceTree = "<group>"; };
+ 856518502A948813C90E6761 = {isa = PBXGroup; children = (
+ 5A58AF0A052C539F0E342A88,
+ 0ADF0DECFCB1DB4D3A847EB5, ); name = NetworkGraphicsDemo; sourceTree = "<group>"; };
+ EF0AACA84F1CEE7F45F56339 = {isa = PBXGroup; children = (
+ B76F10A7778664E164A01934,
+ 89583CD42AD218E9753DF11C,
+ 9C67BD1915C7FD5747C2BA8F,
+ A505E1DABB2ED630EFBA96DB,
+ E4EA870A22A0C6649E55DD30,
+ 8EACAADD3A23DED3E252C92F,
+ B5433B00F012AD87AADBFCD6,
+ BA2E40409255F1B078406221,
+ F98A4DAA0502EE9252EBE06F,
+ 18BFEBD944DDE4809C89F27A,
+ FA0A789443FD480003E40435,
+ 9C689AFBF364CB167C422D29,
+ 68EBC0BF5F01E05FDCB3EEAF,
+ 55CB060922ABCBC105FE38D2, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ C20D4DECE1291BF6AF8711DC = {isa = PBXGroup; children = (
+ 0555BAE6156EAF15CA77A2D8,
+ 74711D7544168CCAC4969A07,
+ 92800676AF753D1A60108F11,
+ 6D1F9E505D20C09647124F0A,
+ AF330F41D1A4865108690E3C,
+ C6E2284D86D93F1D9D5C7666,
+ AED58461CE961C62A0E0A552,
+ FCEBB157FB526741DB6791D1,
+ 01E0EEF68A11C1CAF180E173,
+ AFF729977947528F3E4AAA96,
+ 7525879E73E8AF32FFA0CDDE,
+ 33AA348465F512DBA8778DAF,
+ A7FF2B353C8568B5A7A80117,
+ 84B287BB2AD252B7D69AC47E,
+ 7BE6330821794919A88ED8ED,
+ 660F1970CF687A7AE8371C6D,
+ 3BF06B70407FFDBE9534F942,
+ D12A0DFFE18728E84D9AB739, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ 4AA57E2B5FD5374D348EEF7F = {isa = PBXGroup; children = (
+ 1FD6DBAC73414DD4C152E34E,
+ 696F7896036B652369517438,
+ 70F1CAF3C4C561DD81E6AFC1, ); name = Resources; sourceTree = "<group>"; };
+ 71F5560BE0EE3A17A9CE44F6 = {isa = PBXGroup; children = (
+ 2E13A899F4E3C99054A3656F,
+ 9E8129263CD42C6029FC2CAD,
+ 398A945EFD9ED923162982B1,
+ C78806A6727F44EACFDED4A5,
+ 6799B056504F9F017998B9E2,
+ 448838BE6E937D450A3C84CE,
+ CB82A14817C3E2ABBBBC3864,
+ F3292E3563DB7ABB076DB400,
+ 996E743A20FC78671766BF59,
+ 935CA85EF98714D3A17AE737,
+ EC794872987FEA2E129C589A, ); name = Frameworks; sourceTree = "<group>"; };
+ 8B59A884C62D960EE9DFEF47 = {isa = PBXGroup; children = (
+ E4162459ED4C829EF7B19691, ); name = Products; sourceTree = "<group>"; };
+ D2EB65517396C974F0415A7F = {isa = PBXGroup; children = (
+ 856518502A948813C90E6761,
+ EF0AACA84F1CEE7F45F56339,
+ C20D4DECE1291BF6AF8711DC,
+ 4AA57E2B5FD5374D348EEF7F,
+ 71F5560BE0EE3A17A9CE44F6,
+ 8B59A884C62D960EE9DFEF47, ); name = Source; sourceTree = "<group>"; };
+ EE7498599191DDC73ECB55B0 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.9;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
- PRODUCT_NAME = "JUCE Network Graphics Demo";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 2E06386CE7CCA5FF76819BFF = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 2E06386CE7CCA5FF76819BFF = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
- PRODUCT_NAME = "JUCE Network Graphics Demo";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- 3BF0365A560ACD4FD24D40CE = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ 3BF0365A560ACD4FD24D40CE = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "JUCE Network Graphics Demo";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 9C6D2FD441D79104734762A5 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 9C6D2FD441D79104734762A5 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "JUCE Network Graphics Demo";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 80BE97CC38B01FABC0E73204 = {
- isa = PBXTargetDependency;
- target = 4311FBCBD02948A0ED96C7DD;
- };
- 02715337C584F3C721251428 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3BF0365A560ACD4FD24D40CE,
- 9C6D2FD441D79104734762A5,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B73863F5D180C23D3EC40C38 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- EE7498599191DDC73ECB55B0,
- 2E06386CE7CCA5FF76819BFF,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 714944DB86A4D402E7FA269E = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 65B2C4ED19229E0EDC8EF993,
- 006DF460F8DF66EFFA80D968,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C2977559BF9148DB70CA10AE = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 987CBD5330E76B404F0D966C,
- 9F618C008A503063D10076C4,
- BB9A9692D99DD0DDB1047B60,
- 6C2200C52B65E1BE80544E50,
- A1F34D09F4E4338775917ED1,
- 2E28F61A64DEF942FE7B94C4,
- EA487FA4116517A8DFEE85B0,
- 0977FEC02DAF29438583198A,
- 0FA2A3321630EBE83E439D99,
- 9EFD2AA2FFF3C125FDAA4279,
- C5E7BAD864E02CF37F7BD707,
- CBC8F7E5225C73CEDFB3B72E,
- CADEA83EAAC94E0011C07908,
- 3717B9F9A0F7C9CB95F1BE7F,
- 61B523C52EBA17F738FFE31A,
- C6348C6B1D0312580E97EA19,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 865E89B94B41EB14C202CBB0 = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 80EE2C27B466BAFD83881D3F,
- C4D6C466C41173D6970553D2,
- BED88ADEA4DC91AA8C810FA8,
- 3C30D7C28C86F4054257DCD5,
- 67DF295E93E54432043126DF,
- CA694B2A73FCF12D7F9E7E49,
- 80B9F7ED2009922C693B7DD4,
- 77745BF98931B91341FE17F6,
- B323E5E5FBD5663B21A8E623,
- EC14DA30C090DDC62084DB4C,
- 8ECB0767EE340DD83869E37D,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4311FBCBD02948A0ED96C7DD = {
- isa = PBXNativeTarget;
- buildConfigurationList = B73863F5D180C23D3EC40C38;
- buildPhases = (
- 714944DB86A4D402E7FA269E,
- C2977559BF9148DB70CA10AE,
- 865E89B94B41EB14C202CBB0,
- );
- buildRules = ( );
- dependencies = ( );
- name = "NetworkGraphicsDemo - App";
- productName = NetworkGraphicsDemo;
- productReference = E4162459ED4C829EF7B19691;
- productType = "com.apple.product-type.application";
- };
- A5398ADB6F5B128C00EB935C = {
- isa = PBXProject;
- buildConfigurationList = 02715337C584F3C721251428;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = D2EB65517396C974F0415A7F;
- projectDirPath = "";
- projectRoot = "";
- targets = (4311FBCBD02948A0ED96C7DD);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ 80BE97CC38B01FABC0E73204 = {isa = PBXTargetDependency; target = 4311FBCBD02948A0ED96C7DD; };
+ 02715337C584F3C721251428 = {isa = XCConfigurationList; buildConfigurations = (
+ 3BF0365A560ACD4FD24D40CE,
+ 9C6D2FD441D79104734762A5, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ B73863F5D180C23D3EC40C38 = {isa = XCConfigurationList; buildConfigurations = (
+ EE7498599191DDC73ECB55B0,
+ 2E06386CE7CCA5FF76819BFF, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 714944DB86A4D402E7FA269E = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 65B2C4ED19229E0EDC8EF993,
+ 006DF460F8DF66EFFA80D968, ); runOnlyForDeploymentPostprocessing = 0; };
+ C2977559BF9148DB70CA10AE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 987CBD5330E76B404F0D966C,
+ 9F618C008A503063D10076C4,
+ BB9A9692D99DD0DDB1047B60,
+ 6C2200C52B65E1BE80544E50,
+ A1F34D09F4E4338775917ED1,
+ 2E28F61A64DEF942FE7B94C4,
+ EA487FA4116517A8DFEE85B0,
+ 0977FEC02DAF29438583198A,
+ 0FA2A3321630EBE83E439D99,
+ 9EFD2AA2FFF3C125FDAA4279,
+ C5E7BAD864E02CF37F7BD707,
+ CBC8F7E5225C73CEDFB3B72E,
+ CADEA83EAAC94E0011C07908,
+ 3717B9F9A0F7C9CB95F1BE7F,
+ 61B523C52EBA17F738FFE31A,
+ C6348C6B1D0312580E97EA19, ); runOnlyForDeploymentPostprocessing = 0; };
+ 865E89B94B41EB14C202CBB0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 80EE2C27B466BAFD83881D3F,
+ C4D6C466C41173D6970553D2,
+ BED88ADEA4DC91AA8C810FA8,
+ 3C30D7C28C86F4054257DCD5,
+ 67DF295E93E54432043126DF,
+ CA694B2A73FCF12D7F9E7E49,
+ 80B9F7ED2009922C693B7DD4,
+ 77745BF98931B91341FE17F6,
+ B323E5E5FBD5663B21A8E623,
+ EC14DA30C090DDC62084DB4C,
+ 8ECB0767EE340DD83869E37D, ); runOnlyForDeploymentPostprocessing = 0; };
+ 4311FBCBD02948A0ED96C7DD = {isa = PBXNativeTarget; buildConfigurationList = B73863F5D180C23D3EC40C38; buildPhases = (
+ 714944DB86A4D402E7FA269E,
+ C2977559BF9148DB70CA10AE,
+ 865E89B94B41EB14C202CBB0, ); buildRules = ( ); dependencies = ( ); name = "NetworkGraphicsDemo - App"; productName = NetworkGraphicsDemo; productReference = E4162459ED4C829EF7B19691; productType = "com.apple.product-type.application"; };
+ A5398ADB6F5B128C00EB935C = {isa = PBXProject; buildConfigurationList = 02715337C584F3C721251428; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = D2EB65517396C974F0415A7F; projectDirPath = ""; projectRoot = ""; targets = (4311FBCBD02948A0ED96C7DD); };
};
rootObject = A5398ADB6F5B128C00EB935C;
}
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{2F8ABED0-7428-13A5-07CD-EF1F3B43B926}</ProjectGuid>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">JUCE Network Graphics Demo</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<None Include="..\..\Source\juce_icon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
<None Include=".\icon.ico"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{2F8ABED0-7428-13A5-07CD-EF1F3B43B926}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">JUCE Network Graphics Demo</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<None Include="..\..\Source\juce_icon.png"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
</ItemGroup>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
};
objectVersion = 46;
objects = {
- F468E8C7B02DFD4D53911277 = {
- isa = PBXBuildFile;
- fileRef = E4162459ED4C829EF7B19691;
- };
- 80EE2C27B466BAFD83881D3F = {
- isa = PBXBuildFile;
- fileRef = 2E13A899F4E3C99054A3656F;
- };
- C4D6C466C41173D6970553D2 = {
- isa = PBXBuildFile;
- fileRef = 9E8129263CD42C6029FC2CAD;
- };
- 3CC6DC6E223415B506D0CB75 = {
- isa = PBXBuildFile;
- fileRef = 080961C54C58ECF2346B4C23;
- };
- 67DF295E93E54432043126DF = {
- isa = PBXBuildFile;
- fileRef = 6799B056504F9F017998B9E2;
- };
- 770AB74B1D3A0108F764DD47 = {
- isa = PBXBuildFile;
- fileRef = 4D1DB6D77B6F3DE7A569780B;
- };
- 366A216FDEBD7BDDC1BA12D9 = {
- isa = PBXBuildFile;
- fileRef = DA40ED39AF4B56000E5A2743;
- };
- 1F7A8BD2B43B3D191132301D = {
- isa = PBXBuildFile;
- fileRef = E51ABCA80B75F33848F28184;
- };
- CA694B2A73FCF12D7F9E7E49 = {
- isa = PBXBuildFile;
- fileRef = 448838BE6E937D450A3C84CE;
- };
- 5A64B64E5B45AEA1A0EECC4B = {
- isa = PBXBuildFile;
- fileRef = 9193D2A3C463BEAA07FD424D;
- };
- F918FB5901F09EA77DB32022 = {
- isa = PBXBuildFile;
- fileRef = F7D557738137CA1A370BAA27;
- };
- 1006E2E5DFA26D7DD20BC438 = {
- isa = PBXBuildFile;
- fileRef = 855850D3F44F120C46DE82EC;
- };
- A6AA70BD9364BB974CDEB337 = {
- isa = PBXBuildFile;
- fileRef = C821C5805007FFDC2636BBE6;
- };
- EC14DA30C090DDC62084DB4C = {
- isa = PBXBuildFile;
- fileRef = 935CA85EF98714D3A17AE737;
- };
- F714F0C84F5945BF3539239E = {
- isa = PBXBuildFile;
- fileRef = 379F77D23BFAE3795282CEB3;
- };
- 1282A62308CD1AC3F88A5D03 = {
- isa = PBXBuildFile;
- fileRef = 5273768FBB55D0DD57A5E70C;
- };
- 006DF460F8DF66EFFA80D968 = {
- isa = PBXBuildFile;
- fileRef = 70F1CAF3C4C561DD81E6AFC1;
- };
- 987CBD5330E76B404F0D966C = {
- isa = PBXBuildFile;
- fileRef = 77C0AC21C1028911123844FC;
- };
- 9F618C008A503063D10076C4 = {
- isa = PBXBuildFile;
- fileRef = 74711D7544168CCAC4969A07;
- };
- BB9A9692D99DD0DDB1047B60 = {
- isa = PBXBuildFile;
- fileRef = 6D1F9E505D20C09647124F0A;
- };
- 6C2200C52B65E1BE80544E50 = {
- isa = PBXBuildFile;
- fileRef = AF330F41D1A4865108690E3C;
- };
- A1F34D09F4E4338775917ED1 = {
- isa = PBXBuildFile;
- fileRef = C6E2284D86D93F1D9D5C7666;
- };
- 2E28F61A64DEF942FE7B94C4 = {
- isa = PBXBuildFile;
- fileRef = AED58461CE961C62A0E0A552;
- };
- EA487FA4116517A8DFEE85B0 = {
- isa = PBXBuildFile;
- fileRef = FCEBB157FB526741DB6791D1;
- };
- 0977FEC02DAF29438583198A = {
- isa = PBXBuildFile;
- fileRef = 01E0EEF68A11C1CAF180E173;
- };
- 0FA2A3321630EBE83E439D99 = {
- isa = PBXBuildFile;
- fileRef = AFF729977947528F3E4AAA96;
- };
- 9EFD2AA2FFF3C125FDAA4279 = {
- isa = PBXBuildFile;
- fileRef = 7525879E73E8AF32FFA0CDDE;
- };
- C5E7BAD864E02CF37F7BD707 = {
- isa = PBXBuildFile;
- fileRef = 33AA348465F512DBA8778DAF;
- };
- CBC8F7E5225C73CEDFB3B72E = {
- isa = PBXBuildFile;
- fileRef = A7FF2B353C8568B5A7A80117;
- };
- CADEA83EAAC94E0011C07908 = {
- isa = PBXBuildFile;
- fileRef = 84B287BB2AD252B7D69AC47E;
- };
- 3717B9F9A0F7C9CB95F1BE7F = {
- isa = PBXBuildFile;
- fileRef = 7BE6330821794919A88ED8ED;
- };
- 61B523C52EBA17F738FFE31A = {
- isa = PBXBuildFile;
- fileRef = 660F1970CF687A7AE8371C6D;
- };
- C6348C6B1D0312580E97EA19 = {
- isa = PBXBuildFile;
- fileRef = 3BF06B70407FFDBE9534F942;
- };
- 01E0EEF68A11C1CAF180E173 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 0555BAE6156EAF15CA77A2D8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 080961C54C58ECF2346B4C23 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- 0ADF0DECFCB1DB4D3A847EB5 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = "juce_icon.png";
- path = "../../Source/juce_icon.png";
- sourceTree = "SOURCE_ROOT";
- };
- 18BFEBD944DDE4809C89F27A = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 1FD6DBAC73414DD4C152E34E = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- 25DEDA8C9F94A6C8DFC8E53E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SharedCanvas.h;
- path = ../../Source/SharedCanvas.h;
- sourceTree = "SOURCE_ROOT";
- };
- 2E13A899F4E3C99054A3656F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 33AA348465F512DBA8778DAF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 379F77D23BFAE3795282CEB3 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = UIKit.framework;
- path = System/Library/Frameworks/UIKit.framework;
- sourceTree = SDKROOT;
- };
- 3BF06B70407FFDBE9534F942 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_osc.cpp";
- path = "../../JuceLibraryCode/include_juce_osc.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 448838BE6E937D450A3C84CE = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 4D1DB6D77B6F3DE7A569780B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- 4FF648D72D6F1A78956CDA1B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = Demos.h;
- path = ../../Source/Demos.h;
- sourceTree = "SOURCE_ROOT";
- };
- 5273768FBB55D0DD57A5E70C = {
- isa = PBXFileReference;
- lastKnownFileType = folder.assetcatalog;
- name = Images.xcassets;
- path = NetworkGraphicsDemo/Images.xcassets;
- sourceTree = "SOURCE_ROOT";
- };
- 55CB060922ABCBC105FE38D2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_osc";
- path = "../../../../modules/juce_osc";
- sourceTree = "SOURCE_ROOT";
- };
- 660F1970CF687A7AE8371C6D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 6799B056504F9F017998B9E2 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- 68EBC0BF5F01E05FDCB3EEAF = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- 6D1F9E505D20C09647124F0A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 70F1CAF3C4C561DD81E6AFC1 = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- 74711D7544168CCAC4969A07 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = BinaryData.cpp;
- path = ../../JuceLibraryCode/BinaryData.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 7525879E73E8AF32FFA0CDDE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 77C0AC21C1028911123844FC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 7BE6330821794919A88ED8ED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 84B287BB2AD252B7D69AC47E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 855850D3F44F120C46DE82EC = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = MobileCoreServices.framework;
- path = System/Library/Frameworks/MobileCoreServices.framework;
- sourceTree = SDKROOT;
- };
- 89583CD42AD218E9753DF11C = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 8E2F72AFA0CDA64F0C07F105 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = SlaveComponent.h;
- path = ../../Source/SlaveComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 8EACAADD3A23DED3E252C92F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 9193D2A3C463BEAA07FD424D = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreText.framework;
- path = System/Library/Frameworks/CoreText.framework;
- sourceTree = SDKROOT;
- };
- 92800676AF753D1A60108F11 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = BinaryData.h;
- path = ../../JuceLibraryCode/BinaryData.h;
- sourceTree = "SOURCE_ROOT";
- };
- 935CA85EF98714D3A17AE737 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- 9982F39121710EFFD5FEEAEF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = MasterComponent.h;
- path = ../../Source/MasterComponent.h;
- sourceTree = "SOURCE_ROOT";
- };
- 9C67BD1915C7FD5747C2BA8F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- 9C689AFBF364CB167C422D29 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- 9E8129263CD42C6029FC2CAD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- A505E1DABB2ED630EFBA96DB = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- A7FF2B353C8568B5A7A80117 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AED58461CE961C62A0E0A552 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AF330F41D1A4865108690E3C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AFF729977947528F3E4AAA96 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- B5433B00F012AD87AADBFCD6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- B76F10A7778664E164A01934 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- BA2E40409255F1B078406221 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- C6E2284D86D93F1D9D5C7666 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- C821C5805007FFDC2636BBE6 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGLES.framework;
- path = System/Library/Frameworks/OpenGLES.framework;
- sourceTree = SDKROOT;
- };
- D12A0DFFE18728E84D9AB739 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- DA40ED39AF4B56000E5A2743 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreGraphics.framework;
- path = System/Library/Frameworks/CoreGraphics.framework;
- sourceTree = SDKROOT;
- };
- E4162459ED4C829EF7B19691 = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = "JUCE Network Graphics Demo.app";
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- E4EA870A22A0C6649E55DD30 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- E51ABCA80B75F33848F28184 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreImage.framework;
- path = System/Library/Frameworks/CoreImage.framework;
- sourceTree = SDKROOT;
- };
- F7D557738137CA1A370BAA27 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Foundation.framework;
- path = System/Library/Frameworks/Foundation.framework;
- sourceTree = SDKROOT;
- };
- F98A4DAA0502EE9252EBE06F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- FA0A789443FD480003E40435 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- FCEBB157FB526741DB6791D1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5A58AF0A052C539F0E342A88 = {
- isa = PBXGroup;
- children = (
- 4FF648D72D6F1A78956CDA1B,
- 77C0AC21C1028911123844FC,
- 9982F39121710EFFD5FEEAEF,
- 8E2F72AFA0CDA64F0C07F105,
- 25DEDA8C9F94A6C8DFC8E53E,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 856518502A948813C90E6761 = {
- isa = PBXGroup;
- children = (
- 5A58AF0A052C539F0E342A88,
- 0ADF0DECFCB1DB4D3A847EB5,
- );
- name = NetworkGraphicsDemo;
- sourceTree = "<group>";
- };
- EF0AACA84F1CEE7F45F56339 = {
- isa = PBXGroup;
- children = (
- B76F10A7778664E164A01934,
- 89583CD42AD218E9753DF11C,
- 9C67BD1915C7FD5747C2BA8F,
- A505E1DABB2ED630EFBA96DB,
- E4EA870A22A0C6649E55DD30,
- 8EACAADD3A23DED3E252C92F,
- B5433B00F012AD87AADBFCD6,
- BA2E40409255F1B078406221,
- F98A4DAA0502EE9252EBE06F,
- 18BFEBD944DDE4809C89F27A,
- FA0A789443FD480003E40435,
- 9C689AFBF364CB167C422D29,
- 68EBC0BF5F01E05FDCB3EEAF,
- 55CB060922ABCBC105FE38D2,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- C20D4DECE1291BF6AF8711DC = {
- isa = PBXGroup;
- children = (
- 0555BAE6156EAF15CA77A2D8,
- 74711D7544168CCAC4969A07,
- 92800676AF753D1A60108F11,
- 6D1F9E505D20C09647124F0A,
- AF330F41D1A4865108690E3C,
- C6E2284D86D93F1D9D5C7666,
- AED58461CE961C62A0E0A552,
- FCEBB157FB526741DB6791D1,
- 01E0EEF68A11C1CAF180E173,
- AFF729977947528F3E4AAA96,
- 7525879E73E8AF32FFA0CDDE,
- 33AA348465F512DBA8778DAF,
- A7FF2B353C8568B5A7A80117,
- 84B287BB2AD252B7D69AC47E,
- 7BE6330821794919A88ED8ED,
- 660F1970CF687A7AE8371C6D,
- 3BF06B70407FFDBE9534F942,
- D12A0DFFE18728E84D9AB739,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- 4AA57E2B5FD5374D348EEF7F = {
- isa = PBXGroup;
- children = (
- 1FD6DBAC73414DD4C152E34E,
- 5273768FBB55D0DD57A5E70C,
- 70F1CAF3C4C561DD81E6AFC1,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 71F5560BE0EE3A17A9CE44F6 = {
- isa = PBXGroup;
- children = (
- 2E13A899F4E3C99054A3656F,
- 9E8129263CD42C6029FC2CAD,
- 080961C54C58ECF2346B4C23,
- 6799B056504F9F017998B9E2,
- 4D1DB6D77B6F3DE7A569780B,
- DA40ED39AF4B56000E5A2743,
- E51ABCA80B75F33848F28184,
- 448838BE6E937D450A3C84CE,
- 9193D2A3C463BEAA07FD424D,
- F7D557738137CA1A370BAA27,
- 855850D3F44F120C46DE82EC,
- C821C5805007FFDC2636BBE6,
- 935CA85EF98714D3A17AE737,
- 379F77D23BFAE3795282CEB3,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 8B59A884C62D960EE9DFEF47 = {
- isa = PBXGroup;
- children = (
- E4162459ED4C829EF7B19691,
- );
- name = Products;
- sourceTree = "<group>";
- };
- D2EB65517396C974F0415A7F = {
- isa = PBXGroup;
- children = (
- 856518502A948813C90E6761,
- EF0AACA84F1CEE7F45F56339,
- C20D4DECE1291BF6AF8711DC,
- 4AA57E2B5FD5374D348EEF7F,
- 71F5560BE0EE3A17A9CE44F6,
- 8B59A884C62D960EE9DFEF47,
- );
- name = Source;
- sourceTree = "<group>";
- };
- EE7498599191DDC73ECB55B0 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ F468E8C7B02DFD4D53911277 = {isa = PBXBuildFile; fileRef = E4162459ED4C829EF7B19691; };
+ 80EE2C27B466BAFD83881D3F = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; };
+ C4D6C466C41173D6970553D2 = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; };
+ 3CC6DC6E223415B506D0CB75 = {isa = PBXBuildFile; fileRef = 080961C54C58ECF2346B4C23; };
+ 67DF295E93E54432043126DF = {isa = PBXBuildFile; fileRef = 6799B056504F9F017998B9E2; };
+ 770AB74B1D3A0108F764DD47 = {isa = PBXBuildFile; fileRef = 4D1DB6D77B6F3DE7A569780B; };
+ 366A216FDEBD7BDDC1BA12D9 = {isa = PBXBuildFile; fileRef = DA40ED39AF4B56000E5A2743; };
+ 1F7A8BD2B43B3D191132301D = {isa = PBXBuildFile; fileRef = E51ABCA80B75F33848F28184; };
+ CA694B2A73FCF12D7F9E7E49 = {isa = PBXBuildFile; fileRef = 448838BE6E937D450A3C84CE; };
+ 5A64B64E5B45AEA1A0EECC4B = {isa = PBXBuildFile; fileRef = 9193D2A3C463BEAA07FD424D; };
+ F918FB5901F09EA77DB32022 = {isa = PBXBuildFile; fileRef = F7D557738137CA1A370BAA27; };
+ 1006E2E5DFA26D7DD20BC438 = {isa = PBXBuildFile; fileRef = 855850D3F44F120C46DE82EC; };
+ A6AA70BD9364BB974CDEB337 = {isa = PBXBuildFile; fileRef = C821C5805007FFDC2636BBE6; };
+ EC14DA30C090DDC62084DB4C = {isa = PBXBuildFile; fileRef = 935CA85EF98714D3A17AE737; };
+ F714F0C84F5945BF3539239E = {isa = PBXBuildFile; fileRef = 379F77D23BFAE3795282CEB3; };
+ 1282A62308CD1AC3F88A5D03 = {isa = PBXBuildFile; fileRef = 5273768FBB55D0DD57A5E70C; };
+ 006DF460F8DF66EFFA80D968 = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; };
+ 987CBD5330E76B404F0D966C = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; };
+ 9F618C008A503063D10076C4 = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; };
+ BB9A9692D99DD0DDB1047B60 = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; };
+ 6C2200C52B65E1BE80544E50 = {isa = PBXBuildFile; fileRef = AF330F41D1A4865108690E3C; };
+ A1F34D09F4E4338775917ED1 = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; };
+ 2E28F61A64DEF942FE7B94C4 = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; };
+ EA487FA4116517A8DFEE85B0 = {isa = PBXBuildFile; fileRef = FCEBB157FB526741DB6791D1; };
+ 0977FEC02DAF29438583198A = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; };
+ 0FA2A3321630EBE83E439D99 = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; };
+ 9EFD2AA2FFF3C125FDAA4279 = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; };
+ C5E7BAD864E02CF37F7BD707 = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; };
+ CBC8F7E5225C73CEDFB3B72E = {isa = PBXBuildFile; fileRef = A7FF2B353C8568B5A7A80117; };
+ CADEA83EAAC94E0011C07908 = {isa = PBXBuildFile; fileRef = 84B287BB2AD252B7D69AC47E; };
+ 3717B9F9A0F7C9CB95F1BE7F = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; };
+ 61B523C52EBA17F738FFE31A = {isa = PBXBuildFile; fileRef = 660F1970CF687A7AE8371C6D; };
+ C6348C6B1D0312580E97EA19 = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; };
+ 01E0EEF68A11C1CAF180E173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 0555BAE6156EAF15CA77A2D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 080961C54C58ECF2346B4C23 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ 0ADF0DECFCB1DB4D3A847EB5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+ 18BFEBD944DDE4809C89F27A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 1FD6DBAC73414DD4C152E34E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 25DEDA8C9F94A6C8DFC8E53E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = "SOURCE_ROOT"; };
+ 2E13A899F4E3C99054A3656F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 33AA348465F512DBA8778DAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 379F77D23BFAE3795282CEB3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 3BF06B70407FFDBE9534F942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 448838BE6E937D450A3C84CE = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 4D1DB6D77B6F3DE7A569780B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ 4FF648D72D6F1A78956CDA1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = "SOURCE_ROOT"; };
+ 5273768FBB55D0DD57A5E70C = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NetworkGraphicsDemo/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+ 55CB060922ABCBC105FE38D2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+ 660F1970CF687A7AE8371C6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6799B056504F9F017998B9E2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 68EBC0BF5F01E05FDCB3EEAF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ 6D1F9E505D20C09647124F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 70F1CAF3C4C561DD81E6AFC1 = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ 74711D7544168CCAC4969A07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 7525879E73E8AF32FFA0CDDE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 77C0AC21C1028911123844FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 7BE6330821794919A88ED8ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 84B287BB2AD252B7D69AC47E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 855850D3F44F120C46DE82EC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
+ 89583CD42AD218E9753DF11C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 8E2F72AFA0CDA64F0C07F105 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SlaveComponent.h; path = ../../Source/SlaveComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 8EACAADD3A23DED3E252C92F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 9193D2A3C463BEAA07FD424D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+ 92800676AF753D1A60108F11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+ 935CA85EF98714D3A17AE737 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 9982F39121710EFFD5FEEAEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MasterComponent.h; path = ../../Source/MasterComponent.h; sourceTree = "SOURCE_ROOT"; };
+ 9C67BD1915C7FD5747C2BA8F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ 9C689AFBF364CB167C422D29 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ 9E8129263CD42C6029FC2CAD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ A505E1DABB2ED630EFBA96DB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ A7FF2B353C8568B5A7A80117 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ AED58461CE961C62A0E0A552 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ AF330F41D1A4865108690E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ AFF729977947528F3E4AAA96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ B5433B00F012AD87AADBFCD6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ B76F10A7778664E164A01934 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ BA2E40409255F1B078406221 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ C6E2284D86D93F1D9D5C7666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ C821C5805007FFDC2636BBE6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+ D12A0DFFE18728E84D9AB739 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ DA40ED39AF4B56000E5A2743 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ E4162459ED4C829EF7B19691 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "JUCE Network Graphics Demo.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ E4EA870A22A0C6649E55DD30 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ E51ABCA80B75F33848F28184 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ F7D557738137CA1A370BAA27 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ F98A4DAA0502EE9252EBE06F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ FA0A789443FD480003E40435 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ FCEBB157FB526741DB6791D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5A58AF0A052C539F0E342A88 = {isa = PBXGroup; children = (
+ 4FF648D72D6F1A78956CDA1B,
+ 77C0AC21C1028911123844FC,
+ 9982F39121710EFFD5FEEAEF,
+ 8E2F72AFA0CDA64F0C07F105,
+ 25DEDA8C9F94A6C8DFC8E53E, ); name = Source; sourceTree = "<group>"; };
+ 856518502A948813C90E6761 = {isa = PBXGroup; children = (
+ 5A58AF0A052C539F0E342A88,
+ 0ADF0DECFCB1DB4D3A847EB5, ); name = NetworkGraphicsDemo; sourceTree = "<group>"; };
+ EF0AACA84F1CEE7F45F56339 = {isa = PBXGroup; children = (
+ B76F10A7778664E164A01934,
+ 89583CD42AD218E9753DF11C,
+ 9C67BD1915C7FD5747C2BA8F,
+ A505E1DABB2ED630EFBA96DB,
+ E4EA870A22A0C6649E55DD30,
+ 8EACAADD3A23DED3E252C92F,
+ B5433B00F012AD87AADBFCD6,
+ BA2E40409255F1B078406221,
+ F98A4DAA0502EE9252EBE06F,
+ 18BFEBD944DDE4809C89F27A,
+ FA0A789443FD480003E40435,
+ 9C689AFBF364CB167C422D29,
+ 68EBC0BF5F01E05FDCB3EEAF,
+ 55CB060922ABCBC105FE38D2, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ C20D4DECE1291BF6AF8711DC = {isa = PBXGroup; children = (
+ 0555BAE6156EAF15CA77A2D8,
+ 74711D7544168CCAC4969A07,
+ 92800676AF753D1A60108F11,
+ 6D1F9E505D20C09647124F0A,
+ AF330F41D1A4865108690E3C,
+ C6E2284D86D93F1D9D5C7666,
+ AED58461CE961C62A0E0A552,
+ FCEBB157FB526741DB6791D1,
+ 01E0EEF68A11C1CAF180E173,
+ AFF729977947528F3E4AAA96,
+ 7525879E73E8AF32FFA0CDDE,
+ 33AA348465F512DBA8778DAF,
+ A7FF2B353C8568B5A7A80117,
+ 84B287BB2AD252B7D69AC47E,
+ 7BE6330821794919A88ED8ED,
+ 660F1970CF687A7AE8371C6D,
+ 3BF06B70407FFDBE9534F942,
+ D12A0DFFE18728E84D9AB739, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ 4AA57E2B5FD5374D348EEF7F = {isa = PBXGroup; children = (
+ 1FD6DBAC73414DD4C152E34E,
+ 5273768FBB55D0DD57A5E70C,
+ 70F1CAF3C4C561DD81E6AFC1, ); name = Resources; sourceTree = "<group>"; };
+ 71F5560BE0EE3A17A9CE44F6 = {isa = PBXGroup; children = (
+ 2E13A899F4E3C99054A3656F,
+ 9E8129263CD42C6029FC2CAD,
+ 080961C54C58ECF2346B4C23,
+ 6799B056504F9F017998B9E2,
+ 4D1DB6D77B6F3DE7A569780B,
+ DA40ED39AF4B56000E5A2743,
+ E51ABCA80B75F33848F28184,
+ 448838BE6E937D450A3C84CE,
+ 9193D2A3C463BEAA07FD424D,
+ F7D557738137CA1A370BAA27,
+ 855850D3F44F120C46DE82EC,
+ C821C5805007FFDC2636BBE6,
+ 935CA85EF98714D3A17AE737,
+ 379F77D23BFAE3795282CEB3, ); name = Frameworks; sourceTree = "<group>"; };
+ 8B59A884C62D960EE9DFEF47 = {isa = PBXGroup; children = (
+ E4162459ED4C829EF7B19691, ); name = Products; sourceTree = "<group>"; };
+ D2EB65517396C974F0415A7F = {isa = PBXGroup; children = (
+ 856518502A948813C90E6761,
+ EF0AACA84F1CEE7F45F56339,
+ C20D4DECE1291BF6AF8711DC,
+ 4AA57E2B5FD5374D348EEF7F,
+ 71F5560BE0EE3A17A9CE44F6,
+ 8B59A884C62D960EE9DFEF47, ); name = Source; sourceTree = "<group>"; };
+ EE7498599191DDC73ECB55B0 = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
- PRODUCT_NAME = "JUCE Network Graphics Demo";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 2E06386CE7CCA5FF76819BFF = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 2E06386CE7CCA5FF76819BFF = {isa = XCBuildConfiguration; buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
- PRODUCT_NAME = "JUCE Network Graphics Demo";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- 3BF0365A560ACD4FD24D40CE = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ USE_HEADERMAP = NO; }; name = Release; };
+ 3BF0365A560ACD4FD24D40CE = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 9C6D2FD441D79104734762A5 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 9C6D2FD441D79104734762A5 = {isa = XCBuildConfiguration; buildSettings = {
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 80BE97CC38B01FABC0E73204 = {
- isa = PBXTargetDependency;
- target = 4311FBCBD02948A0ED96C7DD;
- };
- 02715337C584F3C721251428 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3BF0365A560ACD4FD24D40CE,
- 9C6D2FD441D79104734762A5,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B73863F5D180C23D3EC40C38 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- EE7498599191DDC73ECB55B0,
- 2E06386CE7CCA5FF76819BFF,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 714944DB86A4D402E7FA269E = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1282A62308CD1AC3F88A5D03,
- 006DF460F8DF66EFFA80D968,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C2977559BF9148DB70CA10AE = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 987CBD5330E76B404F0D966C,
- 9F618C008A503063D10076C4,
- BB9A9692D99DD0DDB1047B60,
- 6C2200C52B65E1BE80544E50,
- A1F34D09F4E4338775917ED1,
- 2E28F61A64DEF942FE7B94C4,
- EA487FA4116517A8DFEE85B0,
- 0977FEC02DAF29438583198A,
- 0FA2A3321630EBE83E439D99,
- 9EFD2AA2FFF3C125FDAA4279,
- C5E7BAD864E02CF37F7BD707,
- CBC8F7E5225C73CEDFB3B72E,
- CADEA83EAAC94E0011C07908,
- 3717B9F9A0F7C9CB95F1BE7F,
- 61B523C52EBA17F738FFE31A,
- C6348C6B1D0312580E97EA19,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 865E89B94B41EB14C202CBB0 = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 80EE2C27B466BAFD83881D3F,
- C4D6C466C41173D6970553D2,
- 3CC6DC6E223415B506D0CB75,
- 67DF295E93E54432043126DF,
- 770AB74B1D3A0108F764DD47,
- 366A216FDEBD7BDDC1BA12D9,
- 1F7A8BD2B43B3D191132301D,
- CA694B2A73FCF12D7F9E7E49,
- 5A64B64E5B45AEA1A0EECC4B,
- F918FB5901F09EA77DB32022,
- 1006E2E5DFA26D7DD20BC438,
- A6AA70BD9364BB974CDEB337,
- EC14DA30C090DDC62084DB4C,
- F714F0C84F5945BF3539239E,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4311FBCBD02948A0ED96C7DD = {
- isa = PBXNativeTarget;
- buildConfigurationList = B73863F5D180C23D3EC40C38;
- buildPhases = (
- 714944DB86A4D402E7FA269E,
- C2977559BF9148DB70CA10AE,
- 865E89B94B41EB14C202CBB0,
- );
- buildRules = ( );
- dependencies = ( );
- name = "NetworkGraphicsDemo - App";
- productName = NetworkGraphicsDemo;
- productReference = E4162459ED4C829EF7B19691;
- productType = "com.apple.product-type.application";
- };
- A5398ADB6F5B128C00EB935C = {
- isa = PBXProject;
- buildConfigurationList = 02715337C584F3C721251428;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = D2EB65517396C974F0415A7F;
- projectDirPath = "";
- projectRoot = "";
- targets = (4311FBCBD02948A0ED96C7DD);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ 80BE97CC38B01FABC0E73204 = {isa = PBXTargetDependency; target = 4311FBCBD02948A0ED96C7DD; };
+ 02715337C584F3C721251428 = {isa = XCConfigurationList; buildConfigurations = (
+ 3BF0365A560ACD4FD24D40CE,
+ 9C6D2FD441D79104734762A5, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ B73863F5D180C23D3EC40C38 = {isa = XCConfigurationList; buildConfigurations = (
+ EE7498599191DDC73ECB55B0,
+ 2E06386CE7CCA5FF76819BFF, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 714944DB86A4D402E7FA269E = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 1282A62308CD1AC3F88A5D03,
+ 006DF460F8DF66EFFA80D968, ); runOnlyForDeploymentPostprocessing = 0; };
+ C2977559BF9148DB70CA10AE = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 987CBD5330E76B404F0D966C,
+ 9F618C008A503063D10076C4,
+ BB9A9692D99DD0DDB1047B60,
+ 6C2200C52B65E1BE80544E50,
+ A1F34D09F4E4338775917ED1,
+ 2E28F61A64DEF942FE7B94C4,
+ EA487FA4116517A8DFEE85B0,
+ 0977FEC02DAF29438583198A,
+ 0FA2A3321630EBE83E439D99,
+ 9EFD2AA2FFF3C125FDAA4279,
+ C5E7BAD864E02CF37F7BD707,
+ CBC8F7E5225C73CEDFB3B72E,
+ CADEA83EAAC94E0011C07908,
+ 3717B9F9A0F7C9CB95F1BE7F,
+ 61B523C52EBA17F738FFE31A,
+ C6348C6B1D0312580E97EA19, ); runOnlyForDeploymentPostprocessing = 0; };
+ 865E89B94B41EB14C202CBB0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ 80EE2C27B466BAFD83881D3F,
+ C4D6C466C41173D6970553D2,
+ 3CC6DC6E223415B506D0CB75,
+ 67DF295E93E54432043126DF,
+ 770AB74B1D3A0108F764DD47,
+ 366A216FDEBD7BDDC1BA12D9,
+ 1F7A8BD2B43B3D191132301D,
+ CA694B2A73FCF12D7F9E7E49,
+ 5A64B64E5B45AEA1A0EECC4B,
+ F918FB5901F09EA77DB32022,
+ 1006E2E5DFA26D7DD20BC438,
+ A6AA70BD9364BB974CDEB337,
+ EC14DA30C090DDC62084DB4C,
+ F714F0C84F5945BF3539239E, ); runOnlyForDeploymentPostprocessing = 0; };
+ 4311FBCBD02948A0ED96C7DD = {isa = PBXNativeTarget; buildConfigurationList = B73863F5D180C23D3EC40C38; buildPhases = (
+ 714944DB86A4D402E7FA269E,
+ C2977559BF9148DB70CA10AE,
+ 865E89B94B41EB14C202CBB0, ); buildRules = ( ); dependencies = ( ); name = "NetworkGraphicsDemo - App"; productName = NetworkGraphicsDemo; productReference = E4162459ED4C829EF7B19691; productType = "com.apple.product-type.application"; };
+ A5398ADB6F5B128C00EB935C = {isa = PBXProject; buildConfigurationList = 02715337C584F3C721251428; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = D2EB65517396C974F0415A7F; projectDirPath = ""; projectRoot = ""; targets = (4311FBCBD02948A0ED96C7DD); };
};
rootObject = A5398ADB6F5B128C00EB935C;
}
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_events flags:\r
\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
//#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
{\r
unsigned int hash = 0;\r
-\r
- if (resourceNameUTF8 != nullptr)\r
+ if (resourceNameUTF8 != 0)\r
while (*resourceNameUTF8 != 0)\r
hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
\r
namespace ProjectInfo\r
{\r
const char* const projectName = "NetworkGraphicsDemo";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="gWI5Ir" name="NetworkGraphicsDemo" projectType="guiapp" bundleIdentifier="com.juce.NetworkGraphicsDemo"\r
- jucerVersion="5.4.1" displaySplashScreen="0" reportAppUsage="0"\r
+ jucerVersion="5.3.1" displaySplashScreen="0" reportAppUsage="0"\r
companyName="ROLI Ltd." companyCopyright="ROLI Ltd.">\r
<MAINGROUP id="OT9rJ2" name="NetworkGraphicsDemo">\r
<GROUP id="{48D54E6E-37F4-B20A-E038-C63E4EDFD4D9}" name="Source">\r
androidCpp11="1" targetFolder="Builds/Android" androidSDKPath=""\r
androidNDKPath="" bigIcon="Ww6bQw" gradleToolchainVersion="3.6">\r
<CONFIGURATIONS>\r
- <CONFIGURATION name="Debug" androidArchitectures="armeabi-v7a x86" isDebug="1"\r
+ <CONFIGURATION name="Debug" androidArchitectures="armeabi armeabi-v7a x86" isDebug="1"\r
optimisation="6" targetName="JUCE Network Graphics Demo" defines="JUCE_DEBUG=0"/>\r
<CONFIGURATION name="Release" androidArchitectures="" isDebug="0" targetName="JUCE Network Graphics Demo"/>\r
</CONFIGURATIONS>\r
This example is an app that we threw together to run as a demo of JUCE on our\r
booth at CES 2016.\r
\r
-It allows a collection of heterogeneous devices on a local network to collectively\r
+It allows a collection of heterogenous devices on a local network to collectively\r
draw parts of a large animated vector graphic image that is being generated and\r
broadcast by one of the machines (the 'master').\r
\r
</svg>\r
)blahblah";\r
\r
- logo.reset (Drawable::createFromSVG (*parseXML (logoData)));\r
+ std::unique_ptr<XmlElement> svg (XmlDocument::parse (logoData));\r
+ logo.reset (Drawable::createFromSVG (*svg));\r
}\r
\r
String getName() const override { return "Background Image"; }\r
\r
namespace\r
{\r
+ String getIPAddress()\r
+ {\r
+ Array<IPAddress> addresses;\r
+ IPAddress::findAllAddresses (addresses);\r
+ return addresses[1].toString();\r
+ }\r
+\r
String getBroadcastIPAddress()\r
{\r
- return IPAddress::getLocalAddress().toString().upToLastOccurrenceOf (".", false, false) + ".255";\r
+ return getIPAddress().upToLastOccurrenceOf (".", false, false) + ".255";\r
}\r
\r
static const int masterPortNumber = 9001; // the UDP port the master sends on / the clients receive.\r
//==============================================================================\r
String getMachineInfoToDisplay() const\r
{\r
- auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (getScreenBounds().getCentre());\r
- return getOSName() + " " + String (display.dpi) + " " + String (display.scale);\r
+ //auto display = Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre());\r
+ return getOSName();// + " " + String (display.dpi) + " " + String (display.scale);\r
}\r
\r
static String getOSName()\r
if (auto client = canvas.findClient (clientName))\r
{\r
auto screenBounds = getScreenBounds();\r
- auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (screenBounds.getCentre());\r
+ auto display = Desktop::getInstance().getDisplays().getDisplayContaining (screenBounds.getCentre());\r
return ((screenBounds - display.userArea.getCentre()).toFloat() / (client->scaleFactor * display.dpi / display.scale)) + client->centre;\r
}\r
\r
{\r
if (auto client = canvas.findClient (clientName))\r
{\r
- auto display = Desktop::getInstance().getDisplays().findDisplayForPoint (getScreenBounds().getCentre());\r
+ auto display = Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre());\r
return (display.userArea.toFloat() / (client->scaleFactor * display.dpi / display.scale)).withCentre (client->centre);\r
}\r
\r
\r
void timerCallback() override\r
{\r
- send (newClientOSCAddress, clientName + ":" + IPAddress::getLocalAddress().toString()\r
+ send (newClientOSCAddress, clientName + ":" + getIPAddress()\r
+ ":" + getScreenAreaInGlobalSpace().toString());\r
}\r
\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := Projucer\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.4.1 -DJUCE_APP_VERSION_HEX=0x50401 $(shell pkg-config --cflags freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=5.3.2 -DJUCE_APP_VERSION_HEX=0x50302 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_APP := Projucer\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/jucer_FileHelpers_54f12f83.o \\r
$(JUCE_OBJDIR)/jucer_MiscUtilities_31fc8dd8.o \\r
$(JUCE_OBJDIR)/jucer_PIPGenerator_fd3402c7.o \\r
+ $(JUCE_OBJDIR)/jucer_DependencyPathPropertyComponent_5d68c773.o \\r
$(JUCE_OBJDIR)/jucer_Icons_d02d18f1.o \\r
$(JUCE_OBJDIR)/jucer_JucerTreeViewBase_9b9f2ff0.o \\r
$(JUCE_OBJDIR)/jucer_ProjucerLookAndFeel_3b20291d.o \\r
$(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \\r
$(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)\r
@echo Linking "Projucer - App"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling jucer_PIPGenerator.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+$(JUCE_OBJDIR)/jucer_DependencyPathPropertyComponent_5d68c773.o: ../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp\r
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)\r
+ @echo "Compiling jucer_DependencyPathPropertyComponent.cpp"\r
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
+\r
$(JUCE_OBJDIR)/jucer_Icons_d02d18f1.o: ../../Source/Utility/UI/jucer_Icons.cpp\r
-$(V_AT)mkdir -p $(JUCE_OBJDIR)\r
@echo "Compiling jucer_Icons.cpp"\r
@echo "Compiling include_juce_gui_extra.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
clean:\r
@echo Cleaning Projucer\r
$(V_AT)$(CLEANCMD)\r
<key>CFBundleSignature</key>\r
<string>????</string>\r
<key>CFBundleShortVersionString</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>CFBundleVersion</key>\r
- <string>5.4.1</string>\r
+ <string>5.3.2</string>\r
<key>NSHumanReadableCopyright</key>\r
<string>ROLI Ltd.</string>\r
<key>NSHighResolutionCapable</key>\r
};
objectVersion = 46;
objects = {
- A6A9D7624D002544ECB81D82 = {
- isa = PBXBuildFile;
- fileRef = 09DE066936CF037E9709ADB1;
- };
- A578EAD4BB55680E8097BE0F = {
- isa = PBXBuildFile;
- fileRef = 80D62B907248523E6943298B;
- };
- C1B9334AE849F93FB3C56B34 = {
- isa = PBXBuildFile;
- fileRef = 5A75806B34E4EA6598A6024A;
- };
- 8B4A593B3869815BBAC3EF93 = {
- isa = PBXBuildFile;
- fileRef = 7B3F7ECF6DBF8C8EE5C2CB86;
- };
- A14C2C2725DA3CA7995D2815 = {
- isa = PBXBuildFile;
- fileRef = 210CD22F25F2C22F9CEEB025;
- };
- 1E76E36772355E2A43CF4961 = {
- isa = PBXBuildFile;
- fileRef = D00F311BFC3C2625C457CB9B;
- };
- 241F29FCBB7A17BB44A0B10C = {
- isa = PBXBuildFile;
- fileRef = D1F9B0E9F5D54FE48BEB46EA;
- };
- 9359F9401D59B4517F75C39C = {
- isa = PBXBuildFile;
- fileRef = 728FE25157E9874D50BBECB2;
- };
- 091A57B4B9CE623E75E9A756 = {
- isa = PBXBuildFile;
- fileRef = E983E6DDE3318B872EBE347F;
- };
- FAB47E69F7D9DCE1F906AA07 = {
- isa = PBXBuildFile;
- fileRef = 8F7BE18698ADCEF51CDE4A5C;
- };
- 0E884E47A637D6C65154699A = {
- isa = PBXBuildFile;
- fileRef = 842427CFE565F3FCE5B99174;
- };
- 49C22786B54C5DC94E4654B8 = {
- isa = PBXBuildFile;
- fileRef = E96597BBC6A98255B51B94DC;
- };
- CDEF9FF2D119476D707305DF = {
- isa = PBXBuildFile;
- fileRef = 431D30038CBF67F80E8B3A13;
- };
- 96EC6315E1B3F1A109F84BAF = {
- isa = PBXBuildFile;
- fileRef = 9F01BA9942D038EA8B5289A8;
- };
- 11D42F7EC6E6539D79A7F4B1 = {
- isa = PBXBuildFile;
- fileRef = E5D6C36496F5BC84D7213BE8;
- };
- B980464FA2761CCD64B1FAD6 = {
- isa = PBXBuildFile;
- fileRef = CF6C8BD0DA3D8CD4E99EBADA;
- };
- 2610F357881240ACBF612F48 = {
- isa = PBXBuildFile;
- fileRef = 6678E9B3EEACAD47F438B264;
- };
- 1321E6C1C6170B6C898AD09D = {
- isa = PBXBuildFile;
- fileRef = 951128CA33CCDEF570436B1C;
- };
- 6DD9DA1677A6CF789CDAB478 = {
- isa = PBXBuildFile;
- fileRef = 0D4D508C638BC74943B9976D;
- };
- 954A036F5DDB375DB23FFB3E = {
- isa = PBXBuildFile;
- fileRef = 0400CB0E056A1D840304D2DE;
- };
- 95B44E6C74B1DED31DBE37EB = {
- isa = PBXBuildFile;
- fileRef = 8C52A3DDA62A746AA7A68535;
- };
- AA9D0B8E23F3D87A23DE9F8A = {
- isa = PBXBuildFile;
- fileRef = 9069981E414A631B036CC9AC;
- };
- 98F9BB4612E82EE59689E15C = {
- isa = PBXBuildFile;
- fileRef = B6496F16ACE80CACC5721570;
- };
- 09C4EDDF7F8B6E75EA3CE3A9 = {
- isa = PBXBuildFile;
- fileRef = BC3B310D42C489E8B8D93327;
- };
- 71713DE4716DCEDB45A206E2 = {
- isa = PBXBuildFile;
- fileRef = F9111E150CFF155329D44853;
- };
- 940CE4E081E9E685243C07AA = {
- isa = PBXBuildFile;
- fileRef = 332AF94C3275FEA8B878D603;
- };
- 49EEEA5B74D38F3C5A8794F1 = {
- isa = PBXBuildFile;
- fileRef = 8F731F1F98BAB42F1C3B96AA;
- };
- 6FD9428439B572B558EF64EA = {
- isa = PBXBuildFile;
- fileRef = BF301C2E545AEB4AC112C176;
- };
- 6EAAAAB0C2B2DA259B26D63C = {
- isa = PBXBuildFile;
- fileRef = 1DCA18E935A35D29D2D9B6A0;
- };
- 4C0F95265A230E5A8717A0A9 = {
- isa = PBXBuildFile;
- fileRef = D6390A40B3279E0E626C78D3;
- };
- FFA8B18CDF2D2AA500698A96 = {
- isa = PBXBuildFile;
- fileRef = 512D80BE12634967A085A1DC;
- };
- EE26A1C2DAAB609362F407EA = {
- isa = PBXBuildFile;
- fileRef = 988F5C1E40DED02D8B064253;
- };
- 4FAAB649E846BA2764C02ACE = {
- isa = PBXBuildFile;
- fileRef = 72ED72174F9DBD0ABD8AFCED;
- };
- 7D750EF5FCE1E1A461D435BE = {
- isa = PBXBuildFile;
- fileRef = 4AE72953E3B3DF06D3B9BA86;
- };
- 537ABF1DB09DDBD1542A2B0C = {
- isa = PBXBuildFile;
- fileRef = EF25A29A2194FC107B40F65F;
- };
- 290F2CD930097091B8DB122E = {
- isa = PBXBuildFile;
- fileRef = 00E6B87A43453B51850550E1;
- };
- 4B2F2DAA45060D3F250D0AE4 = {
- isa = PBXBuildFile;
- fileRef = 6F02C3B7FEA3B50692A70DE5;
- };
- BDD30804C9424526A1122A28 = {
- isa = PBXBuildFile;
- fileRef = 351AF80A004D766E314AB76D;
- };
- 37D582DA2227E004BFA237EC = {
- isa = PBXBuildFile;
- fileRef = 6E70C1FA80F02D4C310F63AA;
- };
- 9B8ED9D50406E5D75DEE57F5 = {
- isa = PBXBuildFile;
- fileRef = FFE01768CF1C8DBDAA894F76;
- };
- 89116B0BD882B51C63A84425 = {
- isa = PBXBuildFile;
- fileRef = 0EE17BE4154CF1B2EE683894;
- };
- 63D97E01F2C4C91037CB65BD = {
- isa = PBXBuildFile;
- fileRef = 24EB4C2412821B8019D6F754;
- };
- 45A53AF13B0D663050632E8C = {
- isa = PBXBuildFile;
- fileRef = 9EF583A6201DBC813C2F63C4;
- };
- C2A85091A28C907A4E1E1687 = {
- isa = PBXBuildFile;
- fileRef = 133F1E428260C5ADDF496DF9;
- };
- 83431B7234A78ECFB3C15F63 = {
- isa = PBXBuildFile;
- fileRef = 78D0DBC4798FF040FDB90F6D;
- };
- 209FCCC2155A1FCB7E11E20D = {
- isa = PBXBuildFile;
- fileRef = 269A454F1FF081DA67FFD578;
- };
- C93569F47B4AC1A8E37992ED = {
- isa = PBXBuildFile;
- fileRef = 9D7689451732AF8333402B3A;
- };
- 1B988E139004D8E2850EB656 = {
- isa = PBXBuildFile;
- fileRef = C187718F7B9EBA88584B43F3;
- };
- 6FD0752A5CADCF60D79FDBB7 = {
- isa = PBXBuildFile;
- fileRef = 51CBE59779A36D1B80B26974;
- };
- D25EBE02B55DB244BE0D5635 = {
- isa = PBXBuildFile;
- fileRef = DE3E6B2614229FAD56D50770;
- };
- 85E7FCB0516EFF853FA7B380 = {
- isa = PBXBuildFile;
- fileRef = D2FE76E4CF003856278343CC;
- };
- CC6C4D351BA9B473E5F95791 = {
- isa = PBXBuildFile;
- fileRef = ADA538034910F52FDD2DC88D;
- };
- 05A08E366EBF8D650974E695 = {
- isa = PBXBuildFile;
- fileRef = 516D6D7C564DD5DF5C15CB06;
- };
- 3FCA61C401007B243E2E9035 = {
- isa = PBXBuildFile;
- fileRef = F797071D88542C813CF7222A;
- };
- 30B921C38DCEE787B294B746 = {
- isa = PBXBuildFile;
- fileRef = BAC43B20E14A340CCF14119C;
- };
- 244567D3AE2E417A8CB2B95E = {
- isa = PBXBuildFile;
- fileRef = C3BB9F92B02B06D04A73794C;
- };
- 26D6AEA321E80ABCC3CCCCD1 = {
- isa = PBXBuildFile;
- fileRef = 4FF81FC167C924C47BD8C1C9;
- };
- 4E6DC4778D583C48C3CCD4DC = {
- isa = PBXBuildFile;
- fileRef = E13A54A6D3A1895EACE53E51;
- };
- EE722B47BC36CC8A87E0FB76 = {
- isa = PBXBuildFile;
- fileRef = BE618CE21C794BDEE319E328;
- };
- 2DF375B40A64BB3778F7ABD1 = {
- isa = PBXBuildFile;
- fileRef = F5DD97B45B8EA60C1ED0DD80;
- };
- 8BE478303CDF061B72F219E2 = {
- isa = PBXBuildFile;
- fileRef = F2E4998FB2C7221587A79F8B;
- };
- BF913199032B4CE970E82AA3 = {
- isa = PBXBuildFile;
- fileRef = B403AF75EAF361ED74EE476E;
- };
- 25EF9B3FECB4C9F0F522DCAA = {
- isa = PBXBuildFile;
- fileRef = 486E8D02DAD2A0BF54A901C0;
- };
- 638C7247B6DBA67EFE46E124 = {
- isa = PBXBuildFile;
- fileRef = 191330B20DAC08B890656EA0;
- };
- D0E26EB54B0087C8BE3D541E = {
- isa = PBXBuildFile;
- fileRef = 846B2A670C5A19DE0039E11A;
- };
- 468548FB21D264DC12321327 = {
- isa = PBXBuildFile;
- fileRef = 4D5F0CA8D1273144681A1D48;
- };
- 6ECB2F11D2F593FACCCF99DB = {
- isa = PBXBuildFile;
- fileRef = 0F8C000E5FF4A2DAC1FEF8EB;
- };
- 95F56FB44C669F93AE77E465 = {
- isa = PBXBuildFile;
- fileRef = 0CECD562059DFD7FBFB37E3C;
- };
- 518DD443B6F17A5AFD707263 = {
- isa = PBXBuildFile;
- fileRef = A69024A225F2AC31F17B1314;
- };
- B7EBA1A83575F48CD08140B9 = {
- isa = PBXBuildFile;
- fileRef = 4B083E951ECB62217C46CB01;
- };
- 3C5267E06A897B0DC0F7EA50 = {
- isa = PBXBuildFile;
- fileRef = 472F9A90F685220D730EBF6C;
- };
- 202DC8CF15ACBE096CC327EA = {
- isa = PBXBuildFile;
- fileRef = 805A3A5FBA3B9E28363DD77B;
- };
- 5DD883699B85E4C492CAD065 = {
- isa = PBXBuildFile;
- fileRef = DB9C8E35DF815B803CB4A9CF;
- };
- D5C9125F65493CA481F18E53 = {
- isa = PBXBuildFile;
- fileRef = D766BB9D8C32B5560F0493F3;
- };
- 02E8F35A8E0D4A0DF6F38D60 = {
- isa = PBXBuildFile;
- fileRef = 1DE5BBC777FB64798D823002;
- };
- 234B6BA2952CBC7C61EF70EF = {
- isa = PBXBuildFile;
- fileRef = 5867DC4E39DF8539B54C0D59;
- };
- 254A7C08594A152C2C646334 = {
- isa = PBXBuildFile;
- fileRef = 1B9B5A37F079FE3B3CF8FAB6;
- };
- F15F0512666FF8CDC0D08905 = {
- isa = PBXBuildFile;
- fileRef = 0462692BAA9CD1BE6DFBCC33;
- };
- B18248959DDC44EF4E85320A = {
- isa = PBXBuildFile;
- fileRef = AECE3914F5119A3D586A5635;
- };
- 00515BA4EC5A7D4DC078ED37 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ValueSourceHelpers.h";
- path = "../../Source/Utility/Helpers/jucer_ValueSourceHelpers.h";
- sourceTree = "SOURCE_ROOT";
- };
- 00841B7EDDE9C19890F03267 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JucerTreeViewBase.h";
- path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.h";
- sourceTree = "SOURCE_ROOT";
- };
- 00E6B87A43453B51850550E1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentOverlayComponent.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 016A6C52B0B93DE29197FF64 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AnimatedComponentTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 01A37DF94E98D991FEF43628 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ButtonHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ButtonHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 023B92AC0340305762412E90 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_OpenGLComponentTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 0400CB0E056A1D840304D2DE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_CommandLine.cpp";
- path = "../../Source/Application/jucer_CommandLine.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 044478BB994878E35D30154A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_XcodeProjectParser.h";
- path = "../../Source/ProjectSaving/jucer_XcodeProjectParser.h";
- sourceTree = "SOURCE_ROOT";
- };
- 0462692BAA9CD1BE6DFBCC33 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 0543E83BF7D7D9234C396E82 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentUndoableAction.h";
- path = "../../Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h";
- sourceTree = "SOURCE_ROOT";
- };
- 055636565C2F512E40114582 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ViewportHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ViewportHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 05D67B5A8D64947C067C0945 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_GUIApp.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_GUIApp.h";
- sourceTree = "SOURCE_ROOT";
- };
- 0640E34282A97BF73CC8F1EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentListComponent.h";
- path = "../../Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 079802C6AEE7646010766FE8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AudioPluginFilterTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 087CB3A961CD3C7434D660A4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewProjectWizard.h";
- path = "../../Source/Wizards/jucer_NewProjectWizard.h";
- sourceTree = "SOURCE_ROOT";
- };
- 09DE066936CF037E9709ADB1 = {
- isa = PBXFileReference;
- explicitFileType = wrapper.application;
- includeInIndex = 0;
- path = Projucer.app;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 0AE75B0ACD368A4C0FBC2CD0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TabbedComponentHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 0B24F292A357ABFD9BCC6D7F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = gradlew;
- path = ../../Source/BinaryData/gradle/gradlew;
- sourceTree = "SOURCE_ROOT";
- };
- 0CECD562059DFD7FBFB37E3C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_SlidingPanelComponent.cpp";
- path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 0D4D508C638BC74943B9976D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AutoUpdater.cpp";
- path = "../../Source/Application/jucer_AutoUpdater.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 0EE17BE4154CF1B2EE683894 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ResourceEditorPanel.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 0F01067432AC314EAC213C1C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_Blank.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_Blank.h";
- sourceTree = "SOURCE_ROOT";
- };
- 0F8C000E5FF4A2DAC1FEF8EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ProjucerLookAndFeel.cpp";
- path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 11DC04468BC6023671017EBF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewFileWizard.h";
- path = "../../Source/Wizards/jucer_NewFileWizard.h";
- sourceTree = "SOURCE_ROOT";
- };
- 11DEED05110D3D1D02FCFFB6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentTypeHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 124232706D1C8A3CA49E70CD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PIPCreatorWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_PIPCreatorWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 129F2DE0FEF154F8F8C7A74E = {
- isa = PBXFileReference;
- lastKnownFileType = file.jar;
- name = "gradle-wrapper.jar";
- path = "../../Source/BinaryData/gradle/gradle-wrapper.jar";
- sourceTree = "SOURCE_ROOT";
- };
- 133F1E428260C5ADDF496DF9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentLayout.cpp";
- path = "../../Source/ComponentEditor/jucer_ComponentLayout.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 159DE1FEE2099398983CDDF0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ErrorList.h";
- path = "../../Source/LiveBuildEngine/jucer_ErrorList.h";
- sourceTree = "SOURCE_ROOT";
- };
- 16751E04B0F3737BDF52CEB4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_HeaderComponent.h";
- path = "../../Source/Project/UI/jucer_HeaderComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 169DD91232C070C4D6470B31 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_IconButton.h";
- path = "../../Source/Utility/UI/jucer_IconButton.h";
- sourceTree = "SOURCE_ROOT";
- };
- 182CB1F96890620A202C6524 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SourceCodeRange.h";
- path = "../../Source/LiveBuildEngine/jucer_SourceCodeRange.h";
- sourceTree = "SOURCE_ROOT";
- };
- 191330B20DAC08B890656EA0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PIPGenerator.cpp";
- path = "../../Source/Utility/PIPs/jucer_PIPGenerator.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 194457D806A26E793584AC0C = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "huckleberry_icon.svg";
- path = "../../Source/BinaryData/Icons/huckleberry_icon.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 1B0F18E1D96F727C062B05FA = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ProjectContentComponent.cpp";
- path = "../../Source/Project/UI/jucer_ProjectContentComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 1B5BCD4899A9E295786EB642 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_OpenDocumentManager.h";
- path = "../../Source/CodeEditor/jucer_OpenDocumentManager.h";
- sourceTree = "SOURCE_ROOT";
- };
- 1B9B5A37F079FE3B3CF8FAB6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 1C80C7672975C1FF9AAC4A4F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectTab.h";
- path = "../../Source/Project/UI/Sidebar/jucer_ProjectTab.h";
- sourceTree = "SOURCE_ROOT";
- };
- 1DCA18E935A35D29D2D9B6A0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentDocument.cpp";
- path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 1DE5BBC777FB64798D823002 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 20075A86A4D0E8A5B973D9DB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_Xcode.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_Xcode.h";
- sourceTree = "SOURCE_ROOT";
- };
- 203FA6AD7EDDF1F9C338CC2A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AudioComponentTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 2072D6BAE744B53B6FBBDDD8 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_AudioPlugin.svg";
- path = "../../Source/BinaryData/Icons/wizard_AudioPlugin.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 210CD22F25F2C22F9CEEB025 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- 21F4833C5B5C17B159B956F3 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 23A8DE16C0CDB8EED18B008B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CommandIDs.h";
- path = "../../Source/Application/jucer_CommandIDs.h";
- sourceTree = "SOURCE_ROOT";
- };
- 23D79A22569BEDF63B57DD36 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CodeHelpers.h";
- path = "../../Source/Utility/Helpers/jucer_CodeHelpers.h";
- sourceTree = "SOURCE_ROOT";
- };
- 245C81599FB53865A74FC65B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ActivityList.h";
- path = "../../Source/LiveBuildEngine/jucer_ActivityList.h";
- sourceTree = "SOURCE_ROOT";
- };
- 24EB4C2412821B8019D6F754 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_TestComponent.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_TestComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 25BE1265FE6C6EA3473A3A0A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ResourceFile.h";
- path = "../../Source/ProjectSaving/jucer_ResourceFile.h";
- sourceTree = "SOURCE_ROOT";
- };
- 269A454F1FF081DA67FFD578 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_JucerDocument.cpp";
- path = "../../Source/ComponentEditor/jucer_JucerDocument.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 28D0199327887FFABF9C3F20 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_UserSettingsPopup.h";
- path = "../../Source/Utility/UI/jucer_UserSettingsPopup.h";
- sourceTree = "SOURCE_ROOT";
- };
- 2BD9B4556479A8A41740BCAE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 2CD34A70B4032C0426F7AA10 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_MainWindow.h";
- path = "../../Source/Application/jucer_MainWindow.h";
- sourceTree = "SOURCE_ROOT";
- };
- 2DF5A61F3C497537634773DF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ActivityListComponent.h";
- path = "../../Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 2EEB1C074162F363C6599282 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CommandLine.h";
- path = "../../Source/Application/jucer_CommandLine.h";
- sourceTree = "SOURCE_ROOT";
- };
- 2F373F97E30AC1A0BFC1FC61 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FilePropertyComponent.h";
- path = "../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 308084CBEE9F7D405D72A5E1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CompileEngineClient.h";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.h";
- sourceTree = "SOURCE_ROOT";
- };
- 32C4B61AD995877956B7FA66 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_InlineComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_InlineComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 32ECBC08D903418CA0825870 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ContentViewComponents.h";
- path = "../../Source/Project/UI/jucer_ContentViewComponents.h";
- sourceTree = "SOURCE_ROOT";
- };
- 332AF94C3275FEA8B878D603 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_SourceCodeEditor.cpp";
- path = "../../Source/CodeEditor/jucer_SourceCodeEditor.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 33B258726F29360D64FD1451 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JucerComponentHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_JucerComponentHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 351AF80A004D766E314AB76D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_JucerDocumentEditor.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 355379844A5E6A097038C280 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementRectangle.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h";
- sourceTree = "SOURCE_ROOT";
- };
- 35CAE8930F2885F9322D22D5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ItemPreviewComponent.h";
- path = "../../Source/CodeEditor/jucer_ItemPreviewComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 35CFCC15CBA46F4513940A2A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TextButtonHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_TextButtonHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 364D1A9B113320407A7E57B9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 36E5FBF64A89D5F2A266A5A7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementUndoableAction.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h";
- sourceTree = "SOURCE_ROOT";
- };
- 39597BD78897CB711AFA945A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_EditingPanelBase.h";
- path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3BBFA655E129C2D817EA47C9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ErrorListComponent.h";
- path = "../../Source/LiveBuildEngine/UI/jucer_ErrorListComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3C95FA2AA91EBA19ADDD5C29 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_Animated.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_Animated.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3D36F0CEB84B27BD02FC461A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LabelPropertyComponent.h";
- path = "../../Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3D6FD9C0065BF16568EC0AB7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SlidingPanelComponent.h";
- path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3DC2ED15A9DFAAEF3D2ACDDF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PIPMain.cpp";
- path = "../../Source/BinaryData/Templates/jucer_PIPMain.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 3EA27F52A254912218F4DE94 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectBuildInfo.h";
- path = "../../Source/LiveBuildEngine/jucer_ProjectBuildInfo.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3F7C5B53347A487C7FBD2223 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_OpenGLComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3F8EC008960DBEB2A5D3C3F4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Headers.h";
- path = "../../Source/Application/jucer_Headers.h";
- sourceTree = "SOURCE_ROOT";
- };
- 3F9D4C7F6E5779D4E4AE655D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentLayout.h";
- path = "../../Source/ComponentEditor/jucer_ComponentLayout.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4073A12E196BDDADE211E19F = {
- isa = PBXFileReference;
- lastKnownFileType = text.txt;
- name = "projucer_EULA.txt";
- path = "../../Source/BinaryData/projucer_EULA.txt";
- sourceTree = "SOURCE_ROOT";
- };
- 409C636B96A9AC1D732B96F8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComboBoxHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ComboBoxHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 41105E536155E394E54BDD35 = {
- isa = PBXFileReference;
- lastKnownFileType = file.xml;
- name = "colourscheme_dark.xml";
- path = "../../Source/BinaryData/colourscheme_dark.xml";
- sourceTree = "SOURCE_ROOT";
- };
- 42F4AA3EF0883D506987CA99 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_codeBlocks.svg";
- path = "../../Source/BinaryData/Icons/export_codeBlocks.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 431D30038CBF67F80E8B3A13 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGL.framework;
- path = System/Library/Frameworks/OpenGL.framework;
- sourceTree = SDKROOT;
- };
- 432EC251A122071809471804 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "juce-logo-with-text.svg";
- path = "../../Source/BinaryData/Icons/juce-logo-with-text.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 471C7B0A8B92320AF0C80839 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_StaticLibrary.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_StaticLibrary.h";
- sourceTree = "SOURCE_ROOT";
- };
- 472F9A90F685220D730EBF6C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = BinaryData.cpp;
- path = ../../JuceLibraryCode/BinaryData.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 4818A05DE44ADA03D85E1083 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjucerAnalytics.h";
- path = "../../Source/Application/jucer_ProjucerAnalytics.h";
- sourceTree = "SOURCE_ROOT";
- };
- 486E8D02DAD2A0BF54A901C0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MiscUtilities.cpp";
- path = "../../Source/Utility/Helpers/jucer_MiscUtilities.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4974E7808F9B57E9A627F878 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FileTreeItems.h";
- path = "../../Source/Project/UI/Sidebar/jucer_FileTreeItems.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4A4EBDAD8D098F72CE053235 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_AudioPlugin.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_AudioPlugin.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4AE469CD40BDAD634135785E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElement.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4AE72953E3B3DF06D3B9BA86 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintElementPath.cpp";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4B083E951ECB62217C46CB01 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_NewProjectWizardClasses.cpp";
- path = "../../Source/Wizards/jucer_NewProjectWizardClasses.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4D5F0CA8D1273144681A1D48 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_JucerTreeViewBase.cpp";
- path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 4D698BF12BCD6B0896BCDF17 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AutoUpdater.h";
- path = "../../Source/Application/jucer_AutoUpdater.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4E671236FDBD5AD4699740C6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JucerCommandIDs.h";
- path = "../../Source/ComponentEditor/UI/jucer_JucerCommandIDs.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4ECF029E3A69BF42FED1503D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PIPAudioProcessorTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 4F687965FBE86EAFDB3ACFEC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = BinaryData.h;
- path = ../../JuceLibraryCode/BinaryData.h;
- sourceTree = "SOURCE_ROOT";
- };
- 4FF81FC167C924C47BD8C1C9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ProjectSaver.cpp";
- path = "../../Source/ProjectSaving/jucer_ProjectSaver.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 50498FF6EA3901CBD58223B3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ObjectTypes.h";
- path = "../../Source/ComponentEditor/jucer_ObjectTypes.h";
- sourceTree = "SOURCE_ROOT";
- };
- 512D80BE12634967A085A1DC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintElement.cpp";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 514F2FAFDBF535AC03FA2E6C = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "background_logo.svg";
- path = "../../Source/BinaryData/Icons/background_logo.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 516D6D7C564DD5DF5C15CB06 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_HeaderComponent.cpp";
- path = "../../Source/Project/UI/jucer_HeaderComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 51BC758EF5D33197CF543E67 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_DocumentEditorComponent.h";
- path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 51CBE59779A36D1B80B26974 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_LicenseController.cpp";
- path = "../../Source/Licenses/jucer_LicenseController.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 5432B7B9B2CF2EAEC8B66D5C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_UtilityFunctions.h";
- path = "../../Source/ComponentEditor/jucer_UtilityFunctions.h";
- sourceTree = "SOURCE_ROOT";
- };
- 5524B5C9FC6AEAA670B92AA9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentLayoutEditor.h";
- path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h";
- sourceTree = "SOURCE_ROOT";
- };
- 55DEDCEB35AA1FB54C74B375 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_MessageIDs.h";
- path = "../../Source/LiveBuildEngine/jucer_MessageIDs.h";
- sourceTree = "SOURCE_ROOT";
- };
- 56177921580A4855917E0205 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AudioPluginEditorTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 56749E4C72A8F51ACA8F2330 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_clion.svg";
- path = "../../Source/BinaryData/Icons/export_clion.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 576A92E1E0D8F453EC0FEB34 = {
- isa = PBXFileReference;
- lastKnownFileType = file.bat;
- name = gradlew.bat;
- path = ../../Source/BinaryData/gradle/gradlew.bat;
- sourceTree = "SOURCE_ROOT";
- };
- 5783563E39E48ADFC68EB84A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentTextProperty.h";
- path = "../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- 58139D8D454051C59E77609B = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = ../../Source/BinaryData/RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 5867DC4E39DF8539B54C0D59 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 58DE91CE6B05AFBACADDB251 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_analytics";
- path = "../../../../modules/juce_analytics";
- sourceTree = "SOURCE_ROOT";
- };
- 58F1FF52E887887A93E84FC2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PresetIDs.h";
- path = "../../Source/Utility/Helpers/jucer_PresetIDs.h";
- sourceTree = "SOURCE_ROOT";
- };
- 59203884BC48D3B7F8DEABA8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ContentCompTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 59520B8137E6A2E483074399 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_Make.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_Make.h";
- sourceTree = "SOURCE_ROOT";
- };
- 59B08C7B13B8EA5137ACA77A = {
- isa = PBXFileReference;
- lastKnownFileType = text.txt;
- name = nothingtoseehere.txt;
- path = ../../Source/BinaryData/nothingtoseehere.txt;
- sourceTree = "SOURCE_ROOT";
- };
- 59F8A47C0020D62C8836A1E7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PropertyComponentsWithEnablement.h";
- path = "../../Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h";
- sourceTree = "SOURCE_ROOT";
- };
- 5A75806B34E4EA6598A6024A = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 5B3532C5F103DAC87B4A5675 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_GUI.svg";
- path = "../../Source/BinaryData/Icons/wizard_GUI.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 5BF0374EB908F0476BD8ED42 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AudioComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 5E4EB84A7983AB31366A3490 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ModuleTreeItems.h";
- path = "../../Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h";
- sourceTree = "SOURCE_ROOT";
- };
- 5F6584B675E30761521A9F42 = {
- isa = PBXFileReference;
- lastKnownFileType = file.xml;
- name = "colourscheme_light.xml";
- path = "../../Source/BinaryData/colourscheme_light.xml";
- sourceTree = "SOURCE_ROOT";
- };
- 62922B3C0620368D1799A653 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_OpenGL.svg";
- path = "../../Source/BinaryData/Icons/wizard_OpenGL.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 630DC5EAA31D3EE60B2D989F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_GenericComponentHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_GenericComponentHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 6574A50A8997799705B23465 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AudioPluginEditorTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 65FAD7F6DF65A72B741C2913 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintRoutinePanel.h";
- path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h";
- sourceTree = "SOURCE_ROOT";
- };
- 6678E9B3EEACAD47F438B264 = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 66B49F08C5EC3E4974825FF8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintRoutine.h";
- path = "../../Source/ComponentEditor/jucer_PaintRoutine.h";
- sourceTree = "SOURCE_ROOT";
- };
- 68C1949F56295D5871C1F223 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LiveBuildTab.h";
- path = "../../Source/Project/UI/Sidebar/jucer_LiveBuildTab.h";
- sourceTree = "SOURCE_ROOT";
- };
- 68F41A216E7454E7442AB1F4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TreeItemTypes.h";
- path = "../../Source/Project/UI/Sidebar/jucer_TreeItemTypes.h";
- sourceTree = "SOURCE_ROOT";
- };
- 69555CEFC6ED613AA3949298 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- 69B478C992FA0B8C885946A6 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_linux.svg";
- path = "../../Source/BinaryData/Icons/export_linux.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 6AC88EFC247C225CC5C11A43 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_BinaryResources.h";
- path = "../../Source/ComponentEditor/jucer_BinaryResources.h";
- sourceTree = "SOURCE_ROOT";
- };
- 6E6140969908E7619F858740 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CommonHeaders.h";
- path = "../../Source/Application/jucer_CommonHeaders.h";
- sourceTree = "SOURCE_ROOT";
- };
- 6E70C1FA80F02D4C310F63AA = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintRoutineEditor.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 6F02C3B7FEA3B50692A70DE5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_EditingPanelBase.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 6FD8DBC0FF42C87D8BEE2452 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TranslationHelpers.h";
- path = "../../Source/Utility/Helpers/jucer_TranslationHelpers.h";
- sourceTree = "SOURCE_ROOT";
- };
- 7031E8CB6D4D84BD980A0BD0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementImage.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h";
- sourceTree = "SOURCE_ROOT";
- };
- 705DE88C5C4CC6C871E951B1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_GroupComponentHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_GroupComponentHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 714267352CE5C4357ADBC231 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_StartPageComponent.h";
- path = "../../Source/Wizards/jucer_StartPageComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 719B56C8587863D7AE9B69C6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_RelativePositionedRectangle.h";
- path = "../../Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h";
- sourceTree = "SOURCE_ROOT";
- };
- 7211101FFA28400ADBB1D47A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Module.h";
- path = "../../Source/Project/jucer_Module.h";
- sourceTree = "SOURCE_ROOT";
- };
- 728FE25157E9874D50BBECB2 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- 72ED72174F9DBD0ABD8AFCED = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintElementImage.cpp";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 73DE14CEAD25D3445457013E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SliderHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_SliderHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 75BE2887C6F324B818D80A21 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SnapGridPainter.h";
- path = "../../Source/ComponentEditor/UI/jucer_SnapGridPainter.h";
- sourceTree = "SOURCE_ROOT";
- };
- 763A63E75AC802F17D11FE8B = {
- isa = PBXFileReference;
- lastKnownFileType = file.cs;
- name = "jucer_UnityPluginGUIScript.cs";
- path = "../../Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs";
- sourceTree = "SOURCE_ROOT";
- };
- 7687A1374C60A025BDBE98DE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PointComponent.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PointComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 77EA01E7D04BF889930BFF54 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementRoundedRectangle.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h";
- sourceTree = "SOURCE_ROOT";
- };
- 78D0DBC4798FF040FDB90F6D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_GeneratedCode.cpp";
- path = "../../Source/ComponentEditor/jucer_GeneratedCode.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 790F6302B9A0620F23F8A6C1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LicenseThread.h";
- path = "../../Source/Licenses/jucer_LicenseThread.h";
- sourceTree = "SOURCE_ROOT";
- };
- 7AB7640968FAAC73072FBD10 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 7B3F7ECF6DBF8C8EE5C2CB86 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioUnit.framework;
- path = System/Library/Frameworks/AudioUnit.framework;
- sourceTree = SDKROOT;
- };
- 7CA44FF0BA319517C6E39651 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_Application.cpp";
- path = "../../Source/Application/jucer_Application.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 7E2013F425E231C6D865DDD0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentChoiceProperty.h";
- path = "../../Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- 7F0A5319912991615FC57945 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ColourPropertyComponent.h";
- path = "../../Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 805A3A5FBA3B9E28363DD77B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_analytics.cpp";
- path = "../../JuceLibraryCode/include_juce_analytics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 807049CA2D5B6DE18EA078F2 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_android.svg";
- path = "../../Source/BinaryData/Icons/export_android.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 80D62B907248523E6943298B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- 8336A43CE1C3C26D7C7B53D8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_NewComponentTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 842427CFE565F3FCE5B99174 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- 846B2A670C5A19DE0039E11A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_Icons.cpp";
- path = "../../Source/Utility/UI/jucer_Icons.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 85A5E3E71BED93B9A3E07681 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PositionPropertyBase.h";
- path = "../../Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h";
- sourceTree = "SOURCE_ROOT";
- };
- 861E52D9AFECADF079BB1F2C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ExporterTreeItems.h";
- path = "../../Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h";
- sourceTree = "SOURCE_ROOT";
- };
- 868B459E02F0877EBE3D56F1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TextEditorHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_TextEditorHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8702F43110E4CCA5E5F827F5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- 8A82061A978B03745485C3AC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LiveBuildCodeEditor.h";
- path = "../../Source/CodeEditor/jucer_LiveBuildCodeEditor.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8A825FDDC00DD253F44D2C3A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_AudioApp.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_AudioApp.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8BD8E9DA627D6EF9BA10FB9E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewProjectWizardComponent.h";
- path = "../../Source/Wizards/jucer_NewProjectWizardComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8C281F2F8EA3AD614ADF7955 = {
- isa = PBXFileReference;
- lastKnownFileType = text.html;
- name = offlinepage.html;
- path = ../../Source/BinaryData/offlinepage.html;
- sourceTree = "SOURCE_ROOT";
- };
- 8C52A3DDA62A746AA7A68535 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_Main.cpp";
- path = "../../Source/Application/jucer_Main.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 8D178CAEE6D89DE33233313F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ElementSiblingComponent.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8D9A9A373E4621F7CBFCCCEF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ContentCompTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 8DBB36126CD144A8364F1F19 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExporter.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExporter.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8DFE6D8AFB8057790041300B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ToggleButtonHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8F30A53C7FE4BC65171FB3E2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JucerDocument.h";
- path = "../../Source/ComponentEditor/jucer_JucerDocument.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8F4D281E98808204E2846A7D = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_xcode.svg";
- path = "../../Source/BinaryData/Icons/export_xcode.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 8F67F3C0492EAFEBDBBC12DB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_NewCppFileTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 8F685EFEFD6EE399058DE842 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_DownloadCompileEngineThread.h";
- path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.h";
- sourceTree = "SOURCE_ROOT";
- };
- 8F731F1F98BAB42F1C3B96AA = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentTypeHandler.cpp";
- path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 8F7BE18698ADCEF51CDE4A5C = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 8FEF6F5EA676B824C021EB6F = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_AnimatedApp.svg";
- path = "../../Source/BinaryData/Icons/wizard_AnimatedApp.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 8FF26BF72A522FBEAAFDDF54 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_AudioApp.svg";
- path = "../../Source/BinaryData/Icons/wizard_AudioApp.svg";
- sourceTree = "SOURCE_ROOT";
- };
- 9069981E414A631B036CC9AC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MainWindow.cpp";
- path = "../../Source/Application/jucer_MainWindow.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 92926A4D3CC4BB2A9D35EB0B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_UTF8WindowComponent.h";
- path = "../../Source/Application/Windows/jucer_UTF8WindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 92A66A8BD87F98EB6B4FB6D0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectContentComponent.h";
- path = "../../Source/Project/UI/jucer_ProjectContentComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 951128CA33CCDEF570436B1C = {
- isa = PBXFileReference;
- lastKnownFileType = file.icns;
- name = Icon.icns;
- path = Icon.icns;
- sourceTree = "SOURCE_ROOT";
- };
- 95EAB6EC9B724538B93910D4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TabComponents.h";
- path = "../../Source/Project/UI/Sidebar/jucer_TabComponents.h";
- sourceTree = "SOURCE_ROOT";
- };
- 97A847B59EE04483E8850E4B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MainTemplate_SimpleWindow.cpp";
- path = "../../Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 983CFBA01CA8811F30FA7F4C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_MiscUtilities.h";
- path = "../../Source/Utility/Helpers/jucer_MiscUtilities.h";
- sourceTree = "SOURCE_ROOT";
- };
- 988F5C1E40DED02D8B064253 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintElementGroup.cpp";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 98E6D61BFF7D85F0E00F0FBF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LicenseWebview.h";
- path = "../../Source/Licenses/jucer_LicenseWebview.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9914F905BFCFBE5F76619670 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ColouredElement.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h";
- sourceTree = "SOURCE_ROOT";
- };
- 996E472B82A75531875A5E38 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = LICENSE;
- path = ../../Source/BinaryData/gradle/LICENSE;
- sourceTree = "SOURCE_ROOT";
- };
- 9992E6950C64322A11E39ADF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_DLL.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_DLL.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9A3B8BBDA8E144A3DF6B9349 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AnimatedComponentSimpleTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9B6FD3FEDB6D91AD0A80EF97 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ImageResourceProperty.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9BDF2D6255C1CB2CFF376186 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentOverlayComponent.h";
- path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9D7689451732AF8333402B3A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ObjectTypes.cpp";
- path = "../../Source/ComponentEditor/jucer_ObjectTypes.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 9E0BA495286388EBF929D578 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ContentCompSimpleTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9E2B1506AC3FDB7863766D59 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewInlineComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9E62EC342665C27BA01AFC1A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentNameProperty.h";
- path = "../../Source/ComponentEditor/Components/jucer_ComponentNameProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9EB33734D0DBD0370AB1247B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ColourPropertyComponent.h";
- path = "../../Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9EE3141E20C9CE3EA182FA04 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectSaver.h";
- path = "../../Source/ProjectSaving/jucer_ProjectSaver.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9EF583A6201DBC813C2F63C4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_BinaryResources.cpp";
- path = "../../Source/ComponentEditor/jucer_BinaryResources.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 9F01BA9942D038EA8B5289A8 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QTKit.framework;
- path = System/Library/Frameworks/QTKit.framework;
- sourceTree = SDKROOT;
- };
- 9F2D3E5FC10F7C3270908E97 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ButtonDocument.h";
- path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.h";
- sourceTree = "SOURCE_ROOT";
- };
- 9F959ECF8CD9B7314AE604A9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LabelHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_LabelHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- A081306A9E95CA114B81910F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CompileEngineSettings.h";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineSettings.h";
- sourceTree = "SOURCE_ROOT";
- };
- A085174413736ACC8D7D42A2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_openGL.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_openGL.h";
- sourceTree = "SOURCE_ROOT";
- };
- A0BBBFBA13A1308B3CD725D5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentLayoutPanel.h";
- path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h";
- sourceTree = "SOURCE_ROOT";
- };
- A160AEF56553A658E6EA6A8E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MainTemplate_Window.cpp";
- path = "../../Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- A22F64D1E4BD4B8FA366DAAD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TreeViewHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_TreeViewHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- A44A774EFC020D3D046A9249 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectWizard_Console.h";
- path = "../../Source/Wizards/jucer_ProjectWizard_Console.h";
- sourceTree = "SOURCE_ROOT";
- };
- A49503B646A7BD2BEEFC5CBD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_HyperlinkButtonHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- A509BC22854D50E4C786EB32 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FileGroupInformationComponent.h";
- path = "../../Source/Project/UI/jucer_FileGroupInformationComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- A66F17E7472E5C19AFE98E46 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MainConsoleAppTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- A69024A225F2AC31F17B1314 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_NewFileWizard.cpp";
- path = "../../Source/Wizards/jucer_NewFileWizard.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- A6C4AE13FB409DE414094CFA = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_RelativePath.h";
- path = "../../Source/Utility/Helpers/jucer_RelativePath.h";
- sourceTree = "SOURCE_ROOT";
- };
- A978DFE87D9BB5EFE5B3DAAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CompileEngineDLL.h";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineDLL.h";
- sourceTree = "SOURCE_ROOT";
- };
- A9954DC7F876A7006743ACB6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_DiagnosticMessage.h";
- path = "../../Source/LiveBuildEngine/jucer_DiagnosticMessage.h";
- sourceTree = "SOURCE_ROOT";
- };
- AA1C44E89D792DDC4867B2C8 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- ADA538034910F52FDD2DC88D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_DownloadCompileEngineThread.cpp";
- path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- ADD6A3CF5D7DE55E57E8E38B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CppHelpers.h";
- path = "../../Source/LiveBuildEngine/jucer_CppHelpers.h";
- sourceTree = "SOURCE_ROOT";
- };
- AECE3914F5119A3D586A5635 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AEFE3BA0C31EC78A5767A10E = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_DLL.svg";
- path = "../../Source/BinaryData/Icons/wizard_DLL.svg";
- sourceTree = "SOURCE_ROOT";
- };
- B1C2F8ED14BF914CD1882708 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_Openfile.svg";
- path = "../../Source/BinaryData/Icons/wizard_Openfile.svg";
- sourceTree = "SOURCE_ROOT";
- };
- B24E3F34C3C4EE54A60C35CC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LiveCodeBuilderDLL.h";
- path = "../../Source/LiveBuildEngine/jucer_LiveCodeBuilderDLL.h";
- sourceTree = "SOURCE_ROOT";
- };
- B2CB95B3F44C3CC5735051A3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JustificationProperty.h";
- path = "../../Source/ComponentEditor/Properties/jucer_JustificationProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- B3528C08B84CBC950252EA69 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ModulesInformationComponent.h";
- path = "../../Source/Project/UI/jucer_ModulesInformationComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- B403AF75EAF361ED74EE476E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_FileHelpers.cpp";
- path = "../../Source/Utility/Helpers/jucer_FileHelpers.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- B6496F16ACE80CACC5721570 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ProjucerAnalytics.cpp";
- path = "../../Source/Application/jucer_ProjucerAnalytics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- B6F2905330EA5C560D527209 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- B8385E9A644BD3CD94876448 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectType.h";
- path = "../../Source/Project/jucer_ProjectType.h";
- sourceTree = "SOURCE_ROOT";
- };
- B83C9BD89F31EA9E5E12A3C6 = {
- isa = PBXFileReference;
- lastKnownFileType = image.png;
- name = "juce_icon.png";
- path = "../../Source/BinaryData/Icons/juce_icon.png";
- sourceTree = "SOURCE_ROOT";
- };
- B83DAADA1A871F21582FFB23 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ApplicationUsageDataWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- B97D60D2531CFD0D8555BA5C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementText.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementText.h";
- sourceTree = "SOURCE_ROOT";
- };
- B9B130F596953116393138DC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SourceCodeEditor.h";
- path = "../../Source/CodeEditor/jucer_SourceCodeEditor.h";
- sourceTree = "SOURCE_ROOT";
- };
- BA159A3B7D129771F5C15EA3 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- BA186B51EE4884CD8E3F2741 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_CompileEngineServer.h";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.h";
- sourceTree = "SOURCE_ROOT";
- };
- BAC43B20E14A340CCF14119C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_Project.cpp";
- path = "../../Source/Project/jucer_Project.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- BB187CD608EB6368B29EC335 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_LicenseController.h";
- path = "../../Source/Licenses/jucer_LicenseController.h";
- sourceTree = "SOURCE_ROOT";
- };
- BC3B310D42C489E8B8D93327 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_DocumentEditorComponent.cpp";
- path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- BC623CC67AC58297BF6B4C70 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TestComponent.h";
- path = "../../Source/ComponentEditor/UI/jucer_TestComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- BCB6C87E3992930674E54D16 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementGroup.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h";
- sourceTree = "SOURCE_ROOT";
- };
- BDF6AFC5F88581AE395F1DC9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ResourceEditorPanel.h";
- path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h";
- sourceTree = "SOURCE_ROOT";
- };
- BE618CE21C794BDEE319E328 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_AppearanceSettings.cpp";
- path = "../../Source/Settings/jucer_AppearanceSettings.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- BF301C2E545AEB4AC112C176 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ButtonDocument.cpp";
- path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- BF3CEF080FA013E2778DCE90 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Project.h";
- path = "../../Source/Project/jucer_Project.h";
- sourceTree = "SOURCE_ROOT";
- };
- C09BBB58CA45B66D693E8C31 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TemplateThumbnailsComponent.h";
- path = "../../Source/Wizards/jucer_TemplateThumbnailsComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- C187718F7B9EBA88584B43F3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintRoutine.cpp";
- path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- C2990A8D054BC230E7C637C3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewProjectWizardClasses.h";
- path = "../../Source/Wizards/jucer_NewProjectWizardClasses.h";
- sourceTree = "SOURCE_ROOT";
- };
- C3BB9F92B02B06D04A73794C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ProjectExporter.cpp";
- path = "../../Source/ProjectSaving/jucer_ProjectExporter.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- C3E04CD5A93A45154894E624 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Colours.h";
- path = "../../Source/Utility/Helpers/jucer_Colours.h";
- sourceTree = "SOURCE_ROOT";
- };
- C402C21DFAC1F8BF121144F1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FillType.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_FillType.h";
- sourceTree = "SOURCE_ROOT";
- };
- C59E624F099CC785F27429EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Icons.h";
- path = "../../Source/Utility/UI/jucer_Icons.h";
- sourceTree = "SOURCE_ROOT";
- };
- C607639897ED2538CBB860D0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_OpenGLComponentSimpleTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- C7245390C6C44E89F7526CFC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- C736264708F3F68BA745BA29 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FloatingToolWindow.h";
- path = "../../Source/Application/Windows/jucer_FloatingToolWindow.h";
- sourceTree = "SOURCE_ROOT";
- };
- C76271530EB4458B6146D463 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PIPGenerator.h";
- path = "../../Source/Utility/PIPs/jucer_PIPGenerator.h";
- sourceTree = "SOURCE_ROOT";
- };
- CC1C5F8E5DE34223FEC59673 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AudioPluginFilterTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- CCD62DB0A19A985A4B9D7F32 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_Android.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_Android.h";
- sourceTree = "SOURCE_ROOT";
- };
- CCEA34A55813C7C4E58254F5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_BuildTabStatusComponent.h";
- path = "../../Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- CF6C8BD0DA3D8CD4E99EBADA = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- D00F311BFC3C2625C457CB9B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- D045BD5943BD38F2720FF5F0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FontPropertyComponent.h";
- path = "../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- D05BD91B6105827B010E1C20 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- D1739728A79A2062418B8EF0 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_StaticLibrary.svg";
- path = "../../Source/BinaryData/Icons/wizard_StaticLibrary.svg";
- sourceTree = "SOURCE_ROOT";
- };
- D1F9B0E9F5D54FE48BEB46EA = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- D251114072E67CA86D9913D6 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ClassDatabase.h";
- path = "../../Source/LiveBuildEngine/jucer_ClassDatabase.h";
- sourceTree = "SOURCE_ROOT";
- };
- D2FE76E4CF003856278343CC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_CompileEngineServer.cpp";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- D4EB334E5186D1584EC63CA4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AudioComponentSimpleTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- D5795F8CAC5876714DAB355F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AnimatedComponentTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- D5EF5961B1F0E3FAED32E30A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_CLion.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_CLion.h";
- sourceTree = "SOURCE_ROOT";
- };
- D6390A40B3279E0E626C78D3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ColouredElement.cpp";
- path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- D766BB9D8C32B5560F0493F3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- D91E7F8FEF9290195D56782C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_EditorColourSchemeWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- D93E2F2468003DD333371F06 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_StrokeType.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_StrokeType.h";
- sourceTree = "SOURCE_ROOT";
- };
- DA345D5B9DABD049F90DC96F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_GeneratedCode.h";
- path = "../../Source/ComponentEditor/jucer_GeneratedCode.h";
- sourceTree = "SOURCE_ROOT";
- };
- DA4D0CC5149F7C0FBDAF34A2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementPath.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h";
- sourceTree = "SOURCE_ROOT";
- };
- DB9C8E35DF815B803CB4A9CF = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- DDC382008FFD9F9E0B2B0EDD = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_SVGPathDataWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_SVGPathDataWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- DE3E6B2614229FAD56D50770 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_CompileEngineClient.cpp";
- path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- DE4A987B2D5529990A6AA9D4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AboutWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_AboutWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- DFBEB8E086832AEB0FBEADF0 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_StoredSettings.h";
- path = "../../Source/Settings/jucer_StoredSettings.h";
- sourceTree = "SOURCE_ROOT";
- };
- E111A336FE13C033EAA0A1D1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_NewCppFileTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- E13A54A6D3A1895EACE53E51 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ResourceFile.cpp";
- path = "../../Source/ProjectSaving/jucer_ResourceFile.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- E1535CDF4258E7D4AB70B5E5 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ClientServerMessages.h";
- path = "../../Source/LiveBuildEngine/jucer_ClientServerMessages.h";
- sourceTree = "SOURCE_ROOT";
- };
- E1577F8617C75B91D7399812 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ImageButtonHandler.h";
- path = "../../Source/ComponentEditor/Components/jucer_ImageButtonHandler.h";
- sourceTree = "SOURCE_ROOT";
- };
- E186BC01A1B1529937A46485 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FileHelpers.h";
- path = "../../Source/Utility/Helpers/jucer_FileHelpers.h";
- sourceTree = "SOURCE_ROOT";
- };
- E266DE67FF319D56F63193A6 = {
- isa = PBXFileReference;
- lastKnownFileType = text.plist.xml;
- name = "Info-App.plist";
- path = "Info-App.plist";
- sourceTree = "SOURCE_ROOT";
- };
- E2B668E2A65AEE8F07B406C8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_AppearanceSettings.h";
- path = "../../Source/Settings/jucer_AppearanceSettings.h";
- sourceTree = "SOURCE_ROOT";
- };
- E367FC2BDAF5EBA48D767FBB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_FilePathPropertyComponent.h";
- path = "../../Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- E3BADF21095BC23DE2CB454F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectTreeItemBase.h";
- path = "../../Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h";
- sourceTree = "SOURCE_ROOT";
- };
- E468FDB5504C5D9315B2D04F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentDocument.h";
- path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.h";
- sourceTree = "SOURCE_ROOT";
- };
- E5D6C36496F5BC84D7213BE8 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- E67999BF57B139E00207A374 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PIPTemplate.h";
- path = "../../Source/BinaryData/Templates/jucer_PIPTemplate.h";
- sourceTree = "SOURCE_ROOT";
- };
- E96597BBC6A98255B51B94DC = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- E983E6DDE3318B872EBE347F = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudioKit.framework;
- path = System/Library/Frameworks/CoreAudioKit.framework;
- sourceTree = SDKROOT;
- };
- EAC1731150A7F79D59BAA0B6 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "export_visualStudio.svg";
- path = "../../Source/BinaryData/Icons/export_visualStudio.svg";
- sourceTree = "SOURCE_ROOT";
- };
- EB2E723DC3DB150A8A644D08 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_GlobalPathsWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_GlobalPathsWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- ED5EAC91D8A0A1911BE9F482 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_ConsoleApp.svg";
- path = "../../Source/BinaryData/Icons/wizard_ConsoleApp.svg";
- sourceTree = "SOURCE_ROOT";
- };
- ED69863B3D591FB3F0CA50E4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintRoutineEditor.h";
- path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h";
- sourceTree = "SOURCE_ROOT";
- };
- EE690110171E1648FF2118B8 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_Application.h";
- path = "../../Source/Application/jucer_Application.h";
- sourceTree = "SOURCE_ROOT";
- };
- EF25A29A2194FC107B40F65F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentLayoutEditor.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- EFF38AE74E7267CCC47E8AD1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_JucerDocumentEditor.h";
- path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h";
- sourceTree = "SOURCE_ROOT";
- };
- F073B54B36D845915CD6D2C1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_PaintElementEllipse.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h";
- sourceTree = "SOURCE_ROOT";
- };
- F159C1B99ACF1D91E12D978E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_MainTemplate_NoWindow.cpp";
- path = "../../Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- F2E4998FB2C7221587A79F8B = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_CodeHelpers.cpp";
- path = "../../Source/Utility/Helpers/jucer_CodeHelpers.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- F3CC8F26ECCDA6DCD8A284D2 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_GradientPointComponent.h";
- path = "../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- F4FD9BD16ED2700F45A68C4F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentBooleanProperty.h";
- path = "../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- F5DD97B45B8EA60C1ED0DD80 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_StoredSettings.cpp";
- path = "../../Source/Settings/jucer_StoredSettings.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- F797071D88542C813CF7222A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_Module.cpp";
- path = "../../Source/Project/jucer_Module.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- F7C74E934C954F6F1A3BE4F9 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_TranslationToolWindowComponent.h";
- path = "../../Source/Application/Windows/jucer_TranslationToolWindowComponent.h";
- sourceTree = "SOURCE_ROOT";
- };
- F8A38C0C7C45F2DB6A5FB812 = {
- isa = PBXFileReference;
- lastKnownFileType = file.svg;
- name = "wizard_Highlight.svg";
- path = "../../Source/BinaryData/Icons/wizard_Highlight.svg";
- sourceTree = "SOURCE_ROOT";
- };
- F9111E150CFF155329D44853 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_OpenDocumentManager.cpp";
- path = "../../Source/CodeEditor/jucer_OpenDocumentManager.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- FA790C59A304579F660F112F = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_CodeBlocks.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h";
- sourceTree = "SOURCE_ROOT";
- };
- FB80347407261BF6CCEFDE91 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_ComponentTemplate.cpp";
- path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- FCEBE24EA79A13713D7CBF26 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ComponentColourProperty.h";
- path = "../../Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h";
- sourceTree = "SOURCE_ROOT";
- };
- FE20FE5805A02A4843048200 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjucerLookAndFeel.h";
- path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.h";
- sourceTree = "SOURCE_ROOT";
- };
- FF68231DE2B395461009116C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = "jucer_ProjectExport_MSVC.h";
- path = "../../Source/ProjectSaving/jucer_ProjectExport_MSVC.h";
- sourceTree = "SOURCE_ROOT";
- };
- FFE01768CF1C8DBDAA894F76 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "jucer_PaintRoutinePanel.cpp";
- path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- EB1D55A76652399EB81CC1F0 = {
- isa = PBXGroup;
- children = (
- DE4A987B2D5529990A6AA9D4,
- B83DAADA1A871F21582FFB23,
- D91E7F8FEF9290195D56782C,
- C736264708F3F68BA745BA29,
- EB2E723DC3DB150A8A644D08,
- 124232706D1C8A3CA49E70CD,
- DDC382008FFD9F9E0B2B0EDD,
- F7C74E934C954F6F1A3BE4F9,
- 92926A4D3CC4BB2A9D35EB0B,
- );
- name = Windows;
- sourceTree = "<group>";
- };
- BC67FD952A6F210A11A1ECB8 = {
- isa = PBXGroup;
- children = (
- EB1D55A76652399EB81CC1F0,
- 7CA44FF0BA319517C6E39651,
- EE690110171E1648FF2118B8,
- 0D4D508C638BC74943B9976D,
- 4D698BF12BCD6B0896BCDF17,
- 23A8DE16C0CDB8EED18B008B,
- 0400CB0E056A1D840304D2DE,
- 2EEB1C074162F363C6599282,
- 6E6140969908E7619F858740,
- 3F8EC008960DBEB2A5D3C3F4,
- 8C52A3DDA62A746AA7A68535,
- 9069981E414A631B036CC9AC,
- 2CD34A70B4032C0426F7AA10,
- B6496F16ACE80CACC5721570,
- 4818A05DE44ADA03D85E1083,
- );
- name = Application;
- sourceTree = "<group>";
- };
- 8CF70DA9AB4725126B9F55BE = {
- isa = PBXGroup;
- children = (
- 129F2DE0FEF154F8F8C7A74E,
- 0B24F292A357ABFD9BCC6D7F,
- 576A92E1E0D8F453EC0FEB34,
- 996E472B82A75531875A5E38,
- );
- name = gradle;
- sourceTree = "<group>";
- };
- F0F189518721D46C0F94FD56 = {
- isa = PBXGroup;
- children = (
- 514F2FAFDBF535AC03FA2E6C,
- 807049CA2D5B6DE18EA078F2,
- 56749E4C72A8F51ACA8F2330,
- 42F4AA3EF0883D506987CA99,
- 69B478C992FA0B8C885946A6,
- EAC1731150A7F79D59BAA0B6,
- 8F4D281E98808204E2846A7D,
- 194457D806A26E793584AC0C,
- 432EC251A122071809471804,
- B83C9BD89F31EA9E5E12A3C6,
- 8FEF6F5EA676B824C021EB6F,
- 8FF26BF72A522FBEAAFDDF54,
- 2072D6BAE744B53B6FBBDDD8,
- ED5EAC91D8A0A1911BE9F482,
- AEFE3BA0C31EC78A5767A10E,
- 5B3532C5F103DAC87B4A5675,
- F8A38C0C7C45F2DB6A5FB812,
- B1C2F8ED14BF914CD1882708,
- 62922B3C0620368D1799A653,
- D1739728A79A2062418B8EF0,
- );
- name = Icons;
- sourceTree = "<group>";
- };
- E59ABA0D11CBAAD77179E9C6 = {
- isa = PBXGroup;
- children = (
- 9A3B8BBDA8E144A3DF6B9349,
- 016A6C52B0B93DE29197FF64,
- D5795F8CAC5876714DAB355F,
- D4EB334E5186D1584EC63CA4,
- 203FA6AD7EDDF1F9C338CC2A,
- 5BF0374EB908F0476BD8ED42,
- 6574A50A8997799705B23465,
- 56177921580A4855917E0205,
- 079802C6AEE7646010766FE8,
- CC1C5F8E5DE34223FEC59673,
- FB80347407261BF6CCEFDE91,
- 2BD9B4556479A8A41740BCAE,
- 9E0BA495286388EBF929D578,
- 8D9A9A373E4621F7CBFCCCEF,
- 59203884BC48D3B7F8DEABA8,
- 32C4B61AD995877956B7FA66,
- A66F17E7472E5C19AFE98E46,
- F159C1B99ACF1D91E12D978E,
- 97A847B59EE04483E8850E4B,
- A160AEF56553A658E6EA6A8E,
- 8336A43CE1C3C26D7C7B53D8,
- C7245390C6C44E89F7526CFC,
- 8F67F3C0492EAFEBDBBC12DB,
- E111A336FE13C033EAA0A1D1,
- 9E2B1506AC3FDB7863766D59,
- C607639897ED2538CBB860D0,
- 023B92AC0340305762412E90,
- 3F7C5B53347A487C7FBD2223,
- 4ECF029E3A69BF42FED1503D,
- 3DC2ED15A9DFAAEF3D2ACDDF,
- E67999BF57B139E00207A374,
- 763A63E75AC802F17D11FE8B,
- );
- name = Templates;
- sourceTree = "<group>";
- };
- A9399733CAA07BDAB958242C = {
- isa = PBXGroup;
- children = (
- 8CF70DA9AB4725126B9F55BE,
- F0F189518721D46C0F94FD56,
- E59ABA0D11CBAAD77179E9C6,
- 41105E536155E394E54BDD35,
- 5F6584B675E30761521A9F42,
- 59B08C7B13B8EA5137ACA77A,
- 8C281F2F8EA3AD614ADF7955,
- 4073A12E196BDDADE211E19F,
- 58139D8D454051C59E77609B,
- );
- name = BinaryData;
- sourceTree = "<group>";
- };
- F1B44F007A02A0FAE4DC8D79 = {
- isa = PBXGroup;
- children = (
- BC3B310D42C489E8B8D93327,
- 51BC758EF5D33197CF543E67,
- 35CAE8930F2885F9322D22D5,
- 8A82061A978B03745485C3AC,
- F9111E150CFF155329D44853,
- 1B5BCD4899A9E295786EB642,
- 332AF94C3275FEA8B878D603,
- B9B130F596953116393138DC,
- );
- name = CodeEditor;
- sourceTree = "<group>";
- };
- 2A1D5A24E950E00CDF969502 = {
- isa = PBXGroup;
- children = (
- 01A37DF94E98D991FEF43628,
- 409C636B96A9AC1D732B96F8,
- 9E62EC342665C27BA01AFC1A,
- 8F731F1F98BAB42F1C3B96AA,
- 11DEED05110D3D1D02FCFFB6,
- 0543E83BF7D7D9234C396E82,
- 630DC5EAA31D3EE60B2D989F,
- 705DE88C5C4CC6C871E951B1,
- A49503B646A7BD2BEEFC5CBD,
- E1577F8617C75B91D7399812,
- 33B258726F29360D64FD1451,
- 9F959ECF8CD9B7314AE604A9,
- 73DE14CEAD25D3445457013E,
- 0AE75B0ACD368A4C0FBC2CD0,
- 35CFCC15CBA46F4513940A2A,
- 868B459E02F0877EBE3D56F1,
- 8DFE6D8AFB8057790041300B,
- A22F64D1E4BD4B8FA366DAAD,
- 055636565C2F512E40114582,
- );
- name = Components;
- sourceTree = "<group>";
- };
- 18139A4BCB7C14043C72B9E1 = {
- isa = PBXGroup;
- children = (
- BF301C2E545AEB4AC112C176,
- 9F2D3E5FC10F7C3270908E97,
- 1DCA18E935A35D29D2D9B6A0,
- E468FDB5504C5D9315B2D04F,
- );
- name = Documents;
- sourceTree = "<group>";
- };
- 497FD8DD8175790E4885736B = {
- isa = PBXGroup;
- children = (
- D6390A40B3279E0E626C78D3,
- 9914F905BFCFBE5F76619670,
- 8D178CAEE6D89DE33233313F,
- C402C21DFAC1F8BF121144F1,
- F3CC8F26ECCDA6DCD8A284D2,
- 9B6FD3FEDB6D91AD0A80EF97,
- 512D80BE12634967A085A1DC,
- 4AE469CD40BDAD634135785E,
- F073B54B36D845915CD6D2C1,
- 988F5C1E40DED02D8B064253,
- BCB6C87E3992930674E54D16,
- 72ED72174F9DBD0ABD8AFCED,
- 7031E8CB6D4D84BD980A0BD0,
- 4AE72953E3B3DF06D3B9BA86,
- DA4D0CC5149F7C0FBDAF34A2,
- 355379844A5E6A097038C280,
- 77EA01E7D04BF889930BFF54,
- B97D60D2531CFD0D8555BA5C,
- 36E5FBF64A89D5F2A266A5A7,
- 7687A1374C60A025BDBE98DE,
- D93E2F2468003DD333371F06,
- );
- name = PaintElements;
- sourceTree = "<group>";
- };
- 172E2F5D29A894D0BA9231A9 = {
- isa = PBXGroup;
- children = (
- 7F0A5319912991615FC57945,
- F4FD9BD16ED2700F45A68C4F,
- 7E2013F425E231C6D865DDD0,
- FCEBE24EA79A13713D7CBF26,
- 5783563E39E48ADFC68EB84A,
- 2F373F97E30AC1A0BFC1FC61,
- D045BD5943BD38F2720FF5F0,
- B2CB95B3F44C3CC5735051A3,
- 85A5E3E71BED93B9A3E07681,
- );
- name = Properties;
- sourceTree = "<group>";
- };
- 0565E54C3060E29ED38B65AB = {
- isa = PBXGroup;
- children = (
- EF25A29A2194FC107B40F65F,
- 5524B5C9FC6AEAA670B92AA9,
- A0BBBFBA13A1308B3CD725D5,
- 00E6B87A43453B51850550E1,
- 9BDF2D6255C1CB2CFF376186,
- 6F02C3B7FEA3B50692A70DE5,
- 39597BD78897CB711AFA945A,
- 4E671236FDBD5AD4699740C6,
- 351AF80A004D766E314AB76D,
- EFF38AE74E7267CCC47E8AD1,
- 6E70C1FA80F02D4C310F63AA,
- ED69863B3D591FB3F0CA50E4,
- FFE01768CF1C8DBDAA894F76,
- 65FAD7F6DF65A72B741C2913,
- 719B56C8587863D7AE9B69C6,
- 0EE17BE4154CF1B2EE683894,
- BDF6AFC5F88581AE395F1DC9,
- 75BE2887C6F324B818D80A21,
- 24EB4C2412821B8019D6F754,
- BC623CC67AC58297BF6B4C70,
- );
- name = UI;
- sourceTree = "<group>";
- };
- F6BD840F9A06F2DA891E2CB8 = {
- isa = PBXGroup;
- children = (
- 2A1D5A24E950E00CDF969502,
- 18139A4BCB7C14043C72B9E1,
- 497FD8DD8175790E4885736B,
- 172E2F5D29A894D0BA9231A9,
- 0565E54C3060E29ED38B65AB,
- 9EF583A6201DBC813C2F63C4,
- 6AC88EFC247C225CC5C11A43,
- 133F1E428260C5ADDF496DF9,
- 3F9D4C7F6E5779D4E4AE655D,
- 78D0DBC4798FF040FDB90F6D,
- DA345D5B9DABD049F90DC96F,
- 269A454F1FF081DA67FFD578,
- 8F30A53C7FE4BC65171FB3E2,
- 9D7689451732AF8333402B3A,
- 50498FF6EA3901CBD58223B3,
- C187718F7B9EBA88584B43F3,
- 66B49F08C5EC3E4974825FF8,
- 5432B7B9B2CF2EAEC8B66D5C,
- );
- name = ComponentEditor;
- sourceTree = "<group>";
- };
- 144B649D98AE8316058B8281 = {
- isa = PBXGroup;
- children = (
- 51CBE59779A36D1B80B26974,
- BB187CD608EB6368B29EC335,
- 790F6302B9A0620F23F8A6C1,
- 98E6D61BFF7D85F0E00F0FBF,
- );
- name = Licenses;
- sourceTree = "<group>";
- };
- 9014CA5F3B8D23E883D6975E = {
- isa = PBXGroup;
- children = (
- 2DF5A61F3C497537634773DF,
- CCEA34A55813C7C4E58254F5,
- 0640E34282A97BF73CC8F1EB,
- 3BBFA655E129C2D817EA47C9,
- );
- name = UI;
- sourceTree = "<group>";
- };
- 20B39D53B7DAAB53C7533532 = {
- isa = PBXGroup;
- children = (
- 9014CA5F3B8D23E883D6975E,
- 245C81599FB53865A74FC65B,
- D251114072E67CA86D9913D6,
- E1535CDF4258E7D4AB70B5E5,
- DE3E6B2614229FAD56D50770,
- 308084CBEE9F7D405D72A5E1,
- A978DFE87D9BB5EFE5B3DAAC,
- D2FE76E4CF003856278343CC,
- BA186B51EE4884CD8E3F2741,
- A081306A9E95CA114B81910F,
- ADD6A3CF5D7DE55E57E8E38B,
- A9954DC7F876A7006743ACB6,
- ADA538034910F52FDD2DC88D,
- 8F685EFEFD6EE399058DE842,
- 159DE1FEE2099398983CDDF0,
- B24E3F34C3C4EE54A60C35CC,
- 55DEDCEB35AA1FB54C74B375,
- 3EA27F52A254912218F4DE94,
- 182CB1F96890620A202C6524,
- );
- name = LiveBuildEngine;
- sourceTree = "<group>";
- };
- 236D186F5A6536C59D6E751C = {
- isa = PBXGroup;
- children = (
- 861E52D9AFECADF079BB1F2C,
- 4974E7808F9B57E9A627F878,
- 68C1949F56295D5871C1F223,
- 5E4EB84A7983AB31366A3490,
- 1C80C7672975C1FF9AAC4A4F,
- E3BADF21095BC23DE2CB454F,
- 95EAB6EC9B724538B93910D4,
- 68F41A216E7454E7442AB1F4,
- );
- name = Sidebar;
- sourceTree = "<group>";
- };
- EBC037ECAAC8156B8B19DC69 = {
- isa = PBXGroup;
- children = (
- 236D186F5A6536C59D6E751C,
- 32ECBC08D903418CA0825870,
- A509BC22854D50E4C786EB32,
- 516D6D7C564DD5DF5C15CB06,
- 16751E04B0F3737BDF52CEB4,
- B3528C08B84CBC950252EA69,
- 1B0F18E1D96F727C062B05FA,
- 92A66A8BD87F98EB6B4FB6D0,
- );
- name = UI;
- sourceTree = "<group>";
- };
- 89E9055A179B4C2019B4E1AE = {
- isa = PBXGroup;
- children = (
- EBC037ECAAC8156B8B19DC69,
- F797071D88542C813CF7222A,
- 7211101FFA28400ADBB1D47A,
- BAC43B20E14A340CCF14119C,
- BF3CEF080FA013E2778DCE90,
- B8385E9A644BD3CD94876448,
- );
- name = Project;
- sourceTree = "<group>";
- };
- 4DCC5D64BBE8DE85360A3D57 = {
- isa = PBXGroup;
- children = (
- CCD62DB0A19A985A4B9D7F32,
- D5EF5961B1F0E3FAED32E30A,
- FA790C59A304579F660F112F,
- 59520B8137E6A2E483074399,
- FF68231DE2B395461009116C,
- 20075A86A4D0E8A5B973D9DB,
- C3BB9F92B02B06D04A73794C,
- 8DBB36126CD144A8364F1F19,
- 4FF81FC167C924C47BD8C1C9,
- 9EE3141E20C9CE3EA182FA04,
- E13A54A6D3A1895EACE53E51,
- 25BE1265FE6C6EA3473A3A0A,
- 044478BB994878E35D30154A,
- );
- name = ProjectSaving;
- sourceTree = "<group>";
- };
- EC535A977A1A114BC5DAE7B3 = {
- isa = PBXGroup;
- children = (
- BE618CE21C794BDEE319E328,
- E2B668E2A65AEE8F07B406C8,
- F5DD97B45B8EA60C1ED0DD80,
- DFBEB8E086832AEB0FBEADF0,
- );
- name = Settings;
- sourceTree = "<group>";
- };
- AA2CBF47682AE479C1A387BE = {
- isa = PBXGroup;
- children = (
- F2E4998FB2C7221587A79F8B,
- 23D79A22569BEDF63B57DD36,
- C3E04CD5A93A45154894E624,
- B403AF75EAF361ED74EE476E,
- E186BC01A1B1529937A46485,
- 486E8D02DAD2A0BF54A901C0,
- 983CFBA01CA8811F30FA7F4C,
- 58F1FF52E887887A93E84FC2,
- A6C4AE13FB409DE414094CFA,
- 6FD8DBC0FF42C87D8BEE2452,
- 00515BA4EC5A7D4DC078ED37,
- );
- name = Helpers;
- sourceTree = "<group>";
- };
- B4972C4048154E5E783D3934 = {
- isa = PBXGroup;
- children = (
- 191330B20DAC08B890656EA0,
- C76271530EB4458B6146D463,
- );
- name = PIPs;
- sourceTree = "<group>";
- };
- 15F56361B9CF3E0BE705E64D = {
- isa = PBXGroup;
- children = (
- 9EB33734D0DBD0370AB1247B,
- E367FC2BDAF5EBA48D767FBB,
- 3D36F0CEB84B27BD02FC461A,
- 59F8A47C0020D62C8836A1E7,
- );
- name = PropertyComponents;
- sourceTree = "<group>";
- };
- DD068F16F341D15E150CE6F1 = {
- isa = PBXGroup;
- children = (
- 15F56361B9CF3E0BE705E64D,
- 169DD91232C070C4D6470B31,
- 846B2A670C5A19DE0039E11A,
- C59E624F099CC785F27429EB,
- 4D5F0CA8D1273144681A1D48,
- 00841B7EDDE9C19890F03267,
- 0F8C000E5FF4A2DAC1FEF8EB,
- FE20FE5805A02A4843048200,
- 0CECD562059DFD7FBFB37E3C,
- 3D6FD9C0065BF16568EC0AB7,
- 28D0199327887FFABF9C3F20,
- );
- name = UI;
- sourceTree = "<group>";
- };
- 2B1F885AA027E1A76A1C32E3 = {
- isa = PBXGroup;
- children = (
- AA2CBF47682AE479C1A387BE,
- B4972C4048154E5E783D3934,
- DD068F16F341D15E150CE6F1,
- );
- name = Utility;
- sourceTree = "<group>";
- };
- 73BAA89A783BBDD79AA27964 = {
- isa = PBXGroup;
- children = (
- A69024A225F2AC31F17B1314,
- 11DC04468BC6023671017EBF,
- 087CB3A961CD3C7434D660A4,
- 4B083E951ECB62217C46CB01,
- C2990A8D054BC230E7C637C3,
- 8BD8E9DA627D6EF9BA10FB9E,
- 3C95FA2AA91EBA19ADDD5C29,
- 8A825FDDC00DD253F44D2C3A,
- 4A4EBDAD8D098F72CE053235,
- 0F01067432AC314EAC213C1C,
- A44A774EFC020D3D046A9249,
- 9992E6950C64322A11E39ADF,
- 05D67B5A8D64947C067C0945,
- A085174413736ACC8D7D42A2,
- 471C7B0A8B92320AF0C80839,
- 714267352CE5C4357ADBC231,
- C09BBB58CA45B66D693E8C31,
- );
- name = Wizards;
- sourceTree = "<group>";
- };
- D3109994DA6AD871BE85C4E2 = {
- isa = PBXGroup;
- children = (
- BC67FD952A6F210A11A1ECB8,
- A9399733CAA07BDAB958242C,
- F1B44F007A02A0FAE4DC8D79,
- F6BD840F9A06F2DA891E2CB8,
- 144B649D98AE8316058B8281,
- 20B39D53B7DAAB53C7533532,
- 89E9055A179B4C2019B4E1AE,
- 4DCC5D64BBE8DE85360A3D57,
- EC535A977A1A114BC5DAE7B3,
- 2B1F885AA027E1A76A1C32E3,
- 73BAA89A783BBDD79AA27964,
- );
- name = Projucer;
- sourceTree = "<group>";
- };
- 8A24D1B6925535A868974986 = {
- isa = PBXGroup;
- children = (
- 58DE91CE6B05AFBACADDB251,
- BA159A3B7D129771F5C15EA3,
- AA1C44E89D792DDC4867B2C8,
- 69555CEFC6ED613AA3949298,
- 21F4833C5B5C17B159B956F3,
- B6F2905330EA5C560D527209,
- 7AB7640968FAAC73072FBD10,
- D05BD91B6105827B010E1C20,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 2C6746F66EF4444F53B3221F = {
- isa = PBXGroup;
- children = (
- 8702F43110E4CCA5E5F827F5,
- 472F9A90F685220D730EBF6C,
- 4F687965FBE86EAFDB3ACFEC,
- 805A3A5FBA3B9E28363DD77B,
- DB9C8E35DF815B803CB4A9CF,
- D766BB9D8C32B5560F0493F3,
- 1DE5BBC777FB64798D823002,
- 5867DC4E39DF8539B54C0D59,
- 1B9B5A37F079FE3B3CF8FAB6,
- 0462692BAA9CD1BE6DFBCC33,
- AECE3914F5119A3D586A5635,
- 364D1A9B113320407A7E57B9,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- 8180B5894A78501084B8F133 = {
- isa = PBXGroup;
- children = (
- E266DE67FF319D56F63193A6,
- 6678E9B3EEACAD47F438B264,
- 951128CA33CCDEF570436B1C,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 0FFEF043CA89142B18C79ABE = {
- isa = PBXGroup;
- children = (
- 80D62B907248523E6943298B,
- 5A75806B34E4EA6598A6024A,
- 7B3F7ECF6DBF8C8EE5C2CB86,
- 210CD22F25F2C22F9CEEB025,
- D00F311BFC3C2625C457CB9B,
- D1F9B0E9F5D54FE48BEB46EA,
- 728FE25157E9874D50BBECB2,
- E983E6DDE3318B872EBE347F,
- 8F7BE18698ADCEF51CDE4A5C,
- 842427CFE565F3FCE5B99174,
- E96597BBC6A98255B51B94DC,
- 431D30038CBF67F80E8B3A13,
- 9F01BA9942D038EA8B5289A8,
- E5D6C36496F5BC84D7213BE8,
- CF6C8BD0DA3D8CD4E99EBADA,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 92ABB8016546F41128399E9D = {
- isa = PBXGroup;
- children = (
- 09DE066936CF037E9709ADB1,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 3CC531922CC2D398E283A845 = {
- isa = PBXGroup;
- children = (
- D3109994DA6AD871BE85C4E2,
- 8A24D1B6925535A868974986,
- 2C6746F66EF4444F53B3221F,
- 8180B5894A78501084B8F133,
- 0FFEF043CA89142B18C79ABE,
- 92ABB8016546F41128399E9D,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 0CC6C439D038EDA0D7F10DF0 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ A6A9D7624D002544ECB81D82 = {isa = PBXBuildFile; fileRef = 09DE066936CF037E9709ADB1; };
+ A578EAD4BB55680E8097BE0F = {isa = PBXBuildFile; fileRef = 80D62B907248523E6943298B; };
+ C1B9334AE849F93FB3C56B34 = {isa = PBXBuildFile; fileRef = 5A75806B34E4EA6598A6024A; };
+ 8B4A593B3869815BBAC3EF93 = {isa = PBXBuildFile; fileRef = 7B3F7ECF6DBF8C8EE5C2CB86; };
+ A14C2C2725DA3CA7995D2815 = {isa = PBXBuildFile; fileRef = 210CD22F25F2C22F9CEEB025; };
+ 1E76E36772355E2A43CF4961 = {isa = PBXBuildFile; fileRef = D00F311BFC3C2625C457CB9B; };
+ 241F29FCBB7A17BB44A0B10C = {isa = PBXBuildFile; fileRef = D1F9B0E9F5D54FE48BEB46EA; };
+ 9359F9401D59B4517F75C39C = {isa = PBXBuildFile; fileRef = 728FE25157E9874D50BBECB2; };
+ 091A57B4B9CE623E75E9A756 = {isa = PBXBuildFile; fileRef = E983E6DDE3318B872EBE347F; };
+ FAB47E69F7D9DCE1F906AA07 = {isa = PBXBuildFile; fileRef = 8F7BE18698ADCEF51CDE4A5C; };
+ 0E884E47A637D6C65154699A = {isa = PBXBuildFile; fileRef = 842427CFE565F3FCE5B99174; };
+ 49C22786B54C5DC94E4654B8 = {isa = PBXBuildFile; fileRef = E96597BBC6A98255B51B94DC; };
+ CDEF9FF2D119476D707305DF = {isa = PBXBuildFile; fileRef = 431D30038CBF67F80E8B3A13; };
+ 96EC6315E1B3F1A109F84BAF = {isa = PBXBuildFile; fileRef = 9F01BA9942D038EA8B5289A8; };
+ 11D42F7EC6E6539D79A7F4B1 = {isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; };
+ B980464FA2761CCD64B1FAD6 = {isa = PBXBuildFile; fileRef = CF6C8BD0DA3D8CD4E99EBADA; };
+ 2610F357881240ACBF612F48 = {isa = PBXBuildFile; fileRef = 6678E9B3EEACAD47F438B264; };
+ 1321E6C1C6170B6C898AD09D = {isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; };
+ 6DD9DA1677A6CF789CDAB478 = {isa = PBXBuildFile; fileRef = 0D4D508C638BC74943B9976D; };
+ 954A036F5DDB375DB23FFB3E = {isa = PBXBuildFile; fileRef = 0400CB0E056A1D840304D2DE; };
+ 95B44E6C74B1DED31DBE37EB = {isa = PBXBuildFile; fileRef = 8C52A3DDA62A746AA7A68535; };
+ AA9D0B8E23F3D87A23DE9F8A = {isa = PBXBuildFile; fileRef = 9069981E414A631B036CC9AC; };
+ 98F9BB4612E82EE59689E15C = {isa = PBXBuildFile; fileRef = B6496F16ACE80CACC5721570; };
+ 09C4EDDF7F8B6E75EA3CE3A9 = {isa = PBXBuildFile; fileRef = BC3B310D42C489E8B8D93327; };
+ 71713DE4716DCEDB45A206E2 = {isa = PBXBuildFile; fileRef = F9111E150CFF155329D44853; };
+ 940CE4E081E9E685243C07AA = {isa = PBXBuildFile; fileRef = 332AF94C3275FEA8B878D603; };
+ 49EEEA5B74D38F3C5A8794F1 = {isa = PBXBuildFile; fileRef = 8F731F1F98BAB42F1C3B96AA; };
+ 6FD9428439B572B558EF64EA = {isa = PBXBuildFile; fileRef = BF301C2E545AEB4AC112C176; };
+ 6EAAAAB0C2B2DA259B26D63C = {isa = PBXBuildFile; fileRef = 1DCA18E935A35D29D2D9B6A0; };
+ 4C0F95265A230E5A8717A0A9 = {isa = PBXBuildFile; fileRef = D6390A40B3279E0E626C78D3; };
+ FFA8B18CDF2D2AA500698A96 = {isa = PBXBuildFile; fileRef = 512D80BE12634967A085A1DC; };
+ EE26A1C2DAAB609362F407EA = {isa = PBXBuildFile; fileRef = 988F5C1E40DED02D8B064253; };
+ 4FAAB649E846BA2764C02ACE = {isa = PBXBuildFile; fileRef = 72ED72174F9DBD0ABD8AFCED; };
+ 7D750EF5FCE1E1A461D435BE = {isa = PBXBuildFile; fileRef = 4AE72953E3B3DF06D3B9BA86; };
+ 537ABF1DB09DDBD1542A2B0C = {isa = PBXBuildFile; fileRef = EF25A29A2194FC107B40F65F; };
+ 290F2CD930097091B8DB122E = {isa = PBXBuildFile; fileRef = 00E6B87A43453B51850550E1; };
+ 4B2F2DAA45060D3F250D0AE4 = {isa = PBXBuildFile; fileRef = 6F02C3B7FEA3B50692A70DE5; };
+ BDD30804C9424526A1122A28 = {isa = PBXBuildFile; fileRef = 351AF80A004D766E314AB76D; };
+ 37D582DA2227E004BFA237EC = {isa = PBXBuildFile; fileRef = 6E70C1FA80F02D4C310F63AA; };
+ 9B8ED9D50406E5D75DEE57F5 = {isa = PBXBuildFile; fileRef = FFE01768CF1C8DBDAA894F76; };
+ 89116B0BD882B51C63A84425 = {isa = PBXBuildFile; fileRef = 0EE17BE4154CF1B2EE683894; };
+ 63D97E01F2C4C91037CB65BD = {isa = PBXBuildFile; fileRef = 24EB4C2412821B8019D6F754; };
+ 45A53AF13B0D663050632E8C = {isa = PBXBuildFile; fileRef = 9EF583A6201DBC813C2F63C4; };
+ C2A85091A28C907A4E1E1687 = {isa = PBXBuildFile; fileRef = 133F1E428260C5ADDF496DF9; };
+ 83431B7234A78ECFB3C15F63 = {isa = PBXBuildFile; fileRef = 78D0DBC4798FF040FDB90F6D; };
+ 209FCCC2155A1FCB7E11E20D = {isa = PBXBuildFile; fileRef = 269A454F1FF081DA67FFD578; };
+ C93569F47B4AC1A8E37992ED = {isa = PBXBuildFile; fileRef = 9D7689451732AF8333402B3A; };
+ 1B988E139004D8E2850EB656 = {isa = PBXBuildFile; fileRef = C187718F7B9EBA88584B43F3; };
+ 6FD0752A5CADCF60D79FDBB7 = {isa = PBXBuildFile; fileRef = 51CBE59779A36D1B80B26974; };
+ D25EBE02B55DB244BE0D5635 = {isa = PBXBuildFile; fileRef = DE3E6B2614229FAD56D50770; };
+ 85E7FCB0516EFF853FA7B380 = {isa = PBXBuildFile; fileRef = D2FE76E4CF003856278343CC; };
+ CC6C4D351BA9B473E5F95791 = {isa = PBXBuildFile; fileRef = ADA538034910F52FDD2DC88D; };
+ 05A08E366EBF8D650974E695 = {isa = PBXBuildFile; fileRef = 516D6D7C564DD5DF5C15CB06; };
+ 3FCA61C401007B243E2E9035 = {isa = PBXBuildFile; fileRef = F797071D88542C813CF7222A; };
+ 30B921C38DCEE787B294B746 = {isa = PBXBuildFile; fileRef = BAC43B20E14A340CCF14119C; };
+ 244567D3AE2E417A8CB2B95E = {isa = PBXBuildFile; fileRef = C3BB9F92B02B06D04A73794C; };
+ 26D6AEA321E80ABCC3CCCCD1 = {isa = PBXBuildFile; fileRef = 4FF81FC167C924C47BD8C1C9; };
+ 4E6DC4778D583C48C3CCD4DC = {isa = PBXBuildFile; fileRef = E13A54A6D3A1895EACE53E51; };
+ EE722B47BC36CC8A87E0FB76 = {isa = PBXBuildFile; fileRef = BE618CE21C794BDEE319E328; };
+ 2DF375B40A64BB3778F7ABD1 = {isa = PBXBuildFile; fileRef = F5DD97B45B8EA60C1ED0DD80; };
+ 8BE478303CDF061B72F219E2 = {isa = PBXBuildFile; fileRef = F2E4998FB2C7221587A79F8B; };
+ BF913199032B4CE970E82AA3 = {isa = PBXBuildFile; fileRef = B403AF75EAF361ED74EE476E; };
+ 25EF9B3FECB4C9F0F522DCAA = {isa = PBXBuildFile; fileRef = 486E8D02DAD2A0BF54A901C0; };
+ 638C7247B6DBA67EFE46E124 = {isa = PBXBuildFile; fileRef = 191330B20DAC08B890656EA0; };
+ 2BEC1197D981951D8A897F01 = {isa = PBXBuildFile; fileRef = D859E9EA11A71BD6E85DC649; };
+ D0E26EB54B0087C8BE3D541E = {isa = PBXBuildFile; fileRef = 846B2A670C5A19DE0039E11A; };
+ 468548FB21D264DC12321327 = {isa = PBXBuildFile; fileRef = 4D5F0CA8D1273144681A1D48; };
+ 6ECB2F11D2F593FACCCF99DB = {isa = PBXBuildFile; fileRef = 0F8C000E5FF4A2DAC1FEF8EB; };
+ 95F56FB44C669F93AE77E465 = {isa = PBXBuildFile; fileRef = 0CECD562059DFD7FBFB37E3C; };
+ 518DD443B6F17A5AFD707263 = {isa = PBXBuildFile; fileRef = A69024A225F2AC31F17B1314; };
+ B7EBA1A83575F48CD08140B9 = {isa = PBXBuildFile; fileRef = 4B083E951ECB62217C46CB01; };
+ 3C5267E06A897B0DC0F7EA50 = {isa = PBXBuildFile; fileRef = 472F9A90F685220D730EBF6C; };
+ 202DC8CF15ACBE096CC327EA = {isa = PBXBuildFile; fileRef = 805A3A5FBA3B9E28363DD77B; };
+ 5DD883699B85E4C492CAD065 = {isa = PBXBuildFile; fileRef = DB9C8E35DF815B803CB4A9CF; };
+ D5C9125F65493CA481F18E53 = {isa = PBXBuildFile; fileRef = D766BB9D8C32B5560F0493F3; };
+ 02E8F35A8E0D4A0DF6F38D60 = {isa = PBXBuildFile; fileRef = 1DE5BBC777FB64798D823002; };
+ 234B6BA2952CBC7C61EF70EF = {isa = PBXBuildFile; fileRef = 5867DC4E39DF8539B54C0D59; };
+ 254A7C08594A152C2C646334 = {isa = PBXBuildFile; fileRef = 1B9B5A37F079FE3B3CF8FAB6; };
+ F15F0512666FF8CDC0D08905 = {isa = PBXBuildFile; fileRef = 0462692BAA9CD1BE6DFBCC33; };
+ B18248959DDC44EF4E85320A = {isa = PBXBuildFile; fileRef = AECE3914F5119A3D586A5635; };
+ 00515BA4EC5A7D4DC078ED37 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ValueSourceHelpers.h"; path = "../../Source/Utility/Helpers/jucer_ValueSourceHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+ 00841B7EDDE9C19890F03267 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerTreeViewBase.h"; path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.h"; sourceTree = "SOURCE_ROOT"; };
+ 00E6B87A43453B51850550E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentOverlayComponent.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 016A6C52B0B93DE29197FF64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AnimatedComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 01A37DF94E98D991FEF43628 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 023B92AC0340305762412E90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_OpenGLComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 0400CB0E056A1D840304D2DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CommandLine.cpp"; path = "../../Source/Application/jucer_CommandLine.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 0462692BAA9CD1BE6DFBCC33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 0543E83BF7D7D9234C396E82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentUndoableAction.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
+ 055636565C2F512E40114582 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ViewportHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ViewportHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 05D67B5A8D64947C067C0945 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_GUIApp.h"; path = "../../Source/Wizards/jucer_ProjectWizard_GUIApp.h"; sourceTree = "SOURCE_ROOT"; };
+ 0640E34282A97BF73CC8F1EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 079802C6AEE7646010766FE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioPluginFilterTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 087CB3A961CD3C7434D660A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizard.h"; path = "../../Source/Wizards/jucer_NewProjectWizard.h"; sourceTree = "SOURCE_ROOT"; };
+ 09DE066936CF037E9709ADB1 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Projucer.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 0AE75B0ACD368A4C0FBC2CD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TabbedComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 0B24F292A357ABFD9BCC6D7F = {isa = PBXFileReference; lastKnownFileType = file; name = gradlew; path = ../../Source/BinaryData/gradle/gradlew; sourceTree = "SOURCE_ROOT"; };
+ 0CECD562059DFD7FBFB37E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_SlidingPanelComponent.cpp"; path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 0D4D508C638BC74943B9976D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AutoUpdater.cpp"; path = "../../Source/Application/jucer_AutoUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 0EE17BE4154CF1B2EE683894 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceEditorPanel.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 0F01067432AC314EAC213C1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Blank.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Blank.h"; sourceTree = "SOURCE_ROOT"; };
+ 0F8C000E5FF4A2DAC1FEF8EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjucerLookAndFeel.cpp"; path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 11DC04468BC6023671017EBF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewFileWizard.h"; path = "../../Source/Wizards/jucer_NewFileWizard.h"; sourceTree = "SOURCE_ROOT"; };
+ 11DEED05110D3D1D02FCFFB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTypeHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 124232706D1C8A3CA49E70CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPCreatorWindowComponent.h"; path = "../../Source/Application/Windows/jucer_PIPCreatorWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 129F2DE0FEF154F8F8C7A74E = {isa = PBXFileReference; lastKnownFileType = file.jar; name = "gradle-wrapper.jar"; path = "../../Source/BinaryData/gradle/gradle-wrapper.jar"; sourceTree = "SOURCE_ROOT"; };
+ 133F1E428260C5ADDF496DF9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentLayout.cpp"; path = "../../Source/ComponentEditor/jucer_ComponentLayout.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 159DE1FEE2099398983CDDF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ErrorList.h"; path = "../../Source/LiveBuildEngine/jucer_ErrorList.h"; sourceTree = "SOURCE_ROOT"; };
+ 16751E04B0F3737BDF52CEB4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_HeaderComponent.h"; path = "../../Source/Project/UI/jucer_HeaderComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 169DD91232C070C4D6470B31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_IconButton.h"; path = "../../Source/Utility/UI/jucer_IconButton.h"; sourceTree = "SOURCE_ROOT"; };
+ 182CB1F96890620A202C6524 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SourceCodeRange.h"; path = "../../Source/LiveBuildEngine/jucer_SourceCodeRange.h"; sourceTree = "SOURCE_ROOT"; };
+ 191330B20DAC08B890656EA0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PIPGenerator.cpp"; path = "../../Source/Utility/PIPs/jucer_PIPGenerator.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 194457D806A26E793584AC0C = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "huckleberry_icon.svg"; path = "../../Source/BinaryData/Icons/huckleberry_icon.svg"; sourceTree = "SOURCE_ROOT"; };
+ 1B0F18E1D96F727C062B05FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectContentComponent.cpp"; path = "../../Source/Project/UI/jucer_ProjectContentComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 1B5BCD4899A9E295786EB642 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenDocumentManager.h"; path = "../../Source/CodeEditor/jucer_OpenDocumentManager.h"; sourceTree = "SOURCE_ROOT"; };
+ 1B9B5A37F079FE3B3CF8FAB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 1C80C7672975C1FF9AAC4A4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTab.h"; path = "../../Source/Project/UI/Sidebar/jucer_ProjectTab.h"; sourceTree = "SOURCE_ROOT"; };
+ 1DCA18E935A35D29D2D9B6A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentDocument.cpp"; path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 1DE5BBC777FB64798D823002 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 20075A86A4D0E8A5B973D9DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Xcode.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Xcode.h"; sourceTree = "SOURCE_ROOT"; };
+ 203FA6AD7EDDF1F9C338CC2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 2072D6BAE744B53B6FBBDDD8 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioPlugin.svg"; path = "../../Source/BinaryData/Icons/wizard_AudioPlugin.svg"; sourceTree = "SOURCE_ROOT"; };
+ 210CD22F25F2C22F9CEEB025 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ 21F4833C5B5C17B159B956F3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 23A8DE16C0CDB8EED18B008B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommandIDs.h"; path = "../../Source/Application/jucer_CommandIDs.h"; sourceTree = "SOURCE_ROOT"; };
+ 23D79A22569BEDF63B57DD36 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CodeHelpers.h"; path = "../../Source/Utility/Helpers/jucer_CodeHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+ 245C81599FB53865A74FC65B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ActivityList.h"; path = "../../Source/LiveBuildEngine/jucer_ActivityList.h"; sourceTree = "SOURCE_ROOT"; };
+ 24EB4C2412821B8019D6F754 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_TestComponent.cpp"; path = "../../Source/ComponentEditor/UI/jucer_TestComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 25BE1265FE6C6EA3473A3A0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceFile.h"; path = "../../Source/ProjectSaving/jucer_ResourceFile.h"; sourceTree = "SOURCE_ROOT"; };
+ 269A454F1FF081DA67FFD578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerDocument.cpp"; path = "../../Source/ComponentEditor/jucer_JucerDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 28D0199327887FFABF9C3F20 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UserSettingsPopup.h"; path = "../../Source/Utility/UI/jucer_UserSettingsPopup.h"; sourceTree = "SOURCE_ROOT"; };
+ 2BD9B4556479A8A41740BCAE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 2CD34A70B4032C0426F7AA10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MainWindow.h"; path = "../../Source/Application/jucer_MainWindow.h"; sourceTree = "SOURCE_ROOT"; };
+ 2DF5A61F3C497537634773DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ActivityListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 2EEB1C074162F363C6599282 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommandLine.h"; path = "../../Source/Application/jucer_CommandLine.h"; sourceTree = "SOURCE_ROOT"; };
+ 2F373F97E30AC1A0BFC1FC61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 308084CBEE9F7D405D72A5E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineClient.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.h"; sourceTree = "SOURCE_ROOT"; };
+ 32C4B61AD995877956B7FA66 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_InlineComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_InlineComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 32ECBC08D903418CA0825870 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentViewComponents.h"; path = "../../Source/Project/UI/jucer_ContentViewComponents.h"; sourceTree = "SOURCE_ROOT"; };
+ 332AF94C3275FEA8B878D603 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_SourceCodeEditor.cpp"; path = "../../Source/CodeEditor/jucer_SourceCodeEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 33B258726F29360D64FD1451 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_JucerComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 351AF80A004D766E314AB76D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerDocumentEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 355379844A5E6A097038C280 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementRectangle.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ 35CAE8930F2885F9322D22D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ItemPreviewComponent.h"; path = "../../Source/CodeEditor/jucer_ItemPreviewComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 35CFCC15CBA46F4513940A2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TextButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 364D1A9B113320407A7E57B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 36E5FBF64A89D5F2A266A5A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementUndoableAction.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
+ 39597BD78897CB711AFA945A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_EditingPanelBase.h"; path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.h"; sourceTree = "SOURCE_ROOT"; };
+ 3BBFA655E129C2D817EA47C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ErrorListComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_ErrorListComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 3C95FA2AA91EBA19ADDD5C29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Animated.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Animated.h"; sourceTree = "SOURCE_ROOT"; };
+ 3D6FD9C0065BF16568EC0AB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SlidingPanelComponent.h"; path = "../../Source/Utility/UI/jucer_SlidingPanelComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 3DC2ED15A9DFAAEF3D2ACDDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PIPMain.cpp"; path = "../../Source/BinaryData/Templates/jucer_PIPMain.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 3EA27F52A254912218F4DE94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectBuildInfo.h"; path = "../../Source/LiveBuildEngine/jucer_ProjectBuildInfo.h"; sourceTree = "SOURCE_ROOT"; };
+ 3F7C5B53347A487C7FBD2223 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenGLComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 3F8EC008960DBEB2A5D3C3F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Headers.h"; path = "../../Source/Application/jucer_Headers.h"; sourceTree = "SOURCE_ROOT"; };
+ 3F9D4C7F6E5779D4E4AE655D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayout.h"; path = "../../Source/ComponentEditor/jucer_ComponentLayout.h"; sourceTree = "SOURCE_ROOT"; };
+ 4073A12E196BDDADE211E19F = {isa = PBXFileReference; lastKnownFileType = text.txt; name = "projucer_EULA.txt"; path = "../../Source/BinaryData/projucer_EULA.txt"; sourceTree = "SOURCE_ROOT"; };
+ 409C636B96A9AC1D732B96F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComboBoxHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ComboBoxHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 41105E536155E394E54BDD35 = {isa = PBXFileReference; lastKnownFileType = file.xml; name = "colourscheme_dark.xml"; path = "../../Source/BinaryData/colourscheme_dark.xml"; sourceTree = "SOURCE_ROOT"; };
+ 42F4AA3EF0883D506987CA99 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_codeBlocks.svg"; path = "../../Source/BinaryData/Icons/export_codeBlocks.svg"; sourceTree = "SOURCE_ROOT"; };
+ 431D30038CBF67F80E8B3A13 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+ 432EC251A122071809471804 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "juce-logo-with-text.svg"; path = "../../Source/BinaryData/Icons/juce-logo-with-text.svg"; sourceTree = "SOURCE_ROOT"; };
+ 471C7B0A8B92320AF0C80839 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_StaticLibrary.h"; path = "../../Source/Wizards/jucer_ProjectWizard_StaticLibrary.h"; sourceTree = "SOURCE_ROOT"; };
+ 472F9A90F685220D730EBF6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 4818A05DE44ADA03D85E1083 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjucerAnalytics.h"; path = "../../Source/Application/jucer_ProjucerAnalytics.h"; sourceTree = "SOURCE_ROOT"; };
+ 486E8D02DAD2A0BF54A901C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MiscUtilities.cpp"; path = "../../Source/Utility/Helpers/jucer_MiscUtilities.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4974E7808F9B57E9A627F878 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_FileTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+ 4A4EBDAD8D098F72CE053235 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_AudioPlugin.h"; path = "../../Source/Wizards/jucer_ProjectWizard_AudioPlugin.h"; sourceTree = "SOURCE_ROOT"; };
+ 4AE469CD40BDAD634135785E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElement.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.h"; sourceTree = "SOURCE_ROOT"; };
+ 4AE72953E3B3DF06D3B9BA86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementPath.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4B083E951ECB62217C46CB01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewProjectWizardClasses.cpp"; path = "../../Source/Wizards/jucer_NewProjectWizardClasses.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4D5F0CA8D1273144681A1D48 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerTreeViewBase.cpp"; path = "../../Source/Utility/UI/jucer_JucerTreeViewBase.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4D698BF12BCD6B0896BCDF17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AutoUpdater.h"; path = "../../Source/Application/jucer_AutoUpdater.h"; sourceTree = "SOURCE_ROOT"; };
+ 4E671236FDBD5AD4699740C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerCommandIDs.h"; path = "../../Source/ComponentEditor/UI/jucer_JucerCommandIDs.h"; sourceTree = "SOURCE_ROOT"; };
+ 4ECF029E3A69BF42FED1503D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPAudioProcessorTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 4F687965FBE86EAFDB3ACFEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
+ 4FF81FC167C924C47BD8C1C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectSaver.cpp"; path = "../../Source/ProjectSaving/jucer_ProjectSaver.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 50498FF6EA3901CBD58223B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ObjectTypes.h"; path = "../../Source/ComponentEditor/jucer_ObjectTypes.h"; sourceTree = "SOURCE_ROOT"; };
+ 512D80BE12634967A085A1DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElement.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 514F2FAFDBF535AC03FA2E6C = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "background_logo.svg"; path = "../../Source/BinaryData/Icons/background_logo.svg"; sourceTree = "SOURCE_ROOT"; };
+ 516D6D7C564DD5DF5C15CB06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_HeaderComponent.cpp"; path = "../../Source/Project/UI/jucer_HeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 51BC758EF5D33197CF543E67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 51CBE59779A36D1B80B26974 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_LicenseController.cpp"; path = "../../Source/Licenses/jucer_LicenseController.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 5432B7B9B2CF2EAEC8B66D5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UtilityFunctions.h"; path = "../../Source/ComponentEditor/jucer_UtilityFunctions.h"; sourceTree = "SOURCE_ROOT"; };
+ 5524B5C9FC6AEAA670B92AA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayoutEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ 55DEDCEB35AA1FB54C74B375 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MessageIDs.h"; path = "../../Source/LiveBuildEngine/jucer_MessageIDs.h"; sourceTree = "SOURCE_ROOT"; };
+ 56177921580A4855917E0205 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioPluginEditorTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 56749E4C72A8F51ACA8F2330 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_clion.svg"; path = "../../Source/BinaryData/Icons/export_clion.svg"; sourceTree = "SOURCE_ROOT"; };
+ 576A92E1E0D8F453EC0FEB34 = {isa = PBXFileReference; lastKnownFileType = file.bat; name = gradlew.bat; path = ../../Source/BinaryData/gradle/gradlew.bat; sourceTree = "SOURCE_ROOT"; };
+ 5783563E39E48ADFC68EB84A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTextProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ 58139D8D454051C59E77609B = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = ../../Source/BinaryData/RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 5867DC4E39DF8539B54C0D59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 58DE91CE6B05AFBACADDB251 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ 58F1FF52E887887A93E84FC2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PresetIDs.h"; path = "../../Source/Utility/Helpers/jucer_PresetIDs.h"; sourceTree = "SOURCE_ROOT"; };
+ 59203884BC48D3B7F8DEABA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentCompTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 59520B8137E6A2E483074399 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Make.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Make.h"; sourceTree = "SOURCE_ROOT"; };
+ 59B08C7B13B8EA5137ACA77A = {isa = PBXFileReference; lastKnownFileType = text.txt; name = nothingtoseehere.txt; path = ../../Source/BinaryData/nothingtoseehere.txt; sourceTree = "SOURCE_ROOT"; };
+ 59F8A47C0020D62C8836A1E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PropertyComponentsWithEnablement.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"; sourceTree = "SOURCE_ROOT"; };
+ 5A75806B34E4EA6598A6024A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 5B3532C5F103DAC87B4A5675 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_GUI.svg"; path = "../../Source/BinaryData/Icons/wizard_GUI.svg"; sourceTree = "SOURCE_ROOT"; };
+ 5BF0374EB908F0476BD8ED42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 5E4EB84A7983AB31366A3490 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ModuleTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+ 5F6584B675E30761521A9F42 = {isa = PBXFileReference; lastKnownFileType = file.xml; name = "colourscheme_light.xml"; path = "../../Source/BinaryData/colourscheme_light.xml"; sourceTree = "SOURCE_ROOT"; };
+ 62922B3C0620368D1799A653 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_OpenGL.svg"; path = "../../Source/BinaryData/Icons/wizard_OpenGL.svg"; sourceTree = "SOURCE_ROOT"; };
+ 630DC5EAA31D3EE60B2D989F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GenericComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_GenericComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 6574A50A8997799705B23465 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioPluginEditorTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 65FAD7F6DF65A72B741C2913 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutinePanel.h"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h"; sourceTree = "SOURCE_ROOT"; };
+ 6678E9B3EEACAD47F438B264 = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 66B49F08C5EC3E4974825FF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutine.h"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.h"; sourceTree = "SOURCE_ROOT"; };
+ 68C1949F56295D5871C1F223 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveBuildTab.h"; path = "../../Source/Project/UI/Sidebar/jucer_LiveBuildTab.h"; sourceTree = "SOURCE_ROOT"; };
+ 68F41A216E7454E7442AB1F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeItemTypes.h"; path = "../../Source/Project/UI/Sidebar/jucer_TreeItemTypes.h"; sourceTree = "SOURCE_ROOT"; };
+ 69555CEFC6ED613AA3949298 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ 69B478C992FA0B8C885946A6 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_linux.svg"; path = "../../Source/BinaryData/Icons/export_linux.svg"; sourceTree = "SOURCE_ROOT"; };
+ 6AC88EFC247C225CC5C11A43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_BinaryResources.h"; path = "../../Source/ComponentEditor/jucer_BinaryResources.h"; sourceTree = "SOURCE_ROOT"; };
+ 6E6140969908E7619F858740 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommonHeaders.h"; path = "../../Source/Application/jucer_CommonHeaders.h"; sourceTree = "SOURCE_ROOT"; };
+ 6E70C1FA80F02D4C310F63AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutineEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 6F02C3B7FEA3B50692A70DE5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_EditingPanelBase.cpp"; path = "../../Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 6FD8DBC0FF42C87D8BEE2452 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationHelpers.h"; path = "../../Source/Utility/Helpers/jucer_TranslationHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+ 7031E8CB6D4D84BD980A0BD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementImage.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h"; sourceTree = "SOURCE_ROOT"; };
+ 705DE88C5C4CC6C871E951B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupComponentHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_GroupComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 714267352CE5C4357ADBC231 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StartPageComponent.h"; path = "../../Source/Wizards/jucer_StartPageComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 719B56C8587863D7AE9B69C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePositionedRectangle.h"; path = "../../Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ 7211101FFA28400ADBB1D47A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Module.h"; path = "../../Source/Project/jucer_Module.h"; sourceTree = "SOURCE_ROOT"; };
+ 728FE25157E9874D50BBECB2 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ 72ED72174F9DBD0ABD8AFCED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementImage.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 73DE14CEAD25D3445457013E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SliderHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_SliderHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 75BE2887C6F324B818D80A21 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SnapGridPainter.h"; path = "../../Source/ComponentEditor/UI/jucer_SnapGridPainter.h"; sourceTree = "SOURCE_ROOT"; };
+ 7687A1374C60A025BDBE98DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PointComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PointComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 77EA01E7D04BF889930BFF54 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementRoundedRectangle.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ 78D0DBC4798FF040FDB90F6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_GeneratedCode.cpp"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 790F6302B9A0620F23F8A6C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseThread.h"; path = "../../Source/Licenses/jucer_LicenseThread.h"; sourceTree = "SOURCE_ROOT"; };
+ 7AB7640968FAAC73072FBD10 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 7B3F7ECF6DBF8C8EE5C2CB86 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
+ 7CA44FF0BA319517C6E39651 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Application.cpp"; path = "../../Source/Application/jucer_Application.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 7E2013F425E231C6D865DDD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentChoiceProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ 7F0A5319912991615FC57945 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColourPropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 805A3A5FBA3B9E28363DD77B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 807049CA2D5B6DE18EA078F2 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_android.svg"; path = "../../Source/BinaryData/Icons/export_android.svg"; sourceTree = "SOURCE_ROOT"; };
+ 80D62B907248523E6943298B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 8336A43CE1C3C26D7C7B53D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 842427CFE565F3FCE5B99174 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ 846B2A670C5A19DE0039E11A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Icons.cpp"; path = "../../Source/Utility/UI/jucer_Icons.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 85A5E3E71BED93B9A3E07681 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PositionPropertyBase.h"; path = "../../Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h"; sourceTree = "SOURCE_ROOT"; };
+ 861E52D9AFECADF079BB1F2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ExporterTreeItems.h"; path = "../../Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h"; sourceTree = "SOURCE_ROOT"; };
+ 868B459E02F0877EBE3D56F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextEditorHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TextEditorHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 8702F43110E4CCA5E5F827F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 8A82061A978B03745485C3AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveBuildCodeEditor.h"; path = "../../Source/CodeEditor/jucer_LiveBuildCodeEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ 8A825FDDC00DD253F44D2C3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_AudioApp.h"; path = "../../Source/Wizards/jucer_ProjectWizard_AudioApp.h"; sourceTree = "SOURCE_ROOT"; };
+ 8BD8E9DA627D6EF9BA10FB9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizardComponent.h"; path = "../../Source/Wizards/jucer_NewProjectWizardComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 8C281F2F8EA3AD614ADF7955 = {isa = PBXFileReference; lastKnownFileType = text.html; name = offlinepage.html; path = ../../Source/BinaryData/offlinepage.html; sourceTree = "SOURCE_ROOT"; };
+ 8C52A3DDA62A746AA7A68535 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Main.cpp"; path = "../../Source/Application/jucer_Main.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8D178CAEE6D89DE33233313F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ElementSiblingComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 8D9A9A373E4621F7CBFCCCEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ContentCompTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8DBB36126CD144A8364F1F19 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExporter.h"; path = "../../Source/ProjectSaving/jucer_ProjectExporter.h"; sourceTree = "SOURCE_ROOT"; };
+ 8DFE6D8AFB8057790041300B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ToggleButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ 8F30A53C7FE4BC65171FB3E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerDocument.h"; path = "../../Source/ComponentEditor/jucer_JucerDocument.h"; sourceTree = "SOURCE_ROOT"; };
+ 8F4D281E98808204E2846A7D = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_xcode.svg"; path = "../../Source/BinaryData/Icons/export_xcode.svg"; sourceTree = "SOURCE_ROOT"; };
+ 8F67F3C0492EAFEBDBBC12DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewCppFileTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8F685EFEFD6EE399058DE842 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DownloadCompileEngineThread.h"; path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.h"; sourceTree = "SOURCE_ROOT"; };
+ 8F731F1F98BAB42F1C3B96AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTypeHandler.cpp"; path = "../../Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8F7BE18698ADCEF51CDE4A5C = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 8FEF6F5EA676B824C021EB6F = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AnimatedApp.svg"; path = "../../Source/BinaryData/Icons/wizard_AnimatedApp.svg"; sourceTree = "SOURCE_ROOT"; };
+ 8FF26BF72A522FBEAAFDDF54 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioApp.svg"; path = "../../Source/BinaryData/Icons/wizard_AudioApp.svg"; sourceTree = "SOURCE_ROOT"; };
+ 9069981E414A631B036CC9AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainWindow.cpp"; path = "../../Source/Application/jucer_MainWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 92926A4D3CC4BB2A9D35EB0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UTF8WindowComponent.h"; path = "../../Source/Application/Windows/jucer_UTF8WindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 92A66A8BD87F98EB6B4FB6D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectContentComponent.h"; path = "../../Source/Project/UI/jucer_ProjectContentComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 951128CA33CCDEF570436B1C = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; };
+ 95EAB6EC9B724538B93910D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TabComponents.h"; path = "../../Source/Project/UI/Sidebar/jucer_TabComponents.h"; sourceTree = "SOURCE_ROOT"; };
+ 97A847B59EE04483E8850E4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_SimpleWindow.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 983CFBA01CA8811F30FA7F4C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_MiscUtilities.h"; path = "../../Source/Utility/Helpers/jucer_MiscUtilities.h"; sourceTree = "SOURCE_ROOT"; };
+ 988F5C1E40DED02D8B064253 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintElementGroup.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 98E6D61BFF7D85F0E00F0FBF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseWebview.h"; path = "../../Source/Licenses/jucer_LicenseWebview.h"; sourceTree = "SOURCE_ROOT"; };
+ 9914F905BFCFBE5F76619670 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColouredElement.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h"; sourceTree = "SOURCE_ROOT"; };
+ 996E472B82A75531875A5E38 = {isa = PBXFileReference; lastKnownFileType = file; name = LICENSE; path = ../../Source/BinaryData/gradle/LICENSE; sourceTree = "SOURCE_ROOT"; };
+ 9992E6950C64322A11E39ADF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_DLL.h"; path = "../../Source/Wizards/jucer_ProjectWizard_DLL.h"; sourceTree = "SOURCE_ROOT"; };
+ 9A3B8BBDA8E144A3DF6B9349 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AnimatedComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 9B6FD3FEDB6D91AD0A80EF97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ImageResourceProperty.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ 9BDF2D6255C1CB2CFF376186 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentOverlayComponent.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 9D7689451732AF8333402B3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ObjectTypes.cpp"; path = "../../Source/ComponentEditor/jucer_ObjectTypes.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 9E0BA495286388EBF929D578 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentCompSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 9E2B1506AC3FDB7863766D59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewInlineComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ 9E62EC342665C27BA01AFC1A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentNameProperty.h"; path = "../../Source/ComponentEditor/Components/jucer_ComponentNameProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ 9EB33734D0DBD0370AB1247B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColourPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 9EE3141E20C9CE3EA182FA04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectSaver.h"; path = "../../Source/ProjectSaving/jucer_ProjectSaver.h"; sourceTree = "SOURCE_ROOT"; };
+ 9EF583A6201DBC813C2F63C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_BinaryResources.cpp"; path = "../../Source/ComponentEditor/jucer_BinaryResources.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 9F01BA9942D038EA8B5289A8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; };
+ 9F2D3E5FC10F7C3270908E97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ButtonDocument.h"; path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.h"; sourceTree = "SOURCE_ROOT"; };
+ 9F959ECF8CD9B7314AE604A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LabelHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_LabelHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ A081306A9E95CA114B81910F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineSettings.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineSettings.h"; sourceTree = "SOURCE_ROOT"; };
+ A085174413736ACC8D7D42A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_openGL.h"; path = "../../Source/Wizards/jucer_ProjectWizard_openGL.h"; sourceTree = "SOURCE_ROOT"; };
+ A0BBBFBA13A1308B3CD725D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentLayoutPanel.h"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h"; sourceTree = "SOURCE_ROOT"; };
+ A160AEF56553A658E6EA6A8E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_Window.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp"; sourceTree = "SOURCE_ROOT"; };
+ A22F64D1E4BD4B8FA366DAAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_TreeViewHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ A44A774EFC020D3D046A9249 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectWizard_Console.h"; path = "../../Source/Wizards/jucer_ProjectWizard_Console.h"; sourceTree = "SOURCE_ROOT"; };
+ A49503B646A7BD2BEEFC5CBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_HyperlinkButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ A509BC22854D50E4C786EB32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileGroupInformationComponent.h"; path = "../../Source/Project/UI/jucer_FileGroupInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ A66F17E7472E5C19AFE98E46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainConsoleAppTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ A69024A225F2AC31F17B1314 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewFileWizard.cpp"; path = "../../Source/Wizards/jucer_NewFileWizard.cpp"; sourceTree = "SOURCE_ROOT"; };
+ A6C4AE13FB409DE414094CFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePath.h"; path = "../../Source/Utility/Helpers/jucer_RelativePath.h"; sourceTree = "SOURCE_ROOT"; };
+ A978DFE87D9BB5EFE5B3DAAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineDLL.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineDLL.h"; sourceTree = "SOURCE_ROOT"; };
+ A9954DC7F876A7006743ACB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DiagnosticMessage.h"; path = "../../Source/LiveBuildEngine/jucer_DiagnosticMessage.h"; sourceTree = "SOURCE_ROOT"; };
+ AA1C44E89D792DDC4867B2C8 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ ADA538034910F52FDD2DC88D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DownloadCompileEngineThread.cpp"; path = "../../Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp"; sourceTree = "SOURCE_ROOT"; };
+ ADD6A3CF5D7DE55E57E8E38B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CppHelpers.h"; path = "../../Source/LiveBuildEngine/jucer_CppHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+ AECE3914F5119A3D586A5635 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ AEFE3BA0C31EC78A5767A10E = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_DLL.svg"; path = "../../Source/BinaryData/Icons/wizard_DLL.svg"; sourceTree = "SOURCE_ROOT"; };
+ B1C2F8ED14BF914CD1882708 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_Openfile.svg"; path = "../../Source/BinaryData/Icons/wizard_Openfile.svg"; sourceTree = "SOURCE_ROOT"; };
+ B24E3F34C3C4EE54A60C35CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LiveCodeBuilderDLL.h"; path = "../../Source/LiveBuildEngine/jucer_LiveCodeBuilderDLL.h"; sourceTree = "SOURCE_ROOT"; };
+ B2CB95B3F44C3CC5735051A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JustificationProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_JustificationProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ B3528C08B84CBC950252EA69 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ModulesInformationComponent.h"; path = "../../Source/Project/UI/jucer_ModulesInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ B403AF75EAF361ED74EE476E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_FileHelpers.cpp"; path = "../../Source/Utility/Helpers/jucer_FileHelpers.cpp"; sourceTree = "SOURCE_ROOT"; };
+ B6496F16ACE80CACC5721570 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjucerAnalytics.cpp"; path = "../../Source/Application/jucer_ProjucerAnalytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ B6F2905330EA5C560D527209 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ B8385E9A644BD3CD94876448 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectType.h"; path = "../../Source/Project/jucer_ProjectType.h"; sourceTree = "SOURCE_ROOT"; };
+ B83C9BD89F31EA9E5E12A3C6 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "juce_icon.png"; path = "../../Source/BinaryData/Icons/juce_icon.png"; sourceTree = "SOURCE_ROOT"; };
+ B83DAADA1A871F21582FFB23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ApplicationUsageDataWindowComponent.h"; path = "../../Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ B97D60D2531CFD0D8555BA5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementText.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementText.h"; sourceTree = "SOURCE_ROOT"; };
+ B9B130F596953116393138DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SourceCodeEditor.h"; path = "../../Source/CodeEditor/jucer_SourceCodeEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ BA159A3B7D129771F5C15EA3 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ BA186B51EE4884CD8E3F2741 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CompileEngineServer.h"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.h"; sourceTree = "SOURCE_ROOT"; };
+ BAC43B20E14A340CCF14119C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Project.cpp"; path = "../../Source/Project/jucer_Project.cpp"; sourceTree = "SOURCE_ROOT"; };
+ BB187CD608EB6368B29EC335 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_LicenseController.h"; path = "../../Source/Licenses/jucer_LicenseController.h"; sourceTree = "SOURCE_ROOT"; };
+ BC3B310D42C489E8B8D93327 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DocumentEditorComponent.cpp"; path = "../../Source/CodeEditor/jucer_DocumentEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ BC623CC67AC58297BF6B4C70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TestComponent.h"; path = "../../Source/ComponentEditor/UI/jucer_TestComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ BCB6C87E3992930674E54D16 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementGroup.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h"; sourceTree = "SOURCE_ROOT"; };
+ BDF6AFC5F88581AE395F1DC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceEditorPanel.h"; path = "../../Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h"; sourceTree = "SOURCE_ROOT"; };
+ BE618CE21C794BDEE319E328 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AppearanceSettings.cpp"; path = "../../Source/Settings/jucer_AppearanceSettings.cpp"; sourceTree = "SOURCE_ROOT"; };
+ BF301C2E545AEB4AC112C176 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ButtonDocument.cpp"; path = "../../Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+ BF3CEF080FA013E2778DCE90 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Project.h"; path = "../../Source/Project/jucer_Project.h"; sourceTree = "SOURCE_ROOT"; };
+ C09BBB58CA45B66D693E8C31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TemplateThumbnailsComponent.h"; path = "../../Source/Wizards/jucer_TemplateThumbnailsComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ C187718F7B9EBA88584B43F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutine.cpp"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp"; sourceTree = "SOURCE_ROOT"; };
+ C2990A8D054BC230E7C637C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizardClasses.h"; path = "../../Source/Wizards/jucer_NewProjectWizardClasses.h"; sourceTree = "SOURCE_ROOT"; };
+ C3BB9F92B02B06D04A73794C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectExporter.cpp"; path = "../../Source/ProjectSaving/jucer_ProjectExporter.cpp"; sourceTree = "SOURCE_ROOT"; };
+ C3E04CD5A93A45154894E624 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Colours.h"; path = "../../Source/Utility/Helpers/jucer_Colours.h"; sourceTree = "SOURCE_ROOT"; };
+ C402C21DFAC1F8BF121144F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FillType.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_FillType.h"; sourceTree = "SOURCE_ROOT"; };
+ C59E624F099CC785F27429EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Icons.h"; path = "../../Source/Utility/UI/jucer_Icons.h"; sourceTree = "SOURCE_ROOT"; };
+ C607639897ED2538CBB860D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_OpenGLComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ C7245390C6C44E89F7526CFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ C736264708F3F68BA745BA29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FloatingToolWindow.h"; path = "../../Source/Application/Windows/jucer_FloatingToolWindow.h"; sourceTree = "SOURCE_ROOT"; };
+ C76271530EB4458B6146D463 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPGenerator.h"; path = "../../Source/Utility/PIPs/jucer_PIPGenerator.h"; sourceTree = "SOURCE_ROOT"; };
+ CC1C5F8E5DE34223FEC59673 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioPluginFilterTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ CCD62DB0A19A985A4B9D7F32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_Android.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_Android.h"; sourceTree = "SOURCE_ROOT"; };
+ CCEA34A55813C7C4E58254F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_BuildTabStatusComponent.h"; path = "../../Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ CF6C8BD0DA3D8CD4E99EBADA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ D00F311BFC3C2625C457CB9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ D045BD5943BD38F2720FF5F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FontPropertyComponent.h"; path = "../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ D05BD91B6105827B010E1C20 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ D1739728A79A2062418B8EF0 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_StaticLibrary.svg"; path = "../../Source/BinaryData/Icons/wizard_StaticLibrary.svg"; sourceTree = "SOURCE_ROOT"; };
+ D1F9B0E9F5D54FE48BEB46EA = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ D251114072E67CA86D9913D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ClassDatabase.h"; path = "../../Source/LiveBuildEngine/jucer_ClassDatabase.h"; sourceTree = "SOURCE_ROOT"; };
+ D2FE76E4CF003856278343CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CompileEngineServer.cpp"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineServer.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D4EB334E5186D1584EC63CA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioComponentSimpleTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ D5795F8CAC5876714DAB355F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AnimatedComponentTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ D5EF5961B1F0E3FAED32E30A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CLion.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_CLion.h"; sourceTree = "SOURCE_ROOT"; };
+ D6390A40B3279E0E626C78D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ColouredElement.cpp"; path = "../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D766BB9D8C32B5560F0493F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ D859E9EA11A71BD6E85DC649 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DependencyPathPropertyComponent.cpp"; path = "../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D91E7F8FEF9290195D56782C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_EditorColourSchemeWindowComponent.h"; path = "../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ D93E2F2468003DD333371F06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StrokeType.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_StrokeType.h"; sourceTree = "SOURCE_ROOT"; };
+ DA345D5B9DABD049F90DC96F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; sourceTree = "SOURCE_ROOT"; };
+ DA4D0CC5149F7C0FBDAF34A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementPath.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h"; sourceTree = "SOURCE_ROOT"; };
+ DB9C8E35DF815B803CB4A9CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ DDC382008FFD9F9E0B2B0EDD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SVGPathDataWindowComponent.h"; path = "../../Source/Application/Windows/jucer_SVGPathDataWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ DE3E6B2614229FAD56D50770 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CompileEngineClient.cpp"; path = "../../Source/LiveBuildEngine/jucer_CompileEngineClient.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DE4A987B2D5529990A6AA9D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AboutWindowComponent.h"; path = "../../Source/Application/Windows/jucer_AboutWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ DFBEB8E086832AEB0FBEADF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StoredSettings.h"; path = "../../Source/Settings/jucer_StoredSettings.h"; sourceTree = "SOURCE_ROOT"; };
+ E111A336FE13C033EAA0A1D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewCppFileTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ E13A54A6D3A1895EACE53E51 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceFile.cpp"; path = "../../Source/ProjectSaving/jucer_ResourceFile.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E1535CDF4258E7D4AB70B5E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ClientServerMessages.h"; path = "../../Source/LiveBuildEngine/jucer_ClientServerMessages.h"; sourceTree = "SOURCE_ROOT"; };
+ E1577F8617C75B91D7399812 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ImageButtonHandler.h"; path = "../../Source/ComponentEditor/Components/jucer_ImageButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ E186BC01A1B1529937A46485 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FileHelpers.h"; path = "../../Source/Utility/Helpers/jucer_FileHelpers.h"; sourceTree = "SOURCE_ROOT"; };
+ E266DE67FF319D56F63193A6 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ E2B668E2A65AEE8F07B406C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AppearanceSettings.h"; path = "../../Source/Settings/jucer_AppearanceSettings.h"; sourceTree = "SOURCE_ROOT"; };
+ E367FC2BDAF5EBA48D767FBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePathPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ E3BADF21095BC23DE2CB454F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTreeItemBase.h"; path = "../../Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h"; sourceTree = "SOURCE_ROOT"; };
+ E468FDB5504C5D9315B2D04F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentDocument.h"; path = "../../Source/ComponentEditor/Documents/jucer_ComponentDocument.h"; sourceTree = "SOURCE_ROOT"; };
+ E5D6C36496F5BC84D7213BE8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ E67999BF57B139E00207A374 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PIPTemplate.h"; path = "../../Source/BinaryData/Templates/jucer_PIPTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+ E96597BBC6A98255B51B94DC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ E983E6DDE3318B872EBE347F = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
+ EAC1731150A7F79D59BAA0B6 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "export_visualStudio.svg"; path = "../../Source/BinaryData/Icons/export_visualStudio.svg"; sourceTree = "SOURCE_ROOT"; };
+ EB2E723DC3DB150A8A644D08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GlobalPathsWindowComponent.h"; path = "../../Source/Application/Windows/jucer_GlobalPathsWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ ED5EAC91D8A0A1911BE9F482 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_ConsoleApp.svg"; path = "../../Source/BinaryData/Icons/wizard_ConsoleApp.svg"; sourceTree = "SOURCE_ROOT"; };
+ ED69863B3D591FB3F0CA50E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutineEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ EE690110171E1648FF2118B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Application.h"; path = "../../Source/Application/jucer_Application.h"; sourceTree = "SOURCE_ROOT"; };
+ EF25A29A2194FC107B40F65F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentLayoutEditor.cpp"; path = "../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+ EFF38AE74E7267CCC47E8AD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerDocumentEditor.h"; path = "../../Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ F073B54B36D845915CD6D2C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementEllipse.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h"; sourceTree = "SOURCE_ROOT"; };
+ F159C1B99ACF1D91E12D978E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_NoWindow.cpp"; path = "../../Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+ F2E4998FB2C7221587A79F8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CodeHelpers.cpp"; path = "../../Source/Utility/Helpers/jucer_CodeHelpers.cpp"; sourceTree = "SOURCE_ROOT"; };
+ F3CC8F26ECCDA6DCD8A284D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GradientPointComponent.h"; path = "../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ F4FD9BD16ED2700F45A68C4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentBooleanProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ F5DD97B45B8EA60C1ED0DD80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_StoredSettings.cpp"; path = "../../Source/Settings/jucer_StoredSettings.cpp"; sourceTree = "SOURCE_ROOT"; };
+ F797071D88542C813CF7222A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Module.cpp"; path = "../../Source/Project/jucer_Module.cpp"; sourceTree = "SOURCE_ROOT"; };
+ F7C74E934C954F6F1A3BE4F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationToolWindowComponent.h"; path = "../../Source/Application/Windows/jucer_TranslationToolWindowComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ F8A38C0C7C45F2DB6A5FB812 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_Highlight.svg"; path = "../../Source/BinaryData/Icons/wizard_Highlight.svg"; sourceTree = "SOURCE_ROOT"; };
+ F8F94093A0963D86BD27A95D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DependencyPathPropertyComponent.h"; path = "../../Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ F9111E150CFF155329D44853 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_OpenDocumentManager.cpp"; path = "../../Source/CodeEditor/jucer_OpenDocumentManager.cpp"; sourceTree = "SOURCE_ROOT"; };
+ FA790C59A304579F660F112F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CodeBlocks.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h"; sourceTree = "SOURCE_ROOT"; };
+ FB80347407261BF6CCEFDE91 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTemplate.cpp"; path = "../../Source/BinaryData/Templates/jucer_ComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ FCEBE24EA79A13713D7CBF26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentColourProperty.h"; path = "../../Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h"; sourceTree = "SOURCE_ROOT"; };
+ FE20FE5805A02A4843048200 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjucerLookAndFeel.h"; path = "../../Source/Utility/UI/jucer_ProjucerLookAndFeel.h"; sourceTree = "SOURCE_ROOT"; };
+ FF68231DE2B395461009116C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_MSVC.h"; path = "../../Source/ProjectSaving/jucer_ProjectExport_MSVC.h"; sourceTree = "SOURCE_ROOT"; };
+ FFE01768CF1C8DBDAA894F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutinePanel.cpp"; path = "../../Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp"; sourceTree = "SOURCE_ROOT"; };
+ EB1D55A76652399EB81CC1F0 = {isa = PBXGroup; children = (
+ DE4A987B2D5529990A6AA9D4,
+ B83DAADA1A871F21582FFB23,
+ D91E7F8FEF9290195D56782C,
+ C736264708F3F68BA745BA29,
+ EB2E723DC3DB150A8A644D08,
+ 124232706D1C8A3CA49E70CD,
+ DDC382008FFD9F9E0B2B0EDD,
+ F7C74E934C954F6F1A3BE4F9,
+ 92926A4D3CC4BB2A9D35EB0B, ); name = Windows; sourceTree = "<group>"; };
+ BC67FD952A6F210A11A1ECB8 = {isa = PBXGroup; children = (
+ EB1D55A76652399EB81CC1F0,
+ 7CA44FF0BA319517C6E39651,
+ EE690110171E1648FF2118B8,
+ 0D4D508C638BC74943B9976D,
+ 4D698BF12BCD6B0896BCDF17,
+ 23A8DE16C0CDB8EED18B008B,
+ 0400CB0E056A1D840304D2DE,
+ 2EEB1C074162F363C6599282,
+ 6E6140969908E7619F858740,
+ 3F8EC008960DBEB2A5D3C3F4,
+ 8C52A3DDA62A746AA7A68535,
+ 9069981E414A631B036CC9AC,
+ 2CD34A70B4032C0426F7AA10,
+ B6496F16ACE80CACC5721570,
+ 4818A05DE44ADA03D85E1083, ); name = Application; sourceTree = "<group>"; };
+ 8CF70DA9AB4725126B9F55BE = {isa = PBXGroup; children = (
+ 129F2DE0FEF154F8F8C7A74E,
+ 0B24F292A357ABFD9BCC6D7F,
+ 576A92E1E0D8F453EC0FEB34,
+ 996E472B82A75531875A5E38, ); name = gradle; sourceTree = "<group>"; };
+ F0F189518721D46C0F94FD56 = {isa = PBXGroup; children = (
+ 514F2FAFDBF535AC03FA2E6C,
+ 807049CA2D5B6DE18EA078F2,
+ 56749E4C72A8F51ACA8F2330,
+ 42F4AA3EF0883D506987CA99,
+ 69B478C992FA0B8C885946A6,
+ EAC1731150A7F79D59BAA0B6,
+ 8F4D281E98808204E2846A7D,
+ 194457D806A26E793584AC0C,
+ 432EC251A122071809471804,
+ B83C9BD89F31EA9E5E12A3C6,
+ 8FEF6F5EA676B824C021EB6F,
+ 8FF26BF72A522FBEAAFDDF54,
+ 2072D6BAE744B53B6FBBDDD8,
+ ED5EAC91D8A0A1911BE9F482,
+ AEFE3BA0C31EC78A5767A10E,
+ 5B3532C5F103DAC87B4A5675,
+ F8A38C0C7C45F2DB6A5FB812,
+ B1C2F8ED14BF914CD1882708,
+ 62922B3C0620368D1799A653,
+ D1739728A79A2062418B8EF0, ); name = Icons; sourceTree = "<group>"; };
+ E59ABA0D11CBAAD77179E9C6 = {isa = PBXGroup; children = (
+ 9A3B8BBDA8E144A3DF6B9349,
+ 016A6C52B0B93DE29197FF64,
+ D5795F8CAC5876714DAB355F,
+ D4EB334E5186D1584EC63CA4,
+ 203FA6AD7EDDF1F9C338CC2A,
+ 5BF0374EB908F0476BD8ED42,
+ 6574A50A8997799705B23465,
+ 56177921580A4855917E0205,
+ 079802C6AEE7646010766FE8,
+ CC1C5F8E5DE34223FEC59673,
+ FB80347407261BF6CCEFDE91,
+ 2BD9B4556479A8A41740BCAE,
+ 9E0BA495286388EBF929D578,
+ 8D9A9A373E4621F7CBFCCCEF,
+ 59203884BC48D3B7F8DEABA8,
+ 32C4B61AD995877956B7FA66,
+ A66F17E7472E5C19AFE98E46,
+ F159C1B99ACF1D91E12D978E,
+ 97A847B59EE04483E8850E4B,
+ A160AEF56553A658E6EA6A8E,
+ 8336A43CE1C3C26D7C7B53D8,
+ C7245390C6C44E89F7526CFC,
+ 8F67F3C0492EAFEBDBBC12DB,
+ E111A336FE13C033EAA0A1D1,
+ 9E2B1506AC3FDB7863766D59,
+ C607639897ED2538CBB860D0,
+ 023B92AC0340305762412E90,
+ 3F7C5B53347A487C7FBD2223,
+ 4ECF029E3A69BF42FED1503D,
+ 3DC2ED15A9DFAAEF3D2ACDDF,
+ E67999BF57B139E00207A374, ); name = Templates; sourceTree = "<group>"; };
+ A9399733CAA07BDAB958242C = {isa = PBXGroup; children = (
+ 8CF70DA9AB4725126B9F55BE,
+ F0F189518721D46C0F94FD56,
+ E59ABA0D11CBAAD77179E9C6,
+ 41105E536155E394E54BDD35,
+ 5F6584B675E30761521A9F42,
+ 59B08C7B13B8EA5137ACA77A,
+ 8C281F2F8EA3AD614ADF7955,
+ 4073A12E196BDDADE211E19F,
+ 58139D8D454051C59E77609B, ); name = BinaryData; sourceTree = "<group>"; };
+ F1B44F007A02A0FAE4DC8D79 = {isa = PBXGroup; children = (
+ BC3B310D42C489E8B8D93327,
+ 51BC758EF5D33197CF543E67,
+ 35CAE8930F2885F9322D22D5,
+ 8A82061A978B03745485C3AC,
+ F9111E150CFF155329D44853,
+ 1B5BCD4899A9E295786EB642,
+ 332AF94C3275FEA8B878D603,
+ B9B130F596953116393138DC, ); name = CodeEditor; sourceTree = "<group>"; };
+ 2A1D5A24E950E00CDF969502 = {isa = PBXGroup; children = (
+ 01A37DF94E98D991FEF43628,
+ 409C636B96A9AC1D732B96F8,
+ 9E62EC342665C27BA01AFC1A,
+ 8F731F1F98BAB42F1C3B96AA,
+ 11DEED05110D3D1D02FCFFB6,
+ 0543E83BF7D7D9234C396E82,
+ 630DC5EAA31D3EE60B2D989F,
+ 705DE88C5C4CC6C871E951B1,
+ A49503B646A7BD2BEEFC5CBD,
+ E1577F8617C75B91D7399812,
+ 33B258726F29360D64FD1451,
+ 9F959ECF8CD9B7314AE604A9,
+ 73DE14CEAD25D3445457013E,
+ 0AE75B0ACD368A4C0FBC2CD0,
+ 35CFCC15CBA46F4513940A2A,
+ 868B459E02F0877EBE3D56F1,
+ 8DFE6D8AFB8057790041300B,
+ A22F64D1E4BD4B8FA366DAAD,
+ 055636565C2F512E40114582, ); name = Components; sourceTree = "<group>"; };
+ 18139A4BCB7C14043C72B9E1 = {isa = PBXGroup; children = (
+ BF301C2E545AEB4AC112C176,
+ 9F2D3E5FC10F7C3270908E97,
+ 1DCA18E935A35D29D2D9B6A0,
+ E468FDB5504C5D9315B2D04F, ); name = Documents; sourceTree = "<group>"; };
+ 497FD8DD8175790E4885736B = {isa = PBXGroup; children = (
+ D6390A40B3279E0E626C78D3,
+ 9914F905BFCFBE5F76619670,
+ 8D178CAEE6D89DE33233313F,
+ C402C21DFAC1F8BF121144F1,
+ F3CC8F26ECCDA6DCD8A284D2,
+ 9B6FD3FEDB6D91AD0A80EF97,
+ 512D80BE12634967A085A1DC,
+ 4AE469CD40BDAD634135785E,
+ F073B54B36D845915CD6D2C1,
+ 988F5C1E40DED02D8B064253,
+ BCB6C87E3992930674E54D16,
+ 72ED72174F9DBD0ABD8AFCED,
+ 7031E8CB6D4D84BD980A0BD0,
+ 4AE72953E3B3DF06D3B9BA86,
+ DA4D0CC5149F7C0FBDAF34A2,
+ 355379844A5E6A097038C280,
+ 77EA01E7D04BF889930BFF54,
+ B97D60D2531CFD0D8555BA5C,
+ 36E5FBF64A89D5F2A266A5A7,
+ 7687A1374C60A025BDBE98DE,
+ D93E2F2468003DD333371F06, ); name = PaintElements; sourceTree = "<group>"; };
+ 172E2F5D29A894D0BA9231A9 = {isa = PBXGroup; children = (
+ 7F0A5319912991615FC57945,
+ F4FD9BD16ED2700F45A68C4F,
+ 7E2013F425E231C6D865DDD0,
+ FCEBE24EA79A13713D7CBF26,
+ 5783563E39E48ADFC68EB84A,
+ 2F373F97E30AC1A0BFC1FC61,
+ D045BD5943BD38F2720FF5F0,
+ B2CB95B3F44C3CC5735051A3,
+ 85A5E3E71BED93B9A3E07681, ); name = Properties; sourceTree = "<group>"; };
+ 0565E54C3060E29ED38B65AB = {isa = PBXGroup; children = (
+ EF25A29A2194FC107B40F65F,
+ 5524B5C9FC6AEAA670B92AA9,
+ A0BBBFBA13A1308B3CD725D5,
+ 00E6B87A43453B51850550E1,
+ 9BDF2D6255C1CB2CFF376186,
+ 6F02C3B7FEA3B50692A70DE5,
+ 39597BD78897CB711AFA945A,
+ 4E671236FDBD5AD4699740C6,
+ 351AF80A004D766E314AB76D,
+ EFF38AE74E7267CCC47E8AD1,
+ 6E70C1FA80F02D4C310F63AA,
+ ED69863B3D591FB3F0CA50E4,
+ FFE01768CF1C8DBDAA894F76,
+ 65FAD7F6DF65A72B741C2913,
+ 719B56C8587863D7AE9B69C6,
+ 0EE17BE4154CF1B2EE683894,
+ BDF6AFC5F88581AE395F1DC9,
+ 75BE2887C6F324B818D80A21,
+ 24EB4C2412821B8019D6F754,
+ BC623CC67AC58297BF6B4C70, ); name = UI; sourceTree = "<group>"; };
+ F6BD840F9A06F2DA891E2CB8 = {isa = PBXGroup; children = (
+ 2A1D5A24E950E00CDF969502,
+ 18139A4BCB7C14043C72B9E1,
+ 497FD8DD8175790E4885736B,
+ 172E2F5D29A894D0BA9231A9,
+ 0565E54C3060E29ED38B65AB,
+ 9EF583A6201DBC813C2F63C4,
+ 6AC88EFC247C225CC5C11A43,
+ 133F1E428260C5ADDF496DF9,
+ 3F9D4C7F6E5779D4E4AE655D,
+ 78D0DBC4798FF040FDB90F6D,
+ DA345D5B9DABD049F90DC96F,
+ 269A454F1FF081DA67FFD578,
+ 8F30A53C7FE4BC65171FB3E2,
+ 9D7689451732AF8333402B3A,
+ 50498FF6EA3901CBD58223B3,
+ C187718F7B9EBA88584B43F3,
+ 66B49F08C5EC3E4974825FF8,
+ 5432B7B9B2CF2EAEC8B66D5C, ); name = ComponentEditor; sourceTree = "<group>"; };
+ 144B649D98AE8316058B8281 = {isa = PBXGroup; children = (
+ 51CBE59779A36D1B80B26974,
+ BB187CD608EB6368B29EC335,
+ 790F6302B9A0620F23F8A6C1,
+ 98E6D61BFF7D85F0E00F0FBF, ); name = Licenses; sourceTree = "<group>"; };
+ 9014CA5F3B8D23E883D6975E = {isa = PBXGroup; children = (
+ 2DF5A61F3C497537634773DF,
+ CCEA34A55813C7C4E58254F5,
+ 0640E34282A97BF73CC8F1EB,
+ 3BBFA655E129C2D817EA47C9, ); name = UI; sourceTree = "<group>"; };
+ 20B39D53B7DAAB53C7533532 = {isa = PBXGroup; children = (
+ 9014CA5F3B8D23E883D6975E,
+ 245C81599FB53865A74FC65B,
+ D251114072E67CA86D9913D6,
+ E1535CDF4258E7D4AB70B5E5,
+ DE3E6B2614229FAD56D50770,
+ 308084CBEE9F7D405D72A5E1,
+ A978DFE87D9BB5EFE5B3DAAC,
+ D2FE76E4CF003856278343CC,
+ BA186B51EE4884CD8E3F2741,
+ A081306A9E95CA114B81910F,
+ ADD6A3CF5D7DE55E57E8E38B,
+ A9954DC7F876A7006743ACB6,
+ ADA538034910F52FDD2DC88D,
+ 8F685EFEFD6EE399058DE842,
+ 159DE1FEE2099398983CDDF0,
+ B24E3F34C3C4EE54A60C35CC,
+ 55DEDCEB35AA1FB54C74B375,
+ 3EA27F52A254912218F4DE94,
+ 182CB1F96890620A202C6524, ); name = LiveBuildEngine; sourceTree = "<group>"; };
+ 236D186F5A6536C59D6E751C = {isa = PBXGroup; children = (
+ 861E52D9AFECADF079BB1F2C,
+ 4974E7808F9B57E9A627F878,
+ 68C1949F56295D5871C1F223,
+ 5E4EB84A7983AB31366A3490,
+ 1C80C7672975C1FF9AAC4A4F,
+ E3BADF21095BC23DE2CB454F,
+ 95EAB6EC9B724538B93910D4,
+ 68F41A216E7454E7442AB1F4, ); name = Sidebar; sourceTree = "<group>"; };
+ EBC037ECAAC8156B8B19DC69 = {isa = PBXGroup; children = (
+ 236D186F5A6536C59D6E751C,
+ 32ECBC08D903418CA0825870,
+ A509BC22854D50E4C786EB32,
+ 516D6D7C564DD5DF5C15CB06,
+ 16751E04B0F3737BDF52CEB4,
+ B3528C08B84CBC950252EA69,
+ 1B0F18E1D96F727C062B05FA,
+ 92A66A8BD87F98EB6B4FB6D0, ); name = UI; sourceTree = "<group>"; };
+ 89E9055A179B4C2019B4E1AE = {isa = PBXGroup; children = (
+ EBC037ECAAC8156B8B19DC69,
+ F797071D88542C813CF7222A,
+ 7211101FFA28400ADBB1D47A,
+ BAC43B20E14A340CCF14119C,
+ BF3CEF080FA013E2778DCE90,
+ B8385E9A644BD3CD94876448, ); name = Project; sourceTree = "<group>"; };
+ 4DCC5D64BBE8DE85360A3D57 = {isa = PBXGroup; children = (
+ CCD62DB0A19A985A4B9D7F32,
+ D5EF5961B1F0E3FAED32E30A,
+ FA790C59A304579F660F112F,
+ 59520B8137E6A2E483074399,
+ FF68231DE2B395461009116C,
+ 20075A86A4D0E8A5B973D9DB,
+ C3BB9F92B02B06D04A73794C,
+ 8DBB36126CD144A8364F1F19,
+ 4FF81FC167C924C47BD8C1C9,
+ 9EE3141E20C9CE3EA182FA04,
+ E13A54A6D3A1895EACE53E51,
+ 25BE1265FE6C6EA3473A3A0A, ); name = ProjectSaving; sourceTree = "<group>"; };
+ EC535A977A1A114BC5DAE7B3 = {isa = PBXGroup; children = (
+ BE618CE21C794BDEE319E328,
+ E2B668E2A65AEE8F07B406C8,
+ F5DD97B45B8EA60C1ED0DD80,
+ DFBEB8E086832AEB0FBEADF0, ); name = Settings; sourceTree = "<group>"; };
+ AA2CBF47682AE479C1A387BE = {isa = PBXGroup; children = (
+ F2E4998FB2C7221587A79F8B,
+ 23D79A22569BEDF63B57DD36,
+ C3E04CD5A93A45154894E624,
+ B403AF75EAF361ED74EE476E,
+ E186BC01A1B1529937A46485,
+ 486E8D02DAD2A0BF54A901C0,
+ 983CFBA01CA8811F30FA7F4C,
+ 58F1FF52E887887A93E84FC2,
+ A6C4AE13FB409DE414094CFA,
+ 6FD8DBC0FF42C87D8BEE2452,
+ 00515BA4EC5A7D4DC078ED37, ); name = Helpers; sourceTree = "<group>"; };
+ B4972C4048154E5E783D3934 = {isa = PBXGroup; children = (
+ 191330B20DAC08B890656EA0,
+ C76271530EB4458B6146D463, ); name = PIPs; sourceTree = "<group>"; };
+ 15F56361B9CF3E0BE705E64D = {isa = PBXGroup; children = (
+ 9EB33734D0DBD0370AB1247B,
+ D859E9EA11A71BD6E85DC649,
+ F8F94093A0963D86BD27A95D,
+ E367FC2BDAF5EBA48D767FBB,
+ 59F8A47C0020D62C8836A1E7, ); name = PropertyComponents; sourceTree = "<group>"; };
+ DD068F16F341D15E150CE6F1 = {isa = PBXGroup; children = (
+ 15F56361B9CF3E0BE705E64D,
+ 169DD91232C070C4D6470B31,
+ 846B2A670C5A19DE0039E11A,
+ C59E624F099CC785F27429EB,
+ 4D5F0CA8D1273144681A1D48,
+ 00841B7EDDE9C19890F03267,
+ 0F8C000E5FF4A2DAC1FEF8EB,
+ FE20FE5805A02A4843048200,
+ 0CECD562059DFD7FBFB37E3C,
+ 3D6FD9C0065BF16568EC0AB7,
+ 28D0199327887FFABF9C3F20, ); name = UI; sourceTree = "<group>"; };
+ 2B1F885AA027E1A76A1C32E3 = {isa = PBXGroup; children = (
+ AA2CBF47682AE479C1A387BE,
+ B4972C4048154E5E783D3934,
+ DD068F16F341D15E150CE6F1, ); name = Utility; sourceTree = "<group>"; };
+ 73BAA89A783BBDD79AA27964 = {isa = PBXGroup; children = (
+ A69024A225F2AC31F17B1314,
+ 11DC04468BC6023671017EBF,
+ 087CB3A961CD3C7434D660A4,
+ 4B083E951ECB62217C46CB01,
+ C2990A8D054BC230E7C637C3,
+ 8BD8E9DA627D6EF9BA10FB9E,
+ 3C95FA2AA91EBA19ADDD5C29,
+ 8A825FDDC00DD253F44D2C3A,
+ 4A4EBDAD8D098F72CE053235,
+ 0F01067432AC314EAC213C1C,
+ A44A774EFC020D3D046A9249,
+ 9992E6950C64322A11E39ADF,
+ 05D67B5A8D64947C067C0945,
+ A085174413736ACC8D7D42A2,
+ 471C7B0A8B92320AF0C80839,
+ 714267352CE5C4357ADBC231,
+ C09BBB58CA45B66D693E8C31, ); name = Wizards; sourceTree = "<group>"; };
+ D3109994DA6AD871BE85C4E2 = {isa = PBXGroup; children = (
+ BC67FD952A6F210A11A1ECB8,
+ A9399733CAA07BDAB958242C,
+ F1B44F007A02A0FAE4DC8D79,
+ F6BD840F9A06F2DA891E2CB8,
+ 144B649D98AE8316058B8281,
+ 20B39D53B7DAAB53C7533532,
+ 89E9055A179B4C2019B4E1AE,
+ 4DCC5D64BBE8DE85360A3D57,
+ EC535A977A1A114BC5DAE7B3,
+ 2B1F885AA027E1A76A1C32E3,
+ 73BAA89A783BBDD79AA27964, ); name = Projucer; sourceTree = "<group>"; };
+ 8A24D1B6925535A868974986 = {isa = PBXGroup; children = (
+ 58DE91CE6B05AFBACADDB251,
+ BA159A3B7D129771F5C15EA3,
+ AA1C44E89D792DDC4867B2C8,
+ 69555CEFC6ED613AA3949298,
+ 21F4833C5B5C17B159B956F3,
+ B6F2905330EA5C560D527209,
+ 7AB7640968FAAC73072FBD10,
+ D05BD91B6105827B010E1C20, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 2C6746F66EF4444F53B3221F = {isa = PBXGroup; children = (
+ 8702F43110E4CCA5E5F827F5,
+ 472F9A90F685220D730EBF6C,
+ 4F687965FBE86EAFDB3ACFEC,
+ 805A3A5FBA3B9E28363DD77B,
+ DB9C8E35DF815B803CB4A9CF,
+ D766BB9D8C32B5560F0493F3,
+ 1DE5BBC777FB64798D823002,
+ 5867DC4E39DF8539B54C0D59,
+ 1B9B5A37F079FE3B3CF8FAB6,
+ 0462692BAA9CD1BE6DFBCC33,
+ AECE3914F5119A3D586A5635,
+ 364D1A9B113320407A7E57B9, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ 8180B5894A78501084B8F133 = {isa = PBXGroup; children = (
+ E266DE67FF319D56F63193A6,
+ 6678E9B3EEACAD47F438B264,
+ 951128CA33CCDEF570436B1C, ); name = Resources; sourceTree = "<group>"; };
+ 0FFEF043CA89142B18C79ABE = {isa = PBXGroup; children = (
+ 80D62B907248523E6943298B,
+ 5A75806B34E4EA6598A6024A,
+ 7B3F7ECF6DBF8C8EE5C2CB86,
+ 210CD22F25F2C22F9CEEB025,
+ D00F311BFC3C2625C457CB9B,
+ D1F9B0E9F5D54FE48BEB46EA,
+ 728FE25157E9874D50BBECB2,
+ E983E6DDE3318B872EBE347F,
+ 8F7BE18698ADCEF51CDE4A5C,
+ 842427CFE565F3FCE5B99174,
+ E96597BBC6A98255B51B94DC,
+ 431D30038CBF67F80E8B3A13,
+ 9F01BA9942D038EA8B5289A8,
+ E5D6C36496F5BC84D7213BE8,
+ CF6C8BD0DA3D8CD4E99EBADA, ); name = Frameworks; sourceTree = "<group>"; };
+ 92ABB8016546F41128399E9D = {isa = PBXGroup; children = (
+ 09DE066936CF037E9709ADB1, ); name = Products; sourceTree = "<group>"; };
+ 3CC531922CC2D398E283A845 = {isa = PBXGroup; children = (
+ D3109994DA6AD871BE85C4E2,
+ 8A24D1B6925535A868974986,
+ 2C6746F66EF4444F53B3221F,
+ 8180B5894A78501084B8F133,
+ 0FFEF043CA89142B18C79ABE,
+ 92ABB8016546F41128399E9D, ); name = Source; sourceTree = "<group>"; };
+ 0CC6C439D038EDA0D7F10DF0 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++11";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"_DEBUG=1",
"DEBUG=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
- PRODUCT_NAME = "Projucer";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 0BC15DC2E5FE5ECFFB398D49 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 0BC15DC2E5FE5ECFFB398D49 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++11";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"_NDEBUG=1",
"NDEBUG=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
- "JUCE_APP_VERSION=5.4.1",
- "JUCE_APP_VERSION_HEX=0x50401",
+ "JUCE_APP_VERSION=5.3.2",
+ "JUCE_APP_VERSION_HEX=0x50302",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
- PRODUCT_NAME = "Projucer";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- C42924A24AB55E6A940423EA = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ C42924A24AB55E6A940423EA = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "Projucer";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- 70135D15D7E0D8410C42BBA3 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ 70135D15D7E0D8410C42BBA3 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "Projucer";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 50E3FDD15B8D8C9793DFABF9 = {
- isa = PBXTargetDependency;
- target = 0039FE1A254FE518518BF8B8;
- };
- F90407F24422C589DA251604 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C42924A24AB55E6A940423EA,
- 70135D15D7E0D8410C42BBA3,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 0655A4A348F7F91F77583ADC = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 0CC6C439D038EDA0D7F10DF0,
- 0BC15DC2E5FE5ECFFB398D49,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C262D0F297DDE25326F5AC81 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2610F357881240ACBF612F48,
- 1321E6C1C6170B6C898AD09D,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5CB869A8DA78BE6FA2757034 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 6DD9DA1677A6CF789CDAB478,
- 954A036F5DDB375DB23FFB3E,
- 95B44E6C74B1DED31DBE37EB,
- AA9D0B8E23F3D87A23DE9F8A,
- 98F9BB4612E82EE59689E15C,
- 09C4EDDF7F8B6E75EA3CE3A9,
- 71713DE4716DCEDB45A206E2,
- 940CE4E081E9E685243C07AA,
- 49EEEA5B74D38F3C5A8794F1,
- 6FD9428439B572B558EF64EA,
- 6EAAAAB0C2B2DA259B26D63C,
- 4C0F95265A230E5A8717A0A9,
- FFA8B18CDF2D2AA500698A96,
- EE26A1C2DAAB609362F407EA,
- 4FAAB649E846BA2764C02ACE,
- 7D750EF5FCE1E1A461D435BE,
- 537ABF1DB09DDBD1542A2B0C,
- 290F2CD930097091B8DB122E,
- 4B2F2DAA45060D3F250D0AE4,
- BDD30804C9424526A1122A28,
- 37D582DA2227E004BFA237EC,
- 9B8ED9D50406E5D75DEE57F5,
- 89116B0BD882B51C63A84425,
- 63D97E01F2C4C91037CB65BD,
- 45A53AF13B0D663050632E8C,
- C2A85091A28C907A4E1E1687,
- 83431B7234A78ECFB3C15F63,
- 209FCCC2155A1FCB7E11E20D,
- C93569F47B4AC1A8E37992ED,
- 1B988E139004D8E2850EB656,
- 6FD0752A5CADCF60D79FDBB7,
- D25EBE02B55DB244BE0D5635,
- 85E7FCB0516EFF853FA7B380,
- CC6C4D351BA9B473E5F95791,
- 05A08E366EBF8D650974E695,
- 3FCA61C401007B243E2E9035,
- 30B921C38DCEE787B294B746,
- 244567D3AE2E417A8CB2B95E,
- 26D6AEA321E80ABCC3CCCCD1,
- 4E6DC4778D583C48C3CCD4DC,
- EE722B47BC36CC8A87E0FB76,
- 2DF375B40A64BB3778F7ABD1,
- 8BE478303CDF061B72F219E2,
- BF913199032B4CE970E82AA3,
- 25EF9B3FECB4C9F0F522DCAA,
- 638C7247B6DBA67EFE46E124,
- D0E26EB54B0087C8BE3D541E,
- 468548FB21D264DC12321327,
- 6ECB2F11D2F593FACCCF99DB,
- 95F56FB44C669F93AE77E465,
- 518DD443B6F17A5AFD707263,
- B7EBA1A83575F48CD08140B9,
- 3C5267E06A897B0DC0F7EA50,
- 202DC8CF15ACBE096CC327EA,
- 5DD883699B85E4C492CAD065,
- D5C9125F65493CA481F18E53,
- 02E8F35A8E0D4A0DF6F38D60,
- 234B6BA2952CBC7C61EF70EF,
- 254A7C08594A152C2C646334,
- F15F0512666FF8CDC0D08905,
- B18248959DDC44EF4E85320A,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D150288A32EE596408C2B99F = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A578EAD4BB55680E8097BE0F,
- C1B9334AE849F93FB3C56B34,
- 8B4A593B3869815BBAC3EF93,
- A14C2C2725DA3CA7995D2815,
- 1E76E36772355E2A43CF4961,
- 241F29FCBB7A17BB44A0B10C,
- 9359F9401D59B4517F75C39C,
- 091A57B4B9CE623E75E9A756,
- FAB47E69F7D9DCE1F906AA07,
- 0E884E47A637D6C65154699A,
- 49C22786B54C5DC94E4654B8,
- CDEF9FF2D119476D707305DF,
- 96EC6315E1B3F1A109F84BAF,
- 11D42F7EC6E6539D79A7F4B1,
- B980464FA2761CCD64B1FAD6,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0039FE1A254FE518518BF8B8 = {
- isa = PBXNativeTarget;
- buildConfigurationList = 0655A4A348F7F91F77583ADC;
- buildPhases = (
- C262D0F297DDE25326F5AC81,
- 5CB869A8DA78BE6FA2757034,
- D150288A32EE596408C2B99F,
- );
- buildRules = ( );
- dependencies = ( );
- name = "Projucer - App";
- productName = Projucer;
- productReference = 09DE066936CF037E9709ADB1;
- productType = "com.apple.product-type.application";
- };
- 74EA481348A24104E6ACE009 = {
- isa = PBXProject;
- buildConfigurationList = F90407F24422C589DA251604;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 3CC531922CC2D398E283A845;
- projectDirPath = "";
- projectRoot = "";
- targets = (0039FE1A254FE518518BF8B8);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ 50E3FDD15B8D8C9793DFABF9 = {isa = PBXTargetDependency; target = 0039FE1A254FE518518BF8B8; };
+ F90407F24422C589DA251604 = {isa = XCConfigurationList; buildConfigurations = (
+ C42924A24AB55E6A940423EA,
+ 70135D15D7E0D8410C42BBA3, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 0655A4A348F7F91F77583ADC = {isa = XCConfigurationList; buildConfigurations = (
+ 0CC6C439D038EDA0D7F10DF0,
+ 0BC15DC2E5FE5ECFFB398D49, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ C262D0F297DDE25326F5AC81 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 2610F357881240ACBF612F48,
+ 1321E6C1C6170B6C898AD09D, ); runOnlyForDeploymentPostprocessing = 0; };
+ 5CB869A8DA78BE6FA2757034 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 6DD9DA1677A6CF789CDAB478,
+ 954A036F5DDB375DB23FFB3E,
+ 95B44E6C74B1DED31DBE37EB,
+ AA9D0B8E23F3D87A23DE9F8A,
+ 98F9BB4612E82EE59689E15C,
+ 09C4EDDF7F8B6E75EA3CE3A9,
+ 71713DE4716DCEDB45A206E2,
+ 940CE4E081E9E685243C07AA,
+ 49EEEA5B74D38F3C5A8794F1,
+ 6FD9428439B572B558EF64EA,
+ 6EAAAAB0C2B2DA259B26D63C,
+ 4C0F95265A230E5A8717A0A9,
+ FFA8B18CDF2D2AA500698A96,
+ EE26A1C2DAAB609362F407EA,
+ 4FAAB649E846BA2764C02ACE,
+ 7D750EF5FCE1E1A461D435BE,
+ 537ABF1DB09DDBD1542A2B0C,
+ 290F2CD930097091B8DB122E,
+ 4B2F2DAA45060D3F250D0AE4,
+ BDD30804C9424526A1122A28,
+ 37D582DA2227E004BFA237EC,
+ 9B8ED9D50406E5D75DEE57F5,
+ 89116B0BD882B51C63A84425,
+ 63D97E01F2C4C91037CB65BD,
+ 45A53AF13B0D663050632E8C,
+ C2A85091A28C907A4E1E1687,
+ 83431B7234A78ECFB3C15F63,
+ 209FCCC2155A1FCB7E11E20D,
+ C93569F47B4AC1A8E37992ED,
+ 1B988E139004D8E2850EB656,
+ 6FD0752A5CADCF60D79FDBB7,
+ D25EBE02B55DB244BE0D5635,
+ 85E7FCB0516EFF853FA7B380,
+ CC6C4D351BA9B473E5F95791,
+ 05A08E366EBF8D650974E695,
+ 3FCA61C401007B243E2E9035,
+ 30B921C38DCEE787B294B746,
+ 244567D3AE2E417A8CB2B95E,
+ 26D6AEA321E80ABCC3CCCCD1,
+ 4E6DC4778D583C48C3CCD4DC,
+ EE722B47BC36CC8A87E0FB76,
+ 2DF375B40A64BB3778F7ABD1,
+ 8BE478303CDF061B72F219E2,
+ BF913199032B4CE970E82AA3,
+ 25EF9B3FECB4C9F0F522DCAA,
+ 638C7247B6DBA67EFE46E124,
+ 2BEC1197D981951D8A897F01,
+ D0E26EB54B0087C8BE3D541E,
+ 468548FB21D264DC12321327,
+ 6ECB2F11D2F593FACCCF99DB,
+ 95F56FB44C669F93AE77E465,
+ 518DD443B6F17A5AFD707263,
+ B7EBA1A83575F48CD08140B9,
+ 3C5267E06A897B0DC0F7EA50,
+ 202DC8CF15ACBE096CC327EA,
+ 5DD883699B85E4C492CAD065,
+ D5C9125F65493CA481F18E53,
+ 02E8F35A8E0D4A0DF6F38D60,
+ 234B6BA2952CBC7C61EF70EF,
+ 254A7C08594A152C2C646334,
+ F15F0512666FF8CDC0D08905,
+ B18248959DDC44EF4E85320A, ); runOnlyForDeploymentPostprocessing = 0; };
+ D150288A32EE596408C2B99F = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ A578EAD4BB55680E8097BE0F,
+ C1B9334AE849F93FB3C56B34,
+ 8B4A593B3869815BBAC3EF93,
+ A14C2C2725DA3CA7995D2815,
+ 1E76E36772355E2A43CF4961,
+ 241F29FCBB7A17BB44A0B10C,
+ 9359F9401D59B4517F75C39C,
+ 091A57B4B9CE623E75E9A756,
+ FAB47E69F7D9DCE1F906AA07,
+ 0E884E47A637D6C65154699A,
+ 49C22786B54C5DC94E4654B8,
+ CDEF9FF2D119476D707305DF,
+ 96EC6315E1B3F1A109F84BAF,
+ 11D42F7EC6E6539D79A7F4B1,
+ B980464FA2761CCD64B1FAD6, ); runOnlyForDeploymentPostprocessing = 0; };
+ 0039FE1A254FE518518BF8B8 = {isa = PBXNativeTarget; buildConfigurationList = 0655A4A348F7F91F77583ADC; buildPhases = (
+ C262D0F297DDE25326F5AC81,
+ 5CB869A8DA78BE6FA2757034,
+ D150288A32EE596408C2B99F, ); buildRules = ( ); dependencies = ( ); name = "Projucer - App"; productName = Projucer; productReference = 09DE066936CF037E9709ADB1; productType = "com.apple.product-type.application"; };
+ 74EA481348A24104E6ACE009 = {isa = PBXProject; buildConfigurationList = F90407F24422C589DA251604; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 3CC531922CC2D398E283A845; projectDirPath = ""; projectRoot = ""; targets = (0039FE1A254FE518518BF8B8); };
};
rootObject = 74EA481348A24104E6ACE009;
}
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v120</PlatformToolset>\r
+ <PlatformToolset>v120</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v120</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
<None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
<Filter>Projucer\Utility\PIPs</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+ <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
<Filter>Projucer\Utility\UI</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
<Filter>Projucer\ProjectSaving</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
- <Filter>Projucer\ProjectSaving</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
<Filter>Projucer\Settings</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
<Filter>Projucer\BinaryData\Icons</Filter>\r
</None>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
- <Filter>Projucer\BinaryData\Templates</Filter>\r
- </None>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
<Filter>Projucer\BinaryData</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "ROLI Ltd.\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v140</PlatformToolset>\r
+ <PlatformToolset>v140</PlatformToolset>\r
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
<None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
<Filter>Projucer\Utility\PIPs</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+ <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
<Filter>Projucer\Utility\UI</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
<Filter>Projucer\ProjectSaving</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
- <Filter>Projucer\ProjectSaving</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
<Filter>Projucer\Settings</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
<Filter>Projucer\BinaryData\Icons</Filter>\r
</None>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
- <Filter>Projucer\BinaryData\Templates</Filter>\r
- </None>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
<Filter>Projucer\BinaryData</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "ROLI Ltd.\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{E4CFCE31-1AF5-C360-751D-9682E333BE4D}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\App\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Projucer</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.4.1;JUCE_APP_VERSION_HEX=0x50401;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=5.3.2;JUCE_APP_VERSION_HEX=0x50302;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ResourceCompile>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_FileHelpers.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\Helpers\jucer_MiscUtilities.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp"/>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_JucerTreeViewBase.cpp"/>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_ProjucerLookAndFeel.cpp"/>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectExporter.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ProjectSaver.h"/>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h"/>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h"/>\r
<ClInclude Include="..\..\Source\Settings\jucer_StoredSettings.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_CodeHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
<ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h"/>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_IconButton.h"/>\r
<ClInclude Include="..\..\Source\Utility\UI\jucer_Icons.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_Openfile.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_OpenGL.svg"/>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg"/>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml"/>\r
<None Include="..\..\Source\BinaryData\colourscheme_light.xml"/>\r
<None Include="..\..\Source\BinaryData\nothingtoseehere.txt"/>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.cpp">\r
<Filter>Projucer\Utility\PIPs</Filter>\r
</ClCompile>\r
+ <ClCompile Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.cpp">\r
+ <Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
+ </ClCompile>\r
<ClCompile Include="..\..\Source\Utility\UI\jucer_Icons.cpp">\r
<Filter>Projucer\Utility\UI</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\Source\ProjectSaving\jucer_ResourceFile.h">\r
<Filter>Projucer\ProjectSaving</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\ProjectSaving\jucer_XcodeProjectParser.h">\r
- <Filter>Projucer\ProjectSaving</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\Source\Settings\jucer_AppearanceSettings.h">\r
<Filter>Projucer\Settings</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_DependencyPathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_LabelPropertyComponent.h">\r
+ <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_FilePathPropertyComponent.h">\r
<Filter>Projucer\Utility\UI\PropertyComponents</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_PropertyComponentsWithEnablement.h">\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<None Include="..\..\Source\BinaryData\Icons\wizard_StaticLibrary.svg">\r
<Filter>Projucer\BinaryData\Icons</Filter>\r
</None>\r
- <None Include="..\..\Source\BinaryData\Templates\jucer_UnityPluginGUIScript.cs">\r
- <Filter>Projucer\BinaryData\Templates</Filter>\r
- </None>\r
<None Include="..\..\Source\BinaryData\colourscheme_dark.xml">\r
<Filter>Projucer\BinaryData</Filter>\r
</None>\r
#include <windows.h>\r
\r
VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION 5,4,1,0\r
+FILEVERSION 5,3,2,0\r
BEGIN\r
BLOCK "StringFileInfo"\r
BEGIN\r
VALUE "CompanyName", "ROLI Ltd.\0"\r
VALUE "LegalCopyright", "ROLI Ltd.\0"\r
VALUE "FileDescription", "Projucer\0"\r
- VALUE "FileVersion", "5.4.1\0"\r
+ VALUE "FileVersion", "5.3.2\0"\r
VALUE "ProductName", "Projucer\0"\r
- VALUE "ProductVersion", "5.4.1\0"\r
+ VALUE "ProductVersion", "5.3.2\0"\r
END\r
END\r
\r
\r
// BEGIN SECTION A\r
\r
-#ifndef JUCER_ENABLE_GPL_MODE\r
- #define JUCER_ENABLE_GPL_MODE 0\r
-#endif\r
+#define JUCER_ENABLE_GPL_MODE 0\r
\r
// END SECTION A\r
\r
#define JUCE_USE_CURL 1\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
\r
#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES\r
- #define JUCE_ALLOW_STATIC_NULL_VARIABLES 0\r
-#endif\r
-\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define JUCE_STRICT_REFCOUNTEDPOINTER 1\r
+ //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
//==============================================================================\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
//#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0\r
#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
" {\r\n"\r
" setUsingNativeTitleBar (true);\r\n"\r
" setContentOwned (new %%content_component_class%%(), true);\r\n"\r
-"\r\n"\r
-" #if JUCE_IOS || JUCE_ANDROID\r\n"\r
-" setFullScreen (true);\r\n"\r
-" #else\r\n"\r
" setResizable (true, true);\r\n"\r
-" centreWithSize (getWidth(), getHeight());\r\n"\r
-" #endif\r\n"\r
"\r\n"\r
+" centreWithSize (getWidth(), getHeight());\r\n"\r
" setVisible (true);\r\n"\r
" }\r\n"\r
"\r\n"\r
" setUsingNativeTitleBar (true);\r\n"\r
" setContentOwned (new %%content_component_class%%(), true);\r\n"\r
"\r\n"\r
-" #if JUCE_IOS || JUCE_ANDROID\r\n"\r
-" setFullScreen (true);\r\n"\r
-" #else\r\n"\r
-" setResizable (true, true);\r\n"\r
" centreWithSize (getWidth(), getHeight());\r\n"\r
-" #endif\r\n"\r
-"\r\n"\r
" setVisible (true);\r\n"\r
" }\r\n"\r
"\r\n"\r
\r
const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_54;\r
\r
-//================== jucer_UnityPluginGUIScript.cs ==================\r
-static const unsigned char temp_binary_data_55[] =\r
-"#if UNITY_EDITOR\n"\r
-"\n"\r
-"using UnityEditor;\n"\r
-"using UnityEngine;\n"\r
-"\n"\r
-"using System.Collections.Generic;\n"\r
-"using System.Runtime.InteropServices;\n"\r
-"\n"\r
-"public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI\n"\r
-"{\n"\r
-" public override string Name { get { return \"%%plugin_name%%\"; } }\n"\r
-" public override string Description { get { return \"%%plugin_description%%\"; } }\n"\r
-" public override string Vendor { get { return \"%%plugin_vendor%%\"; } }\n"\r
-"\n"\r
-" //==============================================================================\n"\r
-"\t[DllImport(\"%%plugin_name%%\")] static extern System.IntPtr getRenderCallback();\n"\r
-"\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height);\n"\r
-"\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button);\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button);\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unityMouseUp (int id, float x, float y, EventModifiers mods);\n"\r
-"\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name);\n"\r
-"\n"\r
-" [DllImport(\"%%plugin_name%%\")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h);\n"\r
-"\n"\r
-" //==============================================================================\n"\r
-" private class PluginGUIInstance\n"\r
-" {\n"\r
-" public PluginGUIInstance (ref IAudioEffectPlugin plugin, int id)\n"\r
-" {\n"\r
-" instanceID = id;\n"\r
-"\n"\r
-" float[] arr;\n"\r
-" plugin.GetFloatBuffer (\"Editor\", out arr, 1);\n"\r
-" hasEditor = (arr[0] > 0.0f);\n"\r
-" }\n"\r
-"\n"\r
-" public void repaint (Rect r)\n"\r
-" { \n"\r
-" Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position);\n"\r
-"\n"\r
-" if (bounds != r \n"\r
-" || screenPosition != newScreenPosition)\n"\r
-" {\n"\r
-" screenPosition = newScreenPosition;\n"\r
-" bounds = r;\n"\r
-"\n"\r
-" unitySetScreenBounds (instanceID, screenPosition.x, screenPosition.y, bounds.width, bounds.height);\n"\r
-" setupTexture();\n"\r
-" }\n"\r
-"\n"\r
-"\t\t\tGL.IssuePluginEvent (getRenderCallback(), instanceID);\n"\r
-"\n"\r
-" texture.SetPixels32 (pixels);\n"\r
-" texture.Apply();\n"\r
-"\n"\r
-" EditorGUI.DrawPreviewTexture (bounds, texture);\n"\r
-" }\n"\r
-"\n"\r
-" public bool handleMouseEvent (EventType eventType)\n"\r
-" {\n"\r
-" Vector2 mousePos = Event.current.mousePosition;\n"\r
-" EventModifiers mods = Event.current.modifiers;\n"\r
-"\n"\r
-" if (! bounds.Contains (mousePos))\n"\r
-" return false;\n"\r
-"\n"\r
-" Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y);\n"\r
-"\n"\r
-" if (eventType == EventType.MouseDown) \n"\r
-" {\n"\r
-" unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);\n"\r
-" GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive);\n"\r
-" }\n"\r
-" else if (eventType == EventType.MouseUp)\n"\r
-" {\n"\r
-" unityMouseUp (instanceID, relativePos.x, relativePos.y, mods);\n"\r
-" GUIUtility.hotControl = 0;\n"\r
-" }\n"\r
-" else if (eventType == EventType.MouseDrag) \n"\r
-" {\n"\r
-" unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);\n"\r
-" }\n"\r
-"\n"\r
-" Event.current.Use();\n"\r
-"\n"\r
-" return true;\n"\r
-" }\n"\r
-"\n"\r
-" public void handleKeyEvent (EventType eventType)\n"\r
-" {\n"\r
-" if (eventType == EventType.KeyDown)\n"\r
-" {\n"\r
-" KeyCode code = Event.current.keyCode;\n"\r
-"\n"\r
-" if (code == KeyCode.None)\n"\r
-" return;\n"\r
-"\n"\r
-" EventModifiers mods = Event.current.modifiers;\n"\r
-"\n"\r
-" unityKeyEvent (instanceID, code, mods, code.ToString());\n"\r
-" }\n"\r
-" }\n"\r
-"\n"\r
-" private void setupTexture()\n"\r
-" {\n"\r
-" if (pixelHandle.IsAllocated)\n"\r
-" pixelHandle.Free();\n"\r
-"\n"\r
-" texture = new Texture2D ((int) bounds.width, (int) bounds.height, TextureFormat.ARGB32, false);\n"\r
-"\n"\r
-" pixels = texture.GetPixels32();\n"\r
-" pixelHandle = GCHandle.Alloc (pixels, GCHandleType.Pinned);\n"\r
-"\n"\r
-" unityInitialiseTexture (instanceID, pixelHandle.AddrOfPinnedObject(), texture.width, texture.height);\n"\r
-" }\n"\r
-"\n"\r
-" public int instanceID = -1;\n"\r
-" public bool hasEditor;\n"\r
-"\n"\r
-" private Vector2 screenPosition;\n"\r
-" private Rect bounds;\n"\r
-"\n"\r
-" private Texture2D texture;\n"\r
-" private Color32[] pixels;\n"\r
-" private GCHandle pixelHandle;\n"\r
-" }\n"\r
-" List<PluginGUIInstance> guis = new List<PluginGUIInstance>();\n"\r
-"\n"\r
-" private PluginGUIInstance getGUIInstanceForPlugin (ref IAudioEffectPlugin plugin)\n"\r
-" {\n"\r
-" float[] idArray;\n"\r
-" plugin.GetFloatBuffer (\"ID\", out idArray, 1);\n"\r
-"\n"\r
-" int id = (int) idArray[0];\n"\r
-"\n"\r
-" for (int i = 0; i < guis.Count; ++i)\n"\r
-" {\n"\r
-" if (guis[i].instanceID == id)\n"\r
-" return guis[i];\n"\r
-" }\n"\r
-"\n"\r
-" PluginGUIInstance newInstance = new PluginGUIInstance (ref plugin, id);\n"\r
-" guis.Add (newInstance);\n"\r
-"\n"\r
-" return guis[guis.Count - 1];\n"\r
-" }\n"\r
-"\n"\r
-" //==============================================================================\n"\r
-" public override bool OnGUI (IAudioEffectPlugin plugin)\n"\r
-" {\n"\r
-" PluginGUIInstance guiInstance = getGUIInstanceForPlugin (ref plugin);\n"\r
-"\n"\r
-" if (! guiInstance.hasEditor)\n"\r
-" return true;\n"\r
-"\n"\r
-" float[] arr;\n"\r
-" plugin.GetFloatBuffer (\"Size\", out arr, 6);\n"\r
-"\n"\r
-" Rect r = GUILayoutUtility.GetRect (arr[0], arr[1],\n"\r
-" new GUILayoutOption[] { GUILayout.MinWidth (arr[2]), GUILayout.MinHeight (arr[3]),\n"\r
-" GUILayout.MaxWidth (arr[4]), GUILayout.MaxHeight (arr[5]) });\n"\r
-"\n"\r
-" int controlID = GUIUtility.GetControlID (FocusType.Passive);\n"\r
-" Event currentEvent = Event.current;\n"\r
-" EventType currentEventType = currentEvent.GetTypeForControl (controlID);\n"\r
-"\n"\r
-" if (currentEventType == EventType.Repaint)\n"\r
-" guiInstance.repaint (r);\n"\r
-" else if (currentEvent.isMouse)\n"\r
-" guiInstance.handleMouseEvent (currentEventType);\n"\r
-" else if (currentEvent.isKey)\n"\r
-" guiInstance.handleKeyEvent (currentEventType);\n"\r
-"\n"\r
-" return false;\n"\r
-" }\n"\r
-"}\n"\r
-"\n"\r
-"#endif\n";\r
-\r
-const char* jucer_UnityPluginGUIScript_cs = (const char*) temp_binary_data_55;\r
-\r
//================== colourscheme_dark.xml ==================\r
-static const unsigned char temp_binary_data_56[] =\r
+static const unsigned char temp_binary_data_55[] =\r
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
"\r\n"\r
"<COLOUR_SCHEME font=\"<Monospaced>; 13.0\">\r\n"\r
" <COLOUR name=\"Error\" colour=\"FFE60000\"/>\r\n"\r
"</COLOUR_SCHEME>\r\n";\r
\r
-const char* colourscheme_dark_xml = (const char*) temp_binary_data_56;\r
+const char* colourscheme_dark_xml = (const char*) temp_binary_data_55;\r
\r
//================== colourscheme_light.xml ==================\r
-static const unsigned char temp_binary_data_57[] =\r
+static const unsigned char temp_binary_data_56[] =\r
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
"\r\n"\r
"<COLOUR_SCHEME font=\"<Monospaced>; 13.0\">\r\n"\r
" <COLOUR name=\"Error\" colour=\"ffcc0000\"/>\r\n"\r
"</COLOUR_SCHEME>\r\n";\r
\r
-const char* colourscheme_light_xml = (const char*) temp_binary_data_57;\r
+const char* colourscheme_light_xml = (const char*) temp_binary_data_56;\r
\r
//================== nothingtoseehere.txt ==================\r
-static const unsigned char temp_binary_data_58[] =\r
+static const unsigned char temp_binary_data_57[] =\r
"VUEtMTk3NTkzMTgtNA==";\r
\r
-const char* nothingtoseehere_txt = (const char*) temp_binary_data_58;\r
+const char* nothingtoseehere_txt = (const char*) temp_binary_data_57;\r
\r
//================== offlinepage.html ==================\r
-static const unsigned char temp_binary_data_59[] =\r
+static const unsigned char temp_binary_data_58[] =\r
"<html>\n"\r
" <head>\n"\r
" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\">\n"\r
" </body>\n"\r
"</html>";\r
\r
-const char* offlinepage_html = (const char*) temp_binary_data_59;\r
+const char* offlinepage_html = (const char*) temp_binary_data_58;\r
\r
//================== projucer_EULA.txt ==================\r
-static const unsigned char temp_binary_data_60[] =\r
+static const unsigned char temp_binary_data_59[] =\r
"\r\n"\r
"IMPORTANT NOTICE: PLEASE READ CAREFULLY BEFORE INSTALLING THE SOFTWARE:\r\n"\r
"\r\n"\r
"\r\n"\r
"10.6. Please note that this License, its subject matter and its formation, are governed by English law. You and we both agree to that the courts of England and Wales will have exclusive jurisdiction.\r\n";\r
\r
-const char* projucer_EULA_txt = (const char*) temp_binary_data_60;\r
+const char* projucer_EULA_txt = (const char*) temp_binary_data_59;\r
\r
//================== RecentFilesMenuTemplate.nib ==================\r
-static const unsigned char temp_binary_data_61[] =\r
+static const unsigned char temp_binary_data_60[] =\r
{ 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50,\r
0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226,\r
0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,\r
7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8,\r
41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 };\r
\r
-const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_61;\r
+const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_60;\r
\r
\r
const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)\r
{\r
unsigned int hash = 0;\r
-\r
- if (resourceNameUTF8 != nullptr)\r
+ if (resourceNameUTF8 != 0)\r
while (*resourceNameUTF8 != 0)\r
hash = 31 * hash + (unsigned int) *resourceNameUTF8++;\r
\r
case 0x28d496ad: numBytes = 1233; return jucer_InlineComponentTemplate_h;\r
case 0x8905395b: numBytes = 473; return jucer_MainConsoleAppTemplate_cpp;\r
case 0x5e5ea047: numBytes = 2021; return jucer_MainTemplate_NoWindow_cpp;\r
- case 0xda2391f8: numBytes = 4127; return jucer_MainTemplate_SimpleWindow_cpp;\r
- case 0x400bc026: numBytes = 4127; return jucer_MainTemplate_Window_cpp;\r
+ case 0xda2391f8: numBytes = 4012; return jucer_MainTemplate_SimpleWindow_cpp;\r
+ case 0x400bc026: numBytes = 3972; return jucer_MainTemplate_Window_cpp;\r
case 0xf4842835: numBytes = 1491; return jucer_NewComponentTemplate_cpp;\r
case 0xe7bf237a: numBytes = 646; return jucer_NewComponentTemplate_h;\r
case 0x02a2a077: numBytes = 278; return jucer_NewCppFileTemplate_cpp;\r
case 0xbc050edc: numBytes = 4926; return jucer_PIPAudioProcessorTemplate_h;\r
case 0xf4ca9e9a: numBytes = 2447; return jucer_PIPMain_cpp;\r
case 0x0b16e320: numBytes = 517; return jucer_PIPTemplate_h;\r
- case 0xcd472557: numBytes = 6433; return jucer_UnityPluginGUIScript_cs;\r
case 0x763d39dc: numBytes = 1050; return colourscheme_dark_xml;\r
case 0xe8b08520: numBytes = 1050; return colourscheme_light_xml;\r
case 0x938e96ec: numBytes = 20; return nothingtoseehere_txt;\r
"jucer_PIPAudioProcessorTemplate_h",\r
"jucer_PIPMain_cpp",\r
"jucer_PIPTemplate_h",\r
- "jucer_UnityPluginGUIScript_cs",\r
"colourscheme_dark_xml",\r
"colourscheme_light_xml",\r
"nothingtoseehere_txt",\r
"jucer_PIPAudioProcessorTemplate.h",\r
"jucer_PIPMain.cpp",\r
"jucer_PIPTemplate.h",\r
- "jucer_UnityPluginGUIScript.cs",\r
"colourscheme_dark.xml",\r
"colourscheme_light.xml",\r
"nothingtoseehere.txt",\r
const int jucer_MainTemplate_NoWindow_cppSize = 2021;\r
\r
extern const char* jucer_MainTemplate_SimpleWindow_cpp;\r
- const int jucer_MainTemplate_SimpleWindow_cppSize = 4127;\r
+ const int jucer_MainTemplate_SimpleWindow_cppSize = 4012;\r
\r
extern const char* jucer_MainTemplate_Window_cpp;\r
- const int jucer_MainTemplate_Window_cppSize = 4127;\r
+ const int jucer_MainTemplate_Window_cppSize = 3972;\r
\r
extern const char* jucer_NewComponentTemplate_cpp;\r
const int jucer_NewComponentTemplate_cppSize = 1491;\r
extern const char* jucer_PIPTemplate_h;\r
const int jucer_PIPTemplate_hSize = 517;\r
\r
- extern const char* jucer_UnityPluginGUIScript_cs;\r
- const int jucer_UnityPluginGUIScript_csSize = 6433;\r
-\r
extern const char* colourscheme_dark_xml;\r
const int colourscheme_dark_xmlSize = 1050;\r
\r
const int RecentFilesMenuTemplate_nibSize = 2842;\r
\r
// Number of elements in the namedResourceList and originalFileNames arrays.\r
- const int namedResourceListSize = 62;\r
+ const int namedResourceListSize = 61;\r
\r
// Points to the start of a list of resource names.\r
extern const char* namedResourceList[];\r
namespace ProjectInfo\r
{\r
const char* const projectName = "Projucer";\r
- const char* const companyName = "ROLI Ltd.";\r
- const char* const versionString = "5.4.1";\r
- const int versionNumber = 0x50401;\r
+ const char* const versionString = "5.3.2";\r
+ const int versionNumber = 0x50302;\r
}\r
#endif\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
- jucerVersion="5.4.1" version="5.4.1" bundleIdentifier="com.juce.theprojucer"\r
+ jucerVersion="5.3.1" version="5.3.2" bundleIdentifier="com.juce.theprojucer"\r
defines="" splashScreenColour="Dark" displaySplashScreen="0"\r
reportAppUsage="0" companyName="ROLI Ltd." companyCopyright="ROLI Ltd."\r
cppLanguageStandard="11">\r
<EXPORTFORMATS>\r
<XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="rv1F4h"\r
- extraLinkerFlags="" extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code -Wzero-as-null-pointer-constant"\r
+ extraLinkerFlags="" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
customPList="<plist> <dict> 	<key>NSAppTransportSecurity</key> 	<dict> 		<key>NSAllowsArbitraryLoads</key> 		<true/> 		<key>NSExceptionDomains</key> 		<dict> 			<key>amazonaws.com</key> 			<dict> 				<key>NSExceptionAllowsInsecureHTTPLoads</key> 				<true/> 				<key>NSIncludesSubdomains</key> 				<true/> 			</dict> 		</dict> 	</dict> </dict> </plist>"\r
extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime">\r
<CONFIGURATIONS>\r
<MODULEPATH id="juce_analytics" path="../../modules"/>\r
</MODULEPATHS>\r
</VS2015>\r
- <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="rv1F4h" extraCompilerFlags="/w44265 /w45038 /w44062">\r
+ <VS2017 targetFolder="Builds/VisualStudio2017" bigIcon="rv1F4h">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="Projucer" useRuntimeLibDLL="0"/>\r
<CONFIGURATION name="Release" isDebug="0" optimisation="3" targetName="Projucer"\r
file="Source/BinaryData/Templates/jucer_PIPMain.cpp"/>\r
<FILE id="WqDCf0" name="jucer_PIPTemplate.h" compile="0" resource="1"\r
file="Source/BinaryData/Templates/jucer_PIPTemplate.h"/>\r
- <FILE id="wrkU1v" name="jucer_UnityPluginGUIScript.cs" compile="0"\r
- resource="1" file="Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs"/>\r
</GROUP>\r
<FILE id="oXM3fR" name="colourscheme_dark.xml" compile="0" resource="1"\r
file="Source/BinaryData/colourscheme_dark.xml"/>\r
file="Source/ProjectSaving/jucer_ResourceFile.cpp"/>\r
<FILE id="d4INvx" name="jucer_ResourceFile.h" compile="0" resource="0"\r
file="Source/ProjectSaving/jucer_ResourceFile.h"/>\r
- <FILE id="kw0nyx" name="jucer_XcodeProjectParser.h" compile="0" resource="0"\r
- file="Source/ProjectSaving/jucer_XcodeProjectParser.h"/>\r
</GROUP>\r
<GROUP id="{DC7C1395-DD88-0C6C-2D8A-EC48A63D31E8}" name="Settings">\r
<FILE id="DsopUB" name="jucer_AppearanceSettings.cpp" compile="1" resource="0"\r
<GROUP id="{FE8C76CF-7C05-EC86-8997-C9941B88670B}" name="PropertyComponents">\r
<FILE id="eleFsw" name="jucer_ColourPropertyComponent.h" compile="0"\r
resource="0" file="Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h"/>\r
+ <FILE id="D0OfLg" name="jucer_DependencyPathPropertyComponent.cpp"\r
+ compile="1" resource="0" file="Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.cpp"/>\r
+ <FILE id="gcbJOL" name="jucer_DependencyPathPropertyComponent.h" compile="0"\r
+ resource="0" file="Source/Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"/>\r
<FILE id="sfUzaf" name="jucer_FilePathPropertyComponent.h" compile="0"\r
resource="0" file="Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"/>\r
- <FILE id="c5PWPd" name="jucer_LabelPropertyComponent.h" compile="0"\r
- resource="0" file="Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h"/>\r
<FILE id="DkLOIQ" name="jucer_PropertyComponentsWithEnablement.h" compile="0"\r
resource="0" file="Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"/>\r
</GROUP>\r
resource="0" file="Source/Wizards/jucer_TemplateThumbnailsComponent.h"/>\r
</GROUP>\r
</MAINGROUP>\r
- <JUCEOPTIONS JUCE_LOG_ASSERTIONS="1" JUCE_USE_CURL="1" JUCE_ALLOW_STATIC_NULL_VARIABLES="0"\r
- JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+ <JUCEOPTIONS JUCE_LOG_ASSERTIONS="1" JUCE_USE_CURL="1"/>\r
<MODULES>\r
<MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
<MODULE id="juce_core" showAllCode="1"/>\r
EditorColourSchemeWindowComponent()\r
{\r
if (getAppSettings().monospacedFontNames.size() == 0)\r
- changeContent (new AppearanceEditor::FontScanPanel());\r
+ content.reset (new AppearanceEditor::FontScanPanel());\r
else\r
- changeContent (new AppearanceEditor::EditorPanel());\r
+ content.reset (new AppearanceEditor::EditorPanel());\r
+\r
+ changeContent (content.get());\r
}\r
\r
void paint (Graphics& g) override\r
const auto width = font.getStringWidth ("....");\r
\r
return width == font.getStringWidth ("WWWW")\r
- && width == font.getStringWidth ("0000")\r
- && width == font.getStringWidth ("1111")\r
- && width == font.getStringWidth ("iiii");\r
+ && width == font.getStringWidth ("0000")\r
+ && width == font.getStringWidth ("1111")\r
+ && width == font.getStringWidth ("iiii");\r
}\r
\r
StringArray fontsToScan, fontsFound;\r
\r
#pragma once\r
\r
-#include "../../Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h"\r
\r
//==============================================================================\r
class GlobalPathsWindowComponent : public Component,\r
- private Timer,\r
- private Value::Listener\r
+ private Timer\r
{\r
public:\r
GlobalPathsWindowComponent()\r
{\r
- addChildComponent (rescanJUCEPathButton);\r
- rescanJUCEPathButton.onClick = [this]\r
- {\r
- ProjucerApplication::getApp().rescanJUCEPathModules();\r
- lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get();\r
- };\r
+ addLabelsAndSetProperties();\r
\r
- addChildComponent (rescanUserPathButton);\r
- rescanUserPathButton.onClick = [this]\r
- {\r
- ProjucerApplication::getApp().rescanUserPathModules();\r
- lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get();\r
- };\r
+ addAndMakeVisible (info);\r
+ info.setInfoToDisplay ("Use this dropdown to set the global paths for different OSes. "\r
+ "\nN.B. These paths are stored locally and will only be used when "\r
+ "saving a project on this machine. Other machines will have their own "\r
+ "locally stored paths.");\r
\r
- addAndMakeVisible (resetToDefaultsButton);\r
- resetToDefaultsButton.onClick = [this] { resetCurrentOSPathsToDefaults(); };\r
+ addAndMakeVisible (osSelector);\r
+ osSelector.addItem ("OSX", 1);\r
+ osSelector.addItem ("Windows", 2);\r
+ osSelector.addItem ("Linux", 3);\r
\r
- addAndMakeVisible (propertyViewport);\r
- propertyViewport.setViewedComponent (&propertyGroup, false);\r
+ osSelector.onChange = [this]\r
+ {\r
+ addLabelsAndSetProperties();\r
+ updateFilePathPropertyComponents();\r
+ };\r
\r
auto os = TargetOS::getThisOS();\r
\r
- if (os == TargetOS::osx) selectedOSValue = "osx";\r
- else if (os == TargetOS::windows) selectedOSValue = "windows";\r
- else if (os == TargetOS::linux) selectedOSValue = "linux";\r
-\r
- selectedOSValue.addListener (this);\r
-\r
- buildProps();\r
+ if (os == TargetOS::osx) osSelector.setSelectedId (1);\r
+ else if (os == TargetOS::windows) osSelector.setSelectedId (2);\r
+ else if (os == TargetOS::linux) osSelector.setSelectedId (3);\r
\r
- lastJUCEModulePath = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get();\r
- lastUserModulePath = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get();\r
- }\r
-\r
- ~GlobalPathsWindowComponent()\r
- {\r
- auto juceValue = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS());\r
- auto userValue = getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS());\r
-\r
- auto jucePathNeedsScanning = (! juceValue.isUsingDefault() && juceValue.get() != lastJUCEModulePath);\r
- auto userPathNeedsScanning = (! userValue.isUsingDefault() && userValue.get() != lastUserModulePath);\r
-\r
- if (jucePathNeedsScanning)\r
- ProjucerApplication::getApp().rescanJUCEPathModules();\r
-\r
- if (userPathNeedsScanning)\r
- ProjucerApplication::getApp().rescanUserPathModules();\r
+ updateFilePathPropertyComponents();\r
}\r
\r
void paint (Graphics& g) override\r
{\r
auto b = getLocalBounds().reduced (10);\r
\r
- auto buttonBounds = b.removeFromBottom (50);\r
+ auto topSlice = b.removeFromTop (25);\r
+ osSelector.setSize (200, 25);\r
+ osSelector.setCentrePosition (topSlice.getCentre());\r
\r
- rescanJUCEPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10));\r
- rescanUserPathButton.setBounds (buttonBounds.removeFromLeft (150).reduced (5, 10));\r
+ info.setBounds (osSelector.getBounds().withWidth (osSelector.getHeight()).translated ((osSelector.getWidth() + 5), 0).reduced (2));\r
\r
- resetToDefaultsButton.setBounds (buttonBounds.removeFromRight (150).reduced (5, 10));\r
+ int labelIndex = 0;\r
+ bool isFirst = true;\r
\r
- propertyGroup.updateSize (0, 0, getWidth() - 20 - propertyViewport.getScrollBarThickness());\r
- propertyViewport.setBounds (b);\r
+ for (auto* pathComp : pathPropertyComponents)\r
+ {\r
+ if (pathComp == nullptr)\r
+ {\r
+ b.removeFromTop (15);\r
+ pathPropertyLabels.getUnchecked (labelIndex++)->setBounds (b.removeFromTop (20));\r
+ b.removeFromTop (20);\r
+ }\r
+ else\r
+ {\r
+ if (isFirst)\r
+ b.removeFromTop (20);\r
+\r
+ pathComp->setBounds (b.removeFromTop (pathComp->getPreferredHeight()));\r
+ b.removeFromTop (5);\r
+ }\r
+\r
+ isFirst = false;\r
+ }\r
}\r
\r
void highlightJUCEPath()\r
{\r
- if (isTimerRunning() || ! isSelectedOSThisOS())\r
- return;\r
-\r
- PropertyComponent* jucePathPropertyComponent = nullptr;\r
-\r
- for (auto* prop : propertyGroup.properties)\r
- if (prop->getName() == "Path to JUCE")\r
- jucePathPropertyComponent = prop;\r
-\r
- if (jucePathPropertyComponent != nullptr)\r
+ if (! isTimerRunning() && isSelectedOSThisOS())\r
{\r
- boundsToHighlight = getLocalArea (&propertyGroup, jucePathPropertyComponent->getBounds());\r
+ if (auto* jucePathComp = pathPropertyComponents.getFirst())\r
+ boundsToHighlight = jucePathComp->getBounds();\r
+\r
flashAlpha = 0.0f;\r
hasFlashed = false;\r
\r
}\r
\r
private:\r
+ OwnedArray<Label> pathPropertyLabels;\r
+ OwnedArray<PropertyComponent> pathPropertyComponents;\r
+\r
+ ComboBox osSelector;\r
+ InfoButton info;\r
+\r
+ Rectangle<int> boundsToHighlight;\r
+ float flashAlpha = 0.0f;\r
+ bool hasFlashed = false;\r
+\r
//==============================================================================\r
void timerCallback() override\r
{\r
repaint();\r
}\r
\r
- void valueChanged (Value&) override\r
- {\r
- buildProps();\r
- resized();\r
- }\r
-\r
//==============================================================================\r
bool isSelectedOSThisOS() { return TargetOS::getThisOS() == getSelectedOS(); }\r
\r
TargetOS::OS getSelectedOS() const\r
{\r
- auto val = selectedOSValue.getValue();\r
+ auto selectedOS = TargetOS::unknown;\r
\r
- if (val == "osx") return TargetOS::osx;\r
- else if (val == "windows") return TargetOS::windows;\r
- else if (val == "linux") return TargetOS::linux;\r
+ switch (osSelector.getSelectedId())\r
+ {\r
+ case 1: selectedOS = TargetOS::osx; break;\r
+ case 2: selectedOS = TargetOS::windows; break;\r
+ case 3: selectedOS = TargetOS::linux; break;\r
+ default: break;\r
+ }\r
\r
- jassertfalse;\r
- return TargetOS::unknown;\r
+ return selectedOS;\r
}\r
\r
- //==============================================================================\r
- void buildProps()\r
+ void updateFilePathPropertyComponents()\r
{\r
- updateValues();\r
+ pathPropertyComponents.clear();\r
\r
- PropertyListBuilder builder;\r
- auto isThisOS = isSelectedOSThisOS();\r
+ auto& settings = getAppSettings();\r
\r
- builder.add (new ChoicePropertyComponent (selectedOSValue, "OS", { "OSX", "Windows", "Linux" }, { "osx", "windows", "linux" }),\r
- "Use this dropdown to set the global paths for different OSes. "\r
- "\nN.B. These paths are stored locally and will only be used when "\r
- "saving a project on this machine. Other machines will have their own "\r
- "locally stored paths.");\r
+ if (isSelectedOSThisOS())\r
+ {\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::jucePath),\r
+ "Path to JUCE", true)));\r
\r
- builder.add (new LabelPropertyComponent ("JUCE"), {});\r
+ pathPropertyComponents.add (nullptr);\r
\r
- builder.add (new FilePathPropertyComponent (jucePathValue, "Path to JUCE", true, isThisOS),\r
- "This should be the path to the top-level directory of your JUCE folder. "\r
- "This path will be used when searching for the JUCE examples and DemoRunner application.");\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultJuceModulePath),\r
+ "JUCE Modules", true)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::defaultUserModulePath),\r
+ "User Modules", true, {}, {}, true)));\r
\r
- builder.add (new FilePathPropertyComponent (juceModulePathValue, "JUCE Modules", true, isThisOS),\r
- String ("This should be the path to the folder containing the JUCE modules that you wish to use, typically the \"modules\" directory of your JUCE folder.")\r
- + (isThisOS ? " Use the button below to re-scan a new path." : ""));\r
- builder.add (new FilePathPropertyComponent (userModulePathValue, "User Modules", true, isThisOS, {}, {}, true),\r
- String ("A semicolon-separated list of user module paths. These paths will be used to display any non-JUCE modules that are available.")\r
- + (isThisOS ? " Use the button below to re-scan new paths." : ""));\r
+ pathPropertyComponents.add (nullptr);\r
\r
- builder.add (new LabelPropertyComponent ("SDKs"), {});\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::vst3Path),\r
+ "VST3 SDK", true)));\r
\r
- builder.add (new FilePathPropertyComponent (vstPathValue, "VST (Legacy) SDK", true, isThisOS),\r
- "If you are building a legacy VST plug-in then this path should point to a VST2 SDK. "\r
- "The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. "\r
- "You also need a VST2 license from Steinberg to distribute VST2 plug-ins.");\r
- builder.add (new FilePathPropertyComponent (vst3PathValue, "VST3 SDK", true, isThisOS),\r
- "This path can be set to use a custom VST3 SDK instead of the one which is embedded in JUCE.");\r
+ if (getSelectedOS() == TargetOS::linux)\r
+ {\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "RTAS SDK", true)));\r
+ pathPropertyComponents.getLast()->setEnabled (false);\r
\r
- if (getSelectedOS() != TargetOS::linux)\r
- {\r
- builder.add (new FilePathPropertyComponent (aaxPathValue, "AAX SDK", true, isThisOS),\r
- "If you are building AAX plug-ins, this should be the path to the AAX SDK folder.");\r
- builder.add (new FilePathPropertyComponent (rtasPathValue, "RTAS SDK", true, isThisOS),\r
- "If you are building RTAS plug-ins, this should be the path to the RTAS SDK folder.");\r
- }\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent ({}, "AAX SDK", true)));\r
+ pathPropertyComponents.getLast()->setEnabled (false);\r
+ }\r
+ else\r
+ {\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::rtasPath),\r
+ "RTAS SDK", true)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::aaxPath),\r
+ "AAX SDK", true)));\r
+ }\r
\r
- builder.add (new FilePathPropertyComponent (androidSDKPathValue, "Android SDK", true, isThisOS),\r
- "This path will be used when writing the local.properties file of an Android project and should point to the Android SDK folder.");\r
- builder.add (new FilePathPropertyComponent (androidNDKPathValue, "Android NDK", true, isThisOS),\r
- "This path will be used when writing the local.properties file of an Android project and should point to the Android NDK folder.");\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidSDKPath),\r
+ "Android SDK", true)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::androidNDKPath),\r
+ "Android NDK", true)));\r
\r
- if (isThisOS)\r
- {\r
- builder.add (new LabelPropertyComponent ("Other"), {});\r
+ pathPropertyComponents.add (nullptr);\r
\r
#if JUCE_MAC\r
String exeLabel ("app");\r
#else\r
String exeLabel ("startup script");\r
#endif\r
-\r
- builder.add (new FilePathPropertyComponent (clionExePathValue, "CLion " + exeLabel, false, isThisOS),\r
- "This path will be used for the \"Save Project and Open in IDE...\" option of the CLion exporter.");\r
- builder.add (new FilePathPropertyComponent (androidStudioExePathValue, "Android Studio " + exeLabel, false, isThisOS),\r
- "This path will be used for the \"Save Project and Open in IDE...\" option of the Android Studio exporter.");\r
-\r
- rescanJUCEPathButton.setVisible (true);\r
- rescanUserPathButton.setVisible (true);\r
+ addAndMakeVisible (pathPropertyComponents.add (new FilePathPropertyComponent (settings.getStoredPath (Ids::clionExePath),\r
+ "CLion " + exeLabel, false)));\r
}\r
else\r
{\r
- rescanJUCEPathButton.setVisible (false);\r
- rescanUserPathButton.setVisible (false);\r
+ auto selectedOS = getSelectedOS();\r
+ auto maxChars = 1024;\r
+\r
+ pathPropertyComponents.add (nullptr);\r
+\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultJuceModulePath, selectedOS),\r
+ "JUCE Modules", maxChars, false)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::defaultUserModulePath, selectedOS),\r
+ "User Modules", maxChars, false)));\r
+\r
+ pathPropertyComponents.add (nullptr);\r
+\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::vst3Path, selectedOS),\r
+ "VST3 SDK", maxChars, false)));\r
+\r
+ if (selectedOS == TargetOS::linux)\r
+ {\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "RTAS SDK", maxChars, false)));\r
+ pathPropertyComponents.getLast()->setEnabled (false);\r
+\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (Value(), "AAX SDK", maxChars, false)));\r
+ pathPropertyComponents.getLast()->setEnabled (false);\r
+ }\r
+ else\r
+ {\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::rtasPath, selectedOS),\r
+ "RTAS SDK", maxChars, false)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::aaxPath, selectedOS),\r
+ "AAX SDK", maxChars, false)));\r
+ }\r
+\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidSDKPath, selectedOS),\r
+ "Android SDK", maxChars, false)));\r
+ addAndMakeVisible (pathPropertyComponents.add (new TextPropertyComponent (settings.getFallbackPathForOS (Ids::androidNDKPath, selectedOS),\r
+ "Android NDK", maxChars, false)));\r
}\r
\r
- propertyGroup.setProperties (builder);\r
+ resized();\r
}\r
\r
- void updateValues()\r
+ void addLabelsAndSetProperties()\r
{\r
- auto& settings = getAppSettings();\r
- auto os = getSelectedOS();\r
-\r
- jucePathValue = settings.getStoredPath (Ids::jucePath, os);\r
- juceModulePathValue = settings.getStoredPath (Ids::defaultJuceModulePath, os);\r
- userModulePathValue = settings.getStoredPath (Ids::defaultUserModulePath, os);\r
- vstPathValue = settings.getStoredPath (Ids::vstLegacyPath, os);\r
- vst3PathValue = settings.getStoredPath (Ids::vst3Path, os);\r
- rtasPathValue = settings.getStoredPath (Ids::rtasPath, os);\r
- aaxPathValue = settings.getStoredPath (Ids::aaxPath, os);\r
- androidSDKPathValue = settings.getStoredPath (Ids::androidSDKPath, os);\r
- androidNDKPathValue = settings.getStoredPath (Ids::androidNDKPath, os);\r
- clionExePathValue = settings.getStoredPath (Ids::clionExePath, os);\r
- androidStudioExePathValue = settings.getStoredPath (Ids::androidStudioExePath, os);\r
- }\r
+ pathPropertyLabels.clear();\r
\r
- void resetCurrentOSPathsToDefaults()\r
- {\r
- jucePathValue .resetToDefault();\r
- juceModulePathValue .resetToDefault();\r
- userModulePathValue .resetToDefault();\r
- vstPathValue .resetToDefault();\r
- vst3PathValue .resetToDefault();\r
- rtasPathValue .resetToDefault();\r
- aaxPathValue .resetToDefault();\r
- androidSDKPathValue .resetToDefault();\r
- androidNDKPathValue .resetToDefault();\r
- clionExePathValue .resetToDefault();\r
- androidStudioExePathValue.resetToDefault();\r
+ pathPropertyLabels.add (new Label ("modulesLabel", "Modules"));\r
+ pathPropertyLabels.add (new Label ("sdksLabel", "SDKs"));\r
+ pathPropertyLabels.add (new Label ("otherLabel", "Other"));\r
\r
- repaint();\r
+ for (auto* l : pathPropertyLabels)\r
+ {\r
+ addAndMakeVisible (l);\r
+ l->setFont (Font (18.0f, Font::FontStyleFlags::bold));\r
+ l->setJustificationType (Justification::centredLeft);\r
+ }\r
}\r
\r
- //==============================================================================\r
- Value selectedOSValue;\r
-\r
- ValueWithDefault jucePathValue, juceModulePathValue, userModulePathValue,\r
- vst3PathValue, vstPathValue, rtasPathValue, aaxPathValue,\r
- androidSDKPathValue, androidNDKPathValue,\r
- clionExePathValue, androidStudioExePathValue;\r
-\r
- Viewport propertyViewport;\r
- PropertyGroupComponent propertyGroup { "Global Paths", { getIcons().openFolder, Colours::transparentBlack } };\r
-\r
- TextButton rescanJUCEPathButton { "Re-scan JUCE Modules" },\r
- rescanUserPathButton { "Re-scan User Modules" },\r
- resetToDefaultsButton { "Reset to Defaults" };\r
-\r
- Rectangle<int> boundsToHighlight;\r
- float flashAlpha = 0.0f;\r
- bool hasFlashed = false;\r
-\r
- var lastJUCEModulePath, lastUserModulePath;\r
-\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlobalPathsWindowComponent)\r
};\r
}\r
\r
//==============================================================================\r
+ std::unique_ptr<LookAndFeel> lf;\r
+\r
+ Viewport propertyViewport;\r
+ PropertyGroupComponent propertyGroup { "PIP Creator", { getIcons().juceLogo, Colours::transparentBlack } };\r
+\r
+ TextButton createButton { "Create PIP" };\r
+\r
ValueTree pipTree { "PIPSettings" };\r
ValueWithDefault nameValue { pipTree, Ids::name, nullptr, "MyComponentPIP" },\r
versionValue { pipTree, Ids::version, nullptr },\r
dependenciesValue { pipTree, Ids::dependencies_, nullptr, getModulesRequiredForComponent(), "," },\r
exportersValue { pipTree, Ids::exporters, nullptr,\r
StringArray (ProjectExporter::getValueTreeNameForExporter (ProjectExporter::getCurrentPlatformExporterName()).toLowerCase()), "," },\r
- moduleFlagsValue { pipTree, Ids::moduleFlags, nullptr, "JUCE_STRICT_REFCOUNTEDPOINTER=1" },\r
+ moduleFlagsValue { pipTree, Ids::moduleFlags, nullptr },\r
definesValue { pipTree, Ids::defines, nullptr },\r
typeValue { pipTree, Ids::type, nullptr, "Component" },\r
mainClassValue { pipTree, Ids::mainClass, nullptr, "MyComponent" },\r
useLocalCopyValue { pipTree, Ids::useLocalCopy, nullptr, false };\r
\r
- std::unique_ptr<LookAndFeel> lf;\r
-\r
- Viewport propertyViewport;\r
- PropertyGroupComponent propertyGroup { "PIP Creator", { getIcons().juceLogo, Colours::transparentBlack } };\r
-\r
- TextButton createButton { "Create PIP" };\r
-\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PIPCreatorWindowComponent)\r
};\r
dragOver = false;\r
repaint();\r
\r
- if (auto element = parseXML (File (files[0])))\r
+ std::unique_ptr<XmlElement> element (XmlDocument::parse (File (files[0])));\r
+\r
+ if (element != nullptr)\r
{\r
if (auto* ePath = element->getChildByName ("path"))\r
userText.setText (ePath->getStringAttribute ("d"), true);\r
{\r
initialiseLogger ("IDE_Log_");\r
Logger::writeToLog (SystemStats::getOperatingSystemName());\r
- Logger::writeToLog ("CPU: " + String (SystemStats::getCpuSpeedInMegahertz())\r
+ Logger::writeToLog ("CPU: " + String (SystemStats::getCpuSpeedInMegaherz())\r
+ "MHz Cores: " + String (SystemStats::getNumCpus())\r
+ " " + String (SystemStats::getMemorySizeInMegabytes()) + "MB");\r
\r
initialiseBasics();\r
\r
- isRunningCommandLine = commandLine.isNotEmpty()\r
- && ! commandLine.startsWith ("-NSDocumentRevisionsDebugMode");\r
+ isRunningCommandLine = commandLine.isNotEmpty();\r
\r
licenseController.reset (new LicenseController);\r
licenseController->addLicenseStatusChangedCallback (this);\r
\r
if (isRunningCommandLine)\r
{\r
- auto appReturnCode = performCommandLine (ArgumentList ("Projucer", commandLine));\r
+ const int appReturnCode = performCommandLine (commandLine);\r
\r
if (appReturnCode != commandLineNotPerformed)\r
{\r
return;\r
}\r
\r
- rescanJUCEPathModules();\r
- rescanUserPathModules();\r
-\r
openDocumentManager.registerType (new ProjucerAppClasses::LiveBuildCodeEditorDocument::Type(), 2);\r
\r
childProcessCache.reset (new ChildProcessCache());\r
showApplicationUsageDataAgreementPopup();\r
}\r
\r
-static void deleteTemporaryFiles()\r
-{\r
- auto tempDirectory = File::getSpecialLocation (File::SpecialLocationType::tempDirectory).getChildFile ("PIPs");\r
-\r
- if (tempDirectory.exists())\r
- tempDirectory.deleteRecursively();\r
-}\r
-\r
void ProjucerApplication::shutdown()\r
{\r
if (server != nullptr)\r
aboutWindow.reset();\r
pathsWindow.reset();\r
editorColourSchemeWindow.reset();\r
- pipCreatorWindow.reset();\r
\r
if (licenseController != nullptr)\r
{\r
}\r
}\r
\r
-//==========================================================================\r
-static File getJUCEExamplesDirectoryPathFromGlobal()\r
-{\r
- auto globalPath = File::createFileWithoutCheckingPath (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString()\r
- .replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
-\r
- if (globalPath.exists())\r
- return File (globalPath).getChildFile ("examples");\r
-\r
- return {};\r
-}\r
-\r
Array<File> ProjucerApplication::getSortedExampleDirectories() noexcept\r
{\r
Array<File> exampleDirectories;\r
return false;\r
}\r
\r
+File ProjucerApplication::getJUCEExamplesDirectoryPathFromGlobal() noexcept\r
+{\r
+ auto globalPath = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
+\r
+ if (globalPath.isNotEmpty())\r
+ return File (globalPath).getChildFile ("examples");\r
+\r
+ return {};\r
+}\r
+\r
void ProjucerApplication::findAndLaunchExample (int selectedIndex)\r
{\r
File example;\r
-\r
for (auto& dir : getSortedExampleDirectories())\r
{\r
auto exampleFiles = getSortedExampleFilesInDirectory (dir);\r
Analytics::getInstance()->logEvent ("Example Opened", data, ProjucerAnalyticsEvent::exampleEvent);\r
}\r
\r
-//==========================================================================\r
-static String getPlatformSpecificFileExtension()\r
+File ProjucerApplication::findDemoRunnerExecutable() noexcept\r
{\r
- #if JUCE_MAC\r
- return ".app";\r
- #elif JUCE_WINDOWS\r
- return ".exe";\r
- #elif JUCE_LINUX\r
- return {};\r
- #else\r
- jassertfalse;\r
- return {};\r
- #endif\r
-}\r
+ auto buildsPath = getJUCEExamplesDirectoryPathFromGlobal().getChildFile ("DemoRunner").getChildFile ("Builds");\r
\r
-static File getPlatformSpecificProjectFolder()\r
-{\r
- auto examplesDir = getJUCEExamplesDirectoryPathFromGlobal();\r
-\r
- if (examplesDir == File())\r
+ if (! buildsPath.exists())\r
return {};\r
\r
- auto buildsFolder = examplesDir.getChildFile ("DemoRunner").getChildFile ("Builds");\r
-\r
- #if JUCE_MAC\r
- return buildsFolder.getChildFile ("MacOSX");\r
- #elif JUCE_WINDOWS\r
- return buildsFolder.getChildFile ("VisualStudio2017");\r
- #elif JUCE_LINUX\r
- return buildsFolder.getChildFile ("LinuxMakefile");\r
- #else\r
- jassertfalse;\r
- return {};\r
- #endif\r
-}\r
-\r
-static File tryToFindDemoRunnerExecutableInBuilds()\r
-{\r
- auto projectFolder = getPlatformSpecificProjectFolder();\r
-\r
- if (projectFolder == File())\r
- return {};\r
+ String extension;\r
\r
#if JUCE_MAC\r
- projectFolder = projectFolder.getChildFile ("build");\r
- auto demoRunnerExecutable = projectFolder.getChildFile ("Release").getChildFile ("DemoRunner.app");\r
+ auto osxBuildFolder = buildsPath.getChildFile ("MacOSX").getChildFile ("build");\r
\r
+ auto demoRunnerExecutable = osxBuildFolder.getChildFile ("Release").getChildFile ("DemoRunner.app");\r
if (demoRunnerExecutable.exists())\r
return demoRunnerExecutable;\r
\r
- demoRunnerExecutable = projectFolder.getChildFile ("Debug").getChildFile ("DemoRunner.app");\r
-\r
+ demoRunnerExecutable = osxBuildFolder.getChildFile ("Debug").getChildFile ("DemoRunner.app");\r
if (demoRunnerExecutable.exists())\r
return demoRunnerExecutable;\r
+\r
+ extension = ".app";\r
#elif JUCE_WINDOWS\r
- projectFolder = projectFolder.getChildFile ("x64");\r
- auto demoRunnerExecutable = projectFolder.getChildFile ("Release").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
+ auto windowsBuildFolder = buildsPath.getChildFile ("VisualStudio2017").getChildFile ("x64");\r
\r
+ auto demoRunnerExecutable = windowsBuildFolder.getChildFile ("Release").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
if (demoRunnerExecutable.existsAsFile())\r
return demoRunnerExecutable;\r
\r
- demoRunnerExecutable = projectFolder.getChildFile ("Debug").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
-\r
+ demoRunnerExecutable = windowsBuildFolder.getChildFile ("Debug").getChildFile ("App").getChildFile ("DemoRunner.exe");\r
if (demoRunnerExecutable.existsAsFile())\r
return demoRunnerExecutable;\r
+\r
+ extension = ".exe";\r
#elif JUCE_LINUX\r
- projectFolder = projectFolder.getChildFile ("LinuxMakefile").getChildFile ("build");\r
- auto demoRunnerExecutable = projectFolder.getChildFile ("DemoRunner");\r
+ auto linuxBuildFolder = buildsPath.getChildFile ("LinuxMakefile").getChildFile ("build");\r
+\r
+ auto demoRunnerExecutable = linuxBuildFolder.getChildFile ("DemoRunner");\r
\r
if (demoRunnerExecutable.existsAsFile())\r
return demoRunnerExecutable;\r
- #endif\r
-\r
- return {};\r
-}\r
-\r
-static File tryToFindPrebuiltDemoRunnerExecutable()\r
-{\r
- auto prebuiltFile = File (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString())\r
- .getChildFile ("DemoRunner" + getPlatformSpecificFileExtension());\r
\r
- #if JUCE_MAC\r
- if (prebuiltFile.exists())\r
- #else\r
- if (prebuiltFile.existsAsFile())\r
+ extension = {};\r
#endif\r
- return prebuiltFile;\r
\r
- return {};\r
-}\r
+ auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
\r
-void ProjucerApplication::checkIfGlobalJUCEPathHasChanged()\r
-{\r
- auto globalJUCEPath = File (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get());\r
-\r
- if (lastJUCEPath != globalJUCEPath)\r
+ if (juceDir.isNotEmpty())\r
{\r
- hasScannedForDemoRunnerProject = false;\r
- hasScannedForDemoRunnerExecutable = false;\r
+ auto precompiledFile = File (juceDir).getChildFile ("DemoRunner" + extension);\r
\r
- lastJUCEPath = globalJUCEPath;\r
+ #if JUCE_MAC\r
+ if (precompiledFile.exists())\r
+ #else\r
+ if (precompiledFile.existsAsFile())\r
+ #endif\r
+ return precompiledFile;\r
}\r
-}\r
-\r
-File ProjucerApplication::tryToFindDemoRunnerExecutable()\r
-{\r
- checkIfGlobalJUCEPathHasChanged();\r
-\r
- if (hasScannedForDemoRunnerExecutable)\r
- return lastDemoRunnerExectuableFile;\r
-\r
- hasScannedForDemoRunnerExecutable = true;\r
-\r
- auto demoRunnerExecutable = tryToFindDemoRunnerExecutableInBuilds();\r
\r
- if (demoRunnerExecutable == File())\r
- demoRunnerExecutable = tryToFindPrebuiltDemoRunnerExecutable();\r
\r
- lastDemoRunnerExectuableFile = demoRunnerExecutable;\r
-\r
- return demoRunnerExecutable;\r
+ return {};\r
}\r
\r
-File ProjucerApplication::tryToFindDemoRunnerProject()\r
+File ProjucerApplication::findDemoRunnerProject() noexcept\r
{\r
- checkIfGlobalJUCEPathHasChanged();\r
-\r
- if (hasScannedForDemoRunnerProject)\r
- return lastDemoRunnerProjectFile;\r
-\r
- hasScannedForDemoRunnerProject = true;\r
+ auto buildsPath = getJUCEExamplesDirectoryPathFromGlobal().getChildFile ("DemoRunner").getChildFile ("Builds");\r
\r
- auto projectFolder = getPlatformSpecificProjectFolder();\r
-\r
- if (projectFolder == File())\r
- {\r
- lastDemoRunnerProjectFile = File();\r
+ if (! buildsPath.exists())\r
return {};\r
- }\r
\r
#if JUCE_MAC\r
- auto demoRunnerProjectFile = projectFolder.getChildFile ("DemoRunner.xcodeproj");\r
+ auto file = buildsPath.getChildFile ("MacOSX").getChildFile ("DemoRunner.xcodeproj");\r
+\r
+ if (file.exists())\r
+ return file;\r
#elif JUCE_WINDOWS\r
- auto demoRunnerProjectFile = projectFolder.getChildFile ("DemoRunner.sln");\r
+ auto file = buildsPath.getChildFile ("VisualStudio2017").getChildFile ("DemoRunner.sln");\r
+\r
+ if (file.existsAsFile())\r
+ return file;\r
#elif JUCE_LINUX\r
- auto demoRunnerProjectFile = projectFolder.getChildFile ("Makefile");\r
- #endif\r
+ auto file = buildsPath.getChildFile ("LinuxMakeFile").getChildFile ("Makefile");\r
\r
- #if JUCE_MAC\r
- if (! demoRunnerProjectFile.exists())\r
- #else\r
- if (! demoRunnerProjectFile.existsAsFile())\r
+ if (file.existsAsFile())\r
+ return file;\r
#endif\r
- demoRunnerProjectFile = File();\r
\r
- lastDemoRunnerProjectFile = demoRunnerProjectFile;\r
-\r
- return demoRunnerProjectFile;\r
+ return {};\r
}\r
\r
void ProjucerApplication::launchDemoRunner()\r
{\r
- auto demoRunnerFile = tryToFindDemoRunnerExecutable();\r
-\r
- if (demoRunnerFile != File())\r
+ if (findDemoRunnerExecutable() != File())\r
{\r
- auto succeeded = demoRunnerFile.startAsProcess();\r
+ bool succeeded = true;\r
+\r
+ if (! findDemoRunnerExecutable().startAsProcess())\r
+ {\r
+ AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "There was an error opening the Demo Runner file.");\r
+ succeeded = false;\r
+ }\r
\r
StringPairArray data;\r
data.set ("label", succeeded ? "Success" : "Failure");\r
\r
Analytics::getInstance()->logEvent ("Launch DemoRunner", data, ProjucerAnalyticsEvent::exampleEvent);\r
-\r
- if (succeeded)\r
- return;\r
}\r
-\r
- demoRunnerFile = tryToFindDemoRunnerProject();\r
-\r
- if (demoRunnerFile != File())\r
+ else if (findDemoRunnerProject() != File())\r
{\r
auto& lf = Desktop::getInstance().getDefaultLookAndFeel();\r
-\r
demoRunnerAlert.reset (lf.createAlertWindow ("Open Project",\r
"Couldn't find a compiled version of the Demo Runner."\r
#if JUCE_LINUX\r
AlertWindow::QuestionIcon, 2,\r
mainWindowList.getFrontmostWindow (false)));\r
\r
- demoRunnerAlert->enterModalState (true, ModalCallbackFunction::create ([this, demoRunnerFile] (int retVal)\r
+ demoRunnerAlert->enterModalState (true, ModalCallbackFunction::create ([this] (int retVal)\r
{\r
demoRunnerAlert.reset (nullptr);\r
\r
\r
if (retVal == 1)\r
{\r
+ auto projectFile = findDemoRunnerProject();\r
+\r
#if JUCE_LINUX\r
- String command ("make -C " + demoRunnerFile.getParentDirectory().getFullPathName() + " CONFIG=Release -j3");\r
+ String command ("make -C " + projectFile.getParentDirectory().getFullPathName() + " CONFIG=Release -j3");\r
\r
if (! makeProcess.start (command))\r
AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "Error building Demo Runner.");\r
#else\r
- demoRunnerFile.startAsProcess();\r
+ projectFile.startAsProcess();\r
#endif\r
}\r
}), false);\r
}\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
}\r
\r
-//==========================================================================\r
void ProjucerApplication::handleMainMenuCommand (int menuItemID)\r
{\r
if (menuItemID >= recentProjectsBaseID && menuItemID < (recentProjectsBaseID + 100))\r
\r
case CommandIDs::newPIP:\r
result.setInfo ("New PIP...", "Opens the PIP Creator utility for creating a new PIP", CommandCategories::general, 0);\r
- result.defaultKeypresses.add (KeyPress ('p', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0));\r
+ result.defaultKeypresses.add (KeyPress ('p', ModifierKeys::commandModifier, 0));\r
break;\r
\r
case CommandIDs::launchDemoRunner:\r
else\r
#endif\r
{\r
- result.setInfo ("Launch Demo Runner", "Launches the JUCE demo runner application, or the project if it can't be found", CommandCategories::general, 0);\r
- result.setActive (tryToFindDemoRunnerExecutable() != File() || tryToFindDemoRunnerProject() != File());\r
+ result.setInfo ("Launch Demo Runner", "Launches the JUCE demo runner application, or the project if it can't be found", CommandCategories::general, 0);\r
+ result.setActive (findDemoRunnerExecutable() != File() || findDemoRunnerProject() != File());\r
}\r
break;\r
\r
case CommandIDs::newPIP: createNewPIP(); break;\r
case CommandIDs::open: askUserToOpenFile(); break;\r
case CommandIDs::launchDemoRunner: launchDemoRunner(); break;\r
- case CommandIDs::saveAll: saveAllDocuments(); break;\r
+ case CommandIDs::saveAll: openDocumentManager.saveAll(); break;\r
case CommandIDs::closeAllWindows: closeAllMainWindowsAndQuitIfNeeded(); break;\r
case CommandIDs::closeAllDocuments: closeAllDocuments (true); break;\r
case CommandIDs::clearRecentFiles: clearRecentFiles(); break;\r
return mainWindowList.openFile (file);\r
}\r
\r
-void ProjucerApplication::saveAllDocuments()\r
-{\r
- openDocumentManager.saveAll();\r
-\r
- for (int i = 0; i < mainWindowList.windows.size(); ++i)\r
- if (auto* pcc = mainWindowList.windows.getUnchecked(i)->getProjectContentComponent())\r
- pcc->refreshProjectTreeFileStatuses();\r
-}\r
-\r
bool ProjucerApplication::closeAllDocuments (bool askUserToSave)\r
{\r
return openDocumentManager.closeAll (askUserToSave);\r
else\r
new FloatingToolWindow ("Global Paths", "pathsWindowPos",\r
new GlobalPathsWindowComponent(), pathsWindow, false,\r
- 600, 700, 600, 700, 600, 700);\r
+ 600, 650, 600, 650, 600, 650);\r
\r
if (highlightJUCEPath)\r
if (auto* pathsComp = dynamic_cast<GlobalPathsWindowComponent*> (pathsWindow->getChildComponent (0)))\r
registerGUIEditorCommands();\r
}\r
\r
+void ProjucerApplication::deleteTemporaryFiles() const noexcept\r
+{\r
+ auto tempDirectory = File::getSpecialLocation (File::SpecialLocationType::tempDirectory).getChildFile ("PIPs");\r
+\r
+ if (tempDirectory.exists())\r
+ tempDirectory.deleteRecursively();\r
+}\r
+\r
void ProjucerApplication::setAnalyticsEnabled (bool enabled)\r
{\r
resetAnalytics();\r
\r
}\r
\r
-void ProjucerApplication::rescanJUCEPathModules()\r
-{\r
- File jucePath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString());\r
-\r
- if (isRunningCommandLine)\r
- jucePathModuleList.scanPaths ({ jucePath });\r
- else\r
- jucePathModuleList.scanPathsAsync ({ jucePath });\r
-}\r
-\r
-static Array<File> getSanitisedUserModulePaths()\r
-{\r
- Array<File> paths;\r
-\r
- for (auto p : StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath, TargetOS::getThisOS()).get().toString(), ";", {}))\r
- {\r
- p = p.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
- paths.add (File::createFileWithoutCheckingPath (p.trim()));\r
- }\r
-\r
- return paths;\r
-}\r
-\r
-void ProjucerApplication::rescanUserPathModules()\r
-{\r
- if (isRunningCommandLine)\r
- userPathsModuleList.scanPaths (getSanitisedUserModulePaths());\r
- else\r
- userPathsModuleList.scanPathsAsync (getSanitisedUserModulePaths());\r
-}\r
-\r
void ProjucerApplication::selectEditorColourSchemeWithName (const String& schemeName)\r
{\r
auto& appearanceSettings = getAppSettings().appearance;\r
void createNewPIP();\r
void askUserToOpenFile();\r
bool openFile (const File&);\r
- void saveAllDocuments();\r
bool closeAllDocuments (bool askUserToSave);\r
bool closeAllMainWindows();\r
void closeAllMainWindowsAndQuitIfNeeded();\r
//==============================================================================\r
void setAnalyticsEnabled (bool);\r
\r
- //==============================================================================\r
- void rescanJUCEPathModules();\r
- void rescanUserPathModules();\r
-\r
- AvailableModuleList& getJUCEPathModuleList() { return jucePathModuleList; }\r
- AvailableModuleList& getUserPathsModuleList() { return userPathsModuleList; }\r
-\r
//==============================================================================\r
ProjucerLookAndFeel lookAndFeel;\r
\r
std::unique_ptr<ApplicationCommandManager> commandManager;\r
\r
std::unique_ptr<Component> utf8Window, svgPathWindow, aboutWindow, applicationUsageDataWindow,\r
- pathsWindow, editorColourSchemeWindow, pipCreatorWindow;\r
+ pathsWindow, editorColourSchemeWindow, pipCreatorWindow;\r
\r
std::unique_ptr<FileLogger> logger;\r
\r
std::unique_ptr<LicenseController> licenseController;\r
\r
private:\r
- //==============================================================================\r
+ void* server = nullptr;\r
+\r
+ std::unique_ptr<LatestVersionChecker> versionChecker;\r
+ TooltipWindow tooltipWindow;\r
+\r
+ void loginOrLogout();\r
+\r
+ bool checkEULA();\r
+ bool currentEULAHasBeenAcceptedPreviously() const;\r
+ String getEULAChecksumProperty() const;\r
+ void setCurrentEULAAccepted (bool hasBeenAccepted) const;\r
+\r
void handleAsyncUpdate() override;\r
void initCommandManager();\r
\r
+ void deleteTemporaryFiles() const noexcept;\r
+\r
void createExamplesPopupMenu (PopupMenu&) noexcept;\r
Array<File> getSortedExampleDirectories() noexcept;\r
Array<File> getSortedExampleFilesInDirectory (const File&) const noexcept;\r
+\r
bool findWindowAndOpenPIP (const File&);\r
- void findAndLaunchExample (int);\r
\r
- void checkIfGlobalJUCEPathHasChanged();\r
- File tryToFindDemoRunnerExecutable();\r
- File tryToFindDemoRunnerProject();\r
+ File getJUCEExamplesDirectoryPathFromGlobal() noexcept;\r
+ void findAndLaunchExample (int);\r
+ File findDemoRunnerExecutable() noexcept;\r
+ File findDemoRunnerProject() noexcept;\r
void launchDemoRunner();\r
\r
+ int numExamples = 0;\r
+ std::unique_ptr<AlertWindow> demoRunnerAlert;\r
+\r
+ #if JUCE_LINUX\r
+ ChildProcess makeProcess;\r
+ #endif\r
+\r
void resetAnalytics() noexcept;\r
void setupAnalytics();\r
\r
void showSetJUCEPathAlert();\r
+ std::unique_ptr<AlertWindow> pathAlert;\r
\r
+ //==============================================================================\r
void setColourScheme (int index, bool saveSetting);\r
+\r
void setEditorColourScheme (int index, bool saveSetting);\r
void updateEditorColourSchemeIfNeeded();\r
\r
- //==============================================================================\r
- void* server = nullptr;\r
-\r
- std::unique_ptr<LatestVersionChecker> versionChecker;\r
- TooltipWindow tooltipWindow;\r
-\r
- AvailableModuleList jucePathModuleList, userPathsModuleList;\r
-\r
- int numExamples = 0;\r
- std::unique_ptr<AlertWindow> demoRunnerAlert;\r
- std::unique_ptr<AlertWindow> pathAlert;\r
- bool hasScannedForDemoRunnerExecutable = false, hasScannedForDemoRunnerProject = false;\r
- File lastJUCEPath, lastDemoRunnerExectuableFile, lastDemoRunnerProjectFile;\r
- #if JUCE_LINUX\r
- ChildProcess makeProcess;\r
- #endif\r
-\r
- int selectedColourSchemeIndex = 0, selectedEditorColourSchemeIndex = 0, numEditorColourSchemes = 0;\r
+ int selectedColourSchemeIndex = 0;\r
\r
- //==============================================================================\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjucerApplication)\r
+ int selectedEditorColourSchemeIndex = 0;\r
+ int numEditorColourSchemes = 0;\r
};\r
\r
void LatestVersionChecker::askUserForLocationToDownload (URL& newVersionToDownload, const String& extraHeaders)\r
{\r
- File targetFolder (getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get());\r
+ File targetFolder (EnabledModuleList::findGlobalModulesFolder());\r
+\r
+ if (isJUCEModulesFolder (targetFolder))\r
+ targetFolder = targetFolder.getParentDirectory();\r
\r
FileChooser chooser (TRANS("Please select the location into which you'd like to install the new version"),\r
- targetFolder);\r
+ targetFolder);\r
\r
if (chooser.browseForDirectory())\r
{\r
*/\r
\r
#include "jucer_Headers.h"\r
-#include "jucer_Application.h"\r
+#include "../Project/jucer_Module.h"\r
#include "../Utility/Helpers/jucer_TranslationHelpers.h"\r
+#include "../Utility/PIPs/jucer_PIPGenerator.h"\r
\r
#include "jucer_CommandLine.h"\r
\r
//==============================================================================\r
namespace\r
{\r
+ struct CommandLineError\r
+ {\r
+ CommandLineError (const String& s) : message (s) {}\r
+\r
+ String message;\r
+ };\r
+\r
static void hideDockIcon()\r
{\r
#if JUCE_MAC\r
#endif\r
}\r
\r
+ static bool matchArgument (const String& arg, const String& possible)\r
+ {\r
+ return arg == possible\r
+ || arg == "-" + possible\r
+ || arg == "--" + possible;\r
+ }\r
+\r
+ static void checkArgumentCount (const StringArray& args, int minNumArgs)\r
+ {\r
+ if (args.size() < minNumArgs)\r
+ throw CommandLineError ("Not enough arguments!");\r
+ }\r
+\r
+ static bool findArgument (StringArray& args, const String& target)\r
+ {\r
+ for (int i = 0; i < args.size(); ++i)\r
+ {\r
+ if (args[i].trim() == target)\r
+ {\r
+ args.remove (i);\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ static File getFile (const String& filename)\r
+ {\r
+ return File::getCurrentWorkingDirectory().getChildFile (filename.unquoted());\r
+ }\r
+\r
+ static File getDirectoryCheckingForExistence (const String& filename)\r
+ {\r
+ File f = getFile (filename);\r
+\r
+ if (! f.isDirectory())\r
+ throw CommandLineError ("Could not find folder: " + f.getFullPathName());\r
+\r
+ return f;\r
+ }\r
+\r
+ static File getFileCheckingForExistence (const String& filename)\r
+ {\r
+ File f = getFile (filename);\r
+\r
+ if (! f.exists())\r
+ throw CommandLineError ("Could not find file: " + f.getFullPathName());\r
+\r
+ return f;\r
+ }\r
+\r
static Array<File> findAllSourceFiles (const File& folder)\r
{\r
Array<File> files;\r
TemporaryFile temp (file);\r
\r
if (! temp.getFile().replaceWithText (newText, false, false, nullptr))\r
- ConsoleApplication::fail ("!!! ERROR Couldn't write to temp file!");\r
+ throw CommandLineError ("!!! ERROR Couldn't write to temp file!");\r
\r
if (! temp.overwriteTargetFileWithTemporary())\r
- ConsoleApplication::fail ("!!! ERROR Couldn't write to file!");\r
+ throw CommandLineError ("!!! ERROR Couldn't write to file!");\r
}\r
\r
//==============================================================================\r
struct LoadedProject\r
{\r
- LoadedProject (const ArgumentList::Argument& fileToLoad)\r
+ LoadedProject (const String& fileToLoad)\r
{\r
hideDockIcon();\r
\r
- auto projectFile = fileToLoad.resolveAsExistingFile();\r
+ auto projectFile = getFileCheckingForExistence (fileToLoad);\r
\r
if (! projectFile.hasFileExtension (Project::projectFileExtension))\r
- ConsoleApplication::fail (projectFile.getFullPathName() + " isn't a valid jucer project file!");\r
+ throw CommandLineError (projectFile.getFullPathName() + " isn't a valid jucer project file!");\r
\r
project.reset (new Project (projectFile));\r
\r
if (! project->loadFrom (projectFile, true))\r
{\r
project.reset();\r
- ConsoleApplication::fail ("Failed to load the project file: " + projectFile.getFullPathName());\r
+ throw CommandLineError ("Failed to load the project file: " + projectFile.getFullPathName());\r
}\r
}\r
\r
{\r
if (project != nullptr)\r
{\r
- if (! justSaveResources)\r
- rescanModulePathsIfNecessary();\r
-\r
auto error = justSaveResources ? project->saveResourcesOnly (project->getFile())\r
: project->saveProject (project->getFile(), true);\r
\r
project.reset();\r
\r
if (error.failed())\r
- ConsoleApplication::fail ("Error when saving: " + error.getErrorMessage());\r
- }\r
- }\r
-\r
- void rescanModulePathsIfNecessary()\r
- {\r
- bool scanJUCEPath = false, scanUserPaths = false;\r
-\r
- const auto& modules = project->getEnabledModules();\r
-\r
- for (auto i = modules.getNumModules(); --i >= 0;)\r
- {\r
- const auto& id = modules.getModuleID (i);\r
-\r
- if (isJUCEModule (id) && ! scanJUCEPath)\r
- {\r
- if (modules.shouldUseGlobalPath (id))\r
- scanJUCEPath = true;\r
- }\r
- else if (! scanUserPaths)\r
- {\r
- if (modules.shouldUseGlobalPath (id))\r
- scanUserPaths = true;\r
- }\r
+ throw CommandLineError ("Error when saving: " + error.getErrorMessage());\r
}\r
-\r
- if (scanJUCEPath)\r
- ProjucerApplication::getApp().rescanJUCEPathModules();\r
-\r
- if (scanUserPaths)\r
- ProjucerApplication::getApp().rescanUserPathModules();\r
}\r
\r
std::unique_ptr<Project> project;\r
/* Running a command-line of the form "projucer --resave foobar.jucer" will try to load\r
that project and re-export all of its targets.\r
*/\r
- static void resaveProject (const ArgumentList& args, bool justSaveResources)\r
+ static void resaveProject (const StringArray& args, bool justSaveResources)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
LoadedProject proj (args[1]);\r
\r
std::cout << (justSaveResources ? "Re-saving project resources: "\r
}\r
\r
//==============================================================================\r
- static void getVersion (const ArgumentList& args)\r
+ static void getVersion (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
LoadedProject proj (args[1]);\r
\r
std::cout << proj.project->getVersionString() << std::endl;\r
}\r
\r
//==============================================================================\r
- static void setVersion (const ArgumentList& args)\r
+ static void setVersion (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 3);\r
LoadedProject proj (args[2]);\r
\r
- String version (args[1].text.trim());\r
+ String version (args[1].trim());\r
\r
std::cout << "Setting project version: " << version << std::endl;\r
\r
}\r
\r
//==============================================================================\r
- static void bumpVersion (const ArgumentList& args)\r
+ static void bumpVersion (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
LoadedProject proj (args[1]);\r
\r
String version = proj.project->getVersionString();\r
proj.save (false);\r
}\r
\r
- static void gitTag (const ArgumentList& args)\r
+ static void gitTag (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
LoadedProject proj (args[1]);\r
\r
String version (proj.project->getVersionString());\r
\r
if (version.trim().isEmpty())\r
- ConsoleApplication::fail ("Cannot read version number from project!");\r
+ throw CommandLineError ("Cannot read version number from project!");\r
\r
StringArray command;\r
command.add ("git");\r
ChildProcess c;\r
\r
if (! c.start (command, 0))\r
- ConsoleApplication::fail ("Cannot run git!");\r
+ throw CommandLineError ("Cannot run git!");\r
\r
c.waitForProcessToFinish (10000);\r
\r
if (c.getExitCode() != 0)\r
- ConsoleApplication::fail ("git command failed!");\r
+ throw CommandLineError ("git command failed!");\r
}\r
\r
//==============================================================================\r
- static void showStatus (const ArgumentList& args)\r
+ static void showStatus (const StringArray& args)\r
{\r
hideDockIcon();\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
\r
LoadedProject proj (args[1]);\r
\r
<< "Name: " << proj.project->getProjectNameString() << std::endl\r
<< "UID: " << proj.project->getProjectUIDString() << std::endl;\r
\r
- EnabledModuleList& modules = proj.project->getEnabledModules();\r
+ EnabledModuleList& modules = proj.project->getModules();\r
\r
if (int numModules = modules.getNumModules())\r
{\r
{\r
jassert (targetFolder.isDirectory());\r
\r
- auto moduleFolderParent = moduleFolder.getParentDirectory();\r
+ const File moduleFolderParent (moduleFolder.getParentDirectory());\r
LibraryModule module (moduleFolder);\r
\r
if (! module.isValid())\r
- ConsoleApplication::fail (moduleFolder.getFullPathName() + " is not a valid module folder!");\r
+ throw CommandLineError (moduleFolder.getFullPathName() + " is not a valid module folder!");\r
\r
- auto targetFile = targetFolder.getChildFile (getModulePackageName (module));\r
+ const File targetFile (targetFolder.getChildFile (getModulePackageName (module)));\r
\r
ZipFile::Builder zip;\r
\r
std::cout << "Writing: " << targetFile.getFullPathName() << std::endl;\r
\r
TemporaryFile temp (targetFile);\r
+ std::unique_ptr<FileOutputStream> out (temp.getFile().createOutputStream());\r
\r
- {\r
- FileOutputStream out (temp.getFile());\r
+ bool ok = out != nullptr && zip.writeToStream (*out, nullptr);\r
+ out.reset();\r
+ ok = ok && temp.overwriteTargetFileWithTemporary();\r
\r
- if (! (out.openedOk() && zip.writeToStream (out, nullptr)))\r
- ConsoleApplication::fail ("Failed to write to the target file: " + targetFile.getFullPathName());\r
- }\r
-\r
- if (! temp.overwriteTargetFileWithTemporary())\r
- ConsoleApplication::fail ("Failed to write to the target file: " + targetFile.getFullPathName());\r
+ if (! ok)\r
+ throw CommandLineError ("Failed to write to the target file: " + targetFile.getFullPathName());\r
}\r
\r
- static void buildModules (const ArgumentList& args, const bool buildAllWithIndex)\r
+ static void buildModules (const StringArray& args, const bool buildAllWithIndex)\r
{\r
hideDockIcon();\r
- args.checkMinNumArguments (3);\r
+ checkArgumentCount (args, 3);\r
\r
- auto targetFolder = args[1].resolveAsFile();\r
+ const File targetFolder (getFile (args[1]));\r
\r
if (! targetFolder.isDirectory())\r
- ConsoleApplication::fail ("The first argument must be the directory to put the result.");\r
+ throw CommandLineError ("The first argument must be the directory to put the result.");\r
\r
if (buildAllWithIndex)\r
{\r
- auto folderToSearch = args[2].resolveAsFile();\r
+ const File folderToSearch (getFile (args[2]));\r
DirectoryIterator i (folderToSearch, false, "*", File::findDirectories);\r
var infoList;\r
\r
}\r
}\r
\r
- auto indexFile = targetFolder.getChildFile ("modulelist");\r
+ const File indexFile (targetFolder.getChildFile ("modulelist"));\r
std::cout << "Writing: " << indexFile.getFullPathName() << std::endl;\r
indexFile.replaceWithText (JSON::toString (infoList), false, false);\r
}\r
else\r
{\r
for (int i = 2; i < args.size(); ++i)\r
- zipModule (targetFolder, args[i].resolveAsFile());\r
+ zipModule (targetFolder, getFile (args[i]));\r
}\r
}\r
\r
: "Cleaning file: ");\r
}\r
\r
- static void scanFilesForCleanup (const ArgumentList& args, CleanupOptions options)\r
+ static void scanFilesForCleanup (const StringArray& args, CleanupOptions options)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
\r
- for (auto it = args.arguments.begin() + 1; it < args.arguments.end(); ++it)\r
+ for (auto it = args.begin() + 1; it < args.end(); ++it)\r
{\r
- auto target = it->resolveAsFile();\r
+ auto target = getFileCheckingForExistence (*it);\r
\r
Array<File> files;\r
\r
}\r
}\r
\r
- static void cleanWhitespace (const ArgumentList& args, bool replaceTabs)\r
+ static void cleanWhitespace (const StringArray& args, bool replaceTabs)\r
{\r
CleanupOptions options = { replaceTabs, false };\r
scanFilesForCleanup (args, options);\r
}\r
\r
- static void tidyDividerComments (const ArgumentList& args)\r
+ static void tidyDividerComments (const StringArray& args)\r
{\r
CleanupOptions options = { false, true };\r
scanFilesForCleanup (args, options);\r
}\r
}\r
\r
- static void fixRelativeIncludePaths (const ArgumentList& args)\r
+ static void fixRelativeIncludePaths (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
- auto target = args[1].resolveAsExistingFolder();\r
+ checkArgumentCount (args, 2);\r
+ auto target = getDirectoryCheckingForExistence (args[1]);\r
auto files = findAllSourceFiles (target);\r
\r
for (int i = 0; i < files.size(); ++i)\r
+ " + " + getStringConcatenationExpression (rng, start + breakPos, length - breakPos) + ")";\r
}\r
\r
- static void generateObfuscatedStringCode (const ArgumentList& args)\r
+ static void generateObfuscatedStringCode (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
- auto originalText = args[1].text.unquoted();\r
+ checkArgumentCount (args, 2);\r
+ const String originalText (args[1].unquoted());\r
\r
struct Section\r
{\r
std::cout << out.toString() << std::endl;\r
}\r
\r
- static void scanFoldersForTranslationFiles (const ArgumentList& args)\r
+ static void scanFoldersForTranslationFiles (const StringArray& args)\r
{\r
- args.checkMinNumArguments (2);\r
+ checkArgumentCount (args, 2);\r
\r
StringArray translations;\r
\r
- for (auto it = args.arguments.begin() + 1; it != args.arguments.end(); ++it)\r
+ for (auto it = args.begin() + 1; it != args.end(); ++it)\r
{\r
- auto directoryToSearch = it->resolveAsExistingFolder();\r
+ const File directoryToSearch (getDirectoryCheckingForExistence (*it));\r
TranslationHelpers::scanFolderForTranslations (translations, directoryToSearch);\r
}\r
\r
std::cout << TranslationHelpers::mungeStrings (translations) << std::endl;\r
}\r
\r
- static void createFinishedTranslationFile (const ArgumentList& args)\r
+ static void createFinishedTranslationFile (const StringArray& args)\r
{\r
- args.checkMinNumArguments (3);\r
+ checkArgumentCount (args, 3);\r
\r
- auto preTranslated = args[1].resolveAsExistingFile().loadFileAsString();\r
- auto postTranslated = args[2].resolveAsExistingFile().loadFileAsString();\r
+ auto preTranslated = getFileCheckingForExistence (args[1]).loadFileAsString();\r
+ auto postTranslated = getFileCheckingForExistence (args[2]).loadFileAsString();\r
\r
- auto localisedContent = (args.size() > 3 ? args[3].resolveAsExistingFile().loadFileAsString() : String());\r
+ auto localisedContent = (args.size() > 3 ? getFileCheckingForExistence (args[3]).loadFileAsString() : String());\r
auto localised = LocalisedStrings (localisedContent, false);\r
\r
using TH = TranslationHelpers;\r
}\r
\r
//==============================================================================\r
- static void encodeBinary (const ArgumentList& args)\r
+ static void encodeBinary (const StringArray& args)\r
{\r
- args.checkMinNumArguments (3);\r
- auto source = args[1].resolveAsExistingFile();\r
- auto target = args[2].resolveAsExistingFile();\r
+ checkArgumentCount (args, 3);\r
+ const File source (getFileCheckingForExistence (args[1]));\r
+ const File target (getFile (args[2]));\r
\r
MemoryOutputStream literal;\r
size_t dataSize = 0;\r
}\r
else\r
{\r
- ConsoleApplication::fail ("You need to specify a .h or .cpp file as the target");\r
+ throw CommandLineError ("You need to specify a .h or .cpp file as the target");\r
}\r
}\r
\r
else if (os == "linux") targetOS = TargetOS::linux;\r
\r
if (targetOS == TargetOS::unknown)\r
- ConsoleApplication::fail ("You need to specify a valid OS! Use osx, windows or linux");\r
+ throw CommandLineError ("You need to specify a valid OS! Use osx, windows or linux");\r
\r
return targetOS == TargetOS::getThisOS();\r
}\r
|| id == "androidSDKPath" || id == "androidNDKPath" || id == "defaultJuceModulePath" || id == "defaultUserModulePath";\r
}\r
\r
- static void checkIfUserModulesPathsAreValid (const String& list)\r
+ static void setGlobalPath (const StringArray& args)\r
{\r
- for (auto& p : StringArray::fromTokens (list, ";", {}))\r
- if (! File (p.trim()).exists())\r
- ConsoleApplication::fail (p + " doesn't exist!");\r
- }\r
+ checkArgumentCount (args, 3);\r
\r
- static void setGlobalPath (const ArgumentList& args)\r
- {\r
- args.checkMinNumArguments (3);\r
-\r
- if (! isValidPathIdentifier (args[2].text, args[1].text))\r
- ConsoleApplication::fail ("Identifier " + args[2].text + " is not valid for the OS " + args[1].text);\r
+ if (! isValidPathIdentifier (args[2], args[1]))\r
+ throw CommandLineError ("Identifier " + args[2] + " is not valid for the OS " + args[1]);\r
\r
auto userAppData = File::getSpecialLocation (File::userApplicationDataDirectory);\r
\r
#endif\r
\r
auto settingsFile = userAppData.getChildFile ("Projucer").getChildFile ("Projucer.settings");\r
- auto xml = parseXML (settingsFile);\r
-\r
- if (xml == nullptr)\r
- ConsoleApplication::fail ("Settings file not valid!");\r
-\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (settingsFile));\r
auto settingsTree = ValueTree::fromXml (*xml);\r
\r
if (! settingsTree.isValid())\r
- ConsoleApplication::fail ("Settings file not valid!");\r
+ throw CommandLineError ("Settings file not valid!");\r
\r
ValueTree childToSet;\r
-\r
- if (isThisOS (args[1].text))\r
+ if (isThisOS (args[1]))\r
{\r
childToSet = settingsTree.getChildWithProperty (Ids::name, "PROJECT_DEFAULT_SETTINGS")\r
- .getOrCreateChildWithName ("PROJECT_DEFAULT_SETTINGS", nullptr);\r
+ .getChildWithName ("PROJECT_DEFAULT_SETTINGS");\r
}\r
else\r
{\r
childToSet = settingsTree.getChildWithProperty (Ids::name, "FALLBACK_PATHS")\r
- .getOrCreateChildWithName ("FALLBACK_PATHS", nullptr)\r
- .getOrCreateChildWithName (args[1].text + "Fallback", nullptr);\r
+ .getChildWithName ("FALLBACK_PATHS")\r
+ .getChildWithName (args[1] + String ("Fallback"));\r
}\r
\r
if (! childToSet.isValid())\r
- ConsoleApplication::fail ("Failed to set the requested setting!");\r
-\r
- if (args[2].text == Ids::defaultUserModulePath.toString())\r
- {\r
- auto pathList = args[3].text.removeCharacters ("\"");\r
+ throw CommandLineError ("Failed to set the requested setting!");\r
\r
- if (isThisOS (args[1].text))\r
- checkIfUserModulesPathsAreValid (pathList);\r
-\r
- childToSet.setProperty (args[2].text, pathList, nullptr);\r
- }\r
- else\r
- {\r
- childToSet.setProperty (args[2].text, args[3].resolveAsFile().getFullPathName(), nullptr);\r
- }\r
+ childToSet.setProperty (args[2], File::getCurrentWorkingDirectory().getChildFile (args[3]).getFullPathName(), nullptr);\r
\r
settingsFile.replaceWithText (settingsTree.toXmlString());\r
}\r
\r
- static void createProjectFromPIP (const ArgumentList& args)\r
+ static void createProjectFromPIP (const StringArray& args)\r
{\r
- args.checkMinNumArguments (3);\r
-\r
- auto pipFile = args[1].resolveAsFile();\r
+ checkArgumentCount (args, 3);\r
\r
+ auto pipFile = File::getCurrentWorkingDirectory().getChildFile (args[1].unquoted());\r
if (! pipFile.existsAsFile())\r
- ConsoleApplication::fail ("PIP file doesn't exist.");\r
-\r
- auto outputDir = args[2].resolveAsFile();\r
+ throw CommandLineError ("PIP file doesn't exist.");\r
\r
+ auto outputDir = File::getCurrentWorkingDirectory().getChildFile (args[2].unquoted());\r
if (! outputDir.exists())\r
{\r
auto res = outputDir.createDirectory();\r
std::cout << "Creating directory " << outputDir.getFullPathName() << std::endl;\r
}\r
\r
- File juceModulesPath;\r
- Array<File> userModulesPaths;\r
-\r
- if (args.size() > 3)\r
- {\r
- juceModulesPath = args[3].resolveAsFile();\r
-\r
- if (! juceModulesPath.exists())\r
- ConsoleApplication::fail ("Specified JUCE modules directory doesn't exist.");\r
-\r
- if (args.size() == 5)\r
- {\r
- auto pathList = args[4].text.removeCharacters ("\"");\r
- checkIfUserModulesPathsAreValid (pathList);\r
-\r
- for (auto& p : StringArray::fromTokens (pathList, ";", {}))\r
- userModulesPaths.add ({ p });\r
- }\r
- }\r
-\r
- PIPGenerator generator (pipFile, outputDir, juceModulesPath, userModulesPaths);\r
-\r
- auto createJucerFileResult = generator.createJucerFile();\r
+ PIPGenerator generator (pipFile, outputDir);\r
\r
- if (! createJucerFileResult)\r
- ConsoleApplication::fail (createJucerFileResult.getErrorMessage());\r
+ if (! generator.createJucerFile())\r
+ throw CommandLineError ("Failed to create .jucer file in " + outputDir.getFullPathName()+ ".");\r
\r
- auto createMainCppResult = generator.createMainCpp();\r
-\r
- if (! createMainCppResult)\r
- ConsoleApplication::fail (createMainCppResult.getErrorMessage());\r
+ if (! generator.createMainCpp())\r
+ throw CommandLineError ("Failed to create Main.cpp.");\r
}\r
\r
//==============================================================================\r
<< std::endl\r
<< " " << appName << " --set-global-search-path os identifier_to_set new_path" << std::endl\r
<< " Sets the global path for a specified os and identifier. The os should be either osx, windows or linux and the identifiers can be any of the following: "\r
- << "defaultJuceModulePath, defaultUserModulePath, vst3Path, aaxPath (not valid on linux), rtasPath (not valid on linux), androidSDKPath or androidNDKPath. "\r
- "When setting defaultUserModulePath you can specify multiple paths by surrounding a semicolon-separated list of paths with double quotes \"like;so\"" << std::endl\r
+ << "defaultJuceModulePath, defaultUserModulePath, vst3path, aaxPath (not valid on linux), rtasPath (not valid on linux), androidSDKPath or androidNDKPath." << std::endl\r
<< std::endl\r
- << " " << appName << " --create-project-from-pip path/to/PIP path/to/output path/to/JUCE/modules (optional) path/to/user/modules (optional)" << std::endl\r
- << " Generates a folder containing a JUCE project in the specified output path using the specified PIP file. Use the optional JUCE and user module paths to override "\r
- "the global module paths (you can specify multiple user module paths by using a semicolon-separated list)." << std::endl\r
+ << " " << appName << " --create-project-from-pip path/to/PIP path/to/output" << std::endl\r
+ << " Generates a JUCE project from a PIP file." << std::endl\r
<< std::endl\r
<< "Note that for any of the file-rewriting commands, add the option \"--lf\" if you want it to use LF linefeeds instead of CRLF" << std::endl\r
<< std::endl;\r
}\r
\r
//==============================================================================\r
-int performCommandLine (const ArgumentList& args)\r
+int performCommandLine (const String& commandLine)\r
{\r
- return ConsoleApplication::invokeCatchingFailures ([&] () -> int\r
+ StringArray args;\r
+ args.addTokens (commandLine, true);\r
+ args.trim();\r
+\r
+ if (findArgument (args, "--lf") || findArgument (args, "-lf"))\r
+ preferredLinefeed = "\n";\r
+\r
+ String command (args[0]);\r
+\r
+ try\r
+ {\r
+ if (matchArgument (command, "help")) { showHelp(); return 0; }\r
+ if (matchArgument (command, "h")) { showHelp(); return 0; }\r
+ if (matchArgument (command, "resave")) { resaveProject (args, false); return 0; }\r
+ if (matchArgument (command, "resave-resources")) { resaveProject (args, true); return 0; }\r
+ if (matchArgument (command, "get-version")) { getVersion (args); return 0; }\r
+ if (matchArgument (command, "set-version")) { setVersion (args); return 0; }\r
+ if (matchArgument (command, "bump-version")) { bumpVersion (args); return 0; }\r
+ if (matchArgument (command, "git-tag-version")) { gitTag (args); return 0; }\r
+ if (matchArgument (command, "buildmodule")) { buildModules (args, false); return 0; }\r
+ if (matchArgument (command, "buildallmodules")) { buildModules (args, true); return 0; }\r
+ if (matchArgument (command, "status")) { showStatus (args); return 0; }\r
+ if (matchArgument (command, "trim-whitespace")) { cleanWhitespace (args, false); return 0; }\r
+ if (matchArgument (command, "remove-tabs")) { cleanWhitespace (args, true); return 0; }\r
+ if (matchArgument (command, "tidy-divider-comments")) { tidyDividerComments (args); return 0; }\r
+ if (matchArgument (command, "fix-broken-include-paths")) { fixRelativeIncludePaths (args); return 0; }\r
+ if (matchArgument (command, "obfuscated-string-code")) { generateObfuscatedStringCode (args); return 0; }\r
+ if (matchArgument (command, "encode-binary")) { encodeBinary (args); return 0; }\r
+ if (matchArgument (command, "trans")) { scanFoldersForTranslationFiles (args); return 0; }\r
+ if (matchArgument (command, "trans-finish")) { createFinishedTranslationFile (args); return 0; }\r
+ if (matchArgument (command, "set-global-search-path")) { setGlobalPath (args); return 0; }\r
+ if (matchArgument (command, "create-project-from-pip")) { createProjectFromPIP (args); return 0; }\r
+ }\r
+ catch (const CommandLineError& error)\r
{\r
- if (args.containsOption ("--lf"))\r
- preferredLinefeed = "\n";\r
-\r
- auto command = args[0];\r
-\r
- auto matchCommand = [&] (StringRef name) -> bool\r
- {\r
- return command == name || command.isLongOption (name);\r
- };\r
+ std::cout << error.message << std::endl << std::endl;\r
+ return 1;\r
+ }\r
\r
- if (matchCommand ("help")) { showHelp(); return 0; }\r
- if (matchCommand ("h")) { showHelp(); return 0; }\r
- if (matchCommand ("resave")) { resaveProject (args, false); return 0; }\r
- if (matchCommand ("resave-resources")) { resaveProject (args, true); return 0; }\r
- if (matchCommand ("get-version")) { getVersion (args); return 0; }\r
- if (matchCommand ("set-version")) { setVersion (args); return 0; }\r
- if (matchCommand ("bump-version")) { bumpVersion (args); return 0; }\r
- if (matchCommand ("git-tag-version")) { gitTag (args); return 0; }\r
- if (matchCommand ("buildmodule")) { buildModules (args, false); return 0; }\r
- if (matchCommand ("buildallmodules")) { buildModules (args, true); return 0; }\r
- if (matchCommand ("status")) { showStatus (args); return 0; }\r
- if (matchCommand ("trim-whitespace")) { cleanWhitespace (args, false); return 0; }\r
- if (matchCommand ("remove-tabs")) { cleanWhitespace (args, true); return 0; }\r
- if (matchCommand ("tidy-divider-comments")) { tidyDividerComments (args); return 0; }\r
- if (matchCommand ("fix-broken-include-paths")) { fixRelativeIncludePaths (args); return 0; }\r
- if (matchCommand ("obfuscated-string-code")) { generateObfuscatedStringCode (args); return 0; }\r
- if (matchCommand ("encode-binary")) { encodeBinary (args); return 0; }\r
- if (matchCommand ("trans")) { scanFoldersForTranslationFiles (args); return 0; }\r
- if (matchCommand ("trans-finish")) { createFinishedTranslationFile (args); return 0; }\r
- if (matchCommand ("set-global-search-path")) { setGlobalPath (args); return 0; }\r
- if (matchCommand ("create-project-from-pip")) { createProjectFromPIP (args); return 0; }\r
-\r
- if (command.isLongOption() || command.isShortOption())\r
- ConsoleApplication::fail ("Unrecognised command: " + command.text.quoted());\r
-\r
- return commandLineNotPerformed;\r
- });\r
+ return commandLineNotPerformed;\r
}\r
\r
#pragma once\r
\r
-int performCommandLine (const ArgumentList&);\r
+int performCommandLine (const String& commandLine);\r
\r
enum { commandLineNotPerformed = 0x72346231 };\r
jassert (windows.contains (w));\r
\r
#if ! JUCE_MAC\r
- if (windows.size() == 1 && ! isInReopenLastProjects)\r
+ if (windows.size() == 1)\r
{\r
JUCEApplicationBase::getInstance()->systemRequestedQuit();\r
}\r
\r
if (file.hasFileExtension (Project::projectFileExtension))\r
{\r
- WeakReference<Component> previousFrontWindow (getFrontmostWindow());\r
+ auto previousFrontWindow = getFrontmostWindow();\r
\r
auto* w = getOrCreateEmptyWindow();\r
bool ok = w->openFile (file);\r
closeWindow (w);\r
}\r
\r
- if (openInBackground && previousFrontWindow != nullptr)\r
+ if (openInBackground && (previousFrontWindow != nullptr))\r
previousFrontWindow->toFront (true);\r
\r
return ok;\r
\r
void MainWindowList::reopenLastProjects()\r
{\r
- const ScopedValueSetter<bool> setter (isInReopenLastProjects, true);\r
-\r
for (auto& p : getAppSettings().getLastProjects())\r
openFile (p, true);\r
}\r
OwnedArray<MainWindow> windows;\r
\r
private:\r
- bool isInReopenLastProjects = false;\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindowList)\r
};\r
{\r
setUsingNativeTitleBar (true);\r
setContentOwned (new %%content_component_class%%(), true);\r
-\r
- #if JUCE_IOS || JUCE_ANDROID\r
- setFullScreen (true);\r
- #else\r
setResizable (true, true);\r
- centreWithSize (getWidth(), getHeight());\r
- #endif\r
\r
+ centreWithSize (getWidth(), getHeight());\r
setVisible (true);\r
}\r
\r
setUsingNativeTitleBar (true);\r
setContentOwned (new %%content_component_class%%(), true);\r
\r
- #if JUCE_IOS || JUCE_ANDROID\r
- setFullScreen (true);\r
- #else\r
- setResizable (true, true);\r
centreWithSize (getWidth(), getHeight());\r
- #endif\r
-\r
setVisible (true);\r
}\r
\r
+++ /dev/null
-#if UNITY_EDITOR
-
-using UnityEditor;
-using UnityEngine;
-
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-
-public class %%plugin_class_name%%GUI : IAudioEffectPluginGUI
-{
- public override string Name { get { return "%%plugin_name%%"; } }
- public override string Description { get { return "%%plugin_description%%"; } }
- public override string Vendor { get { return "%%plugin_vendor%%"; } }
-
- //==============================================================================
- [DllImport("%%plugin_name%%")] static extern System.IntPtr getRenderCallback();
-
- [DllImport("%%plugin_name%%")] static extern void unityInitialiseTexture (int id, System.IntPtr texture, int width, int height);
-
- [DllImport("%%plugin_name%%")] static extern void unityMouseDown (int id, float x, float y, EventModifiers mods, int button);
- [DllImport("%%plugin_name%%")] static extern void unityMouseDrag (int id, float x, float y, EventModifiers mods, int button);
- [DllImport("%%plugin_name%%")] static extern void unityMouseUp (int id, float x, float y, EventModifiers mods);
-
- [DllImport("%%plugin_name%%")] static extern void unityKeyEvent (int id, KeyCode code, EventModifiers mods, string name);
-
- [DllImport("%%plugin_name%%")] static extern void unitySetScreenBounds (int id, float x, float y, float w, float h);
-
- //==============================================================================
- private class PluginGUIInstance
- {
- public PluginGUIInstance (ref IAudioEffectPlugin plugin, int id)
- {
- instanceID = id;
-
- float[] arr;
- plugin.GetFloatBuffer ("Editor", out arr, 1);
- hasEditor = (arr[0] > 0.0f);
- }
-
- public void repaint (Rect r)
- {
- Vector2 newScreenPosition = GUIUtility.GUIToScreenPoint (r.position);
-
- if (bounds != r
- || screenPosition != newScreenPosition)
- {
- screenPosition = newScreenPosition;
- bounds = r;
-
- unitySetScreenBounds (instanceID, screenPosition.x, screenPosition.y, bounds.width, bounds.height);
- setupTexture();
- }
-
- GL.IssuePluginEvent (getRenderCallback(), instanceID);
-
- texture.SetPixels32 (pixels);
- texture.Apply();
-
- EditorGUI.DrawPreviewTexture (bounds, texture);
- }
-
- public bool handleMouseEvent (EventType eventType)
- {
- Vector2 mousePos = Event.current.mousePosition;
- EventModifiers mods = Event.current.modifiers;
-
- if (! bounds.Contains (mousePos))
- return false;
-
- Vector2 relativePos = new Vector2 (mousePos.x - bounds.x, mousePos.y - bounds.y);
-
- if (eventType == EventType.MouseDown)
- {
- unityMouseDown (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
- GUIUtility.hotControl = GUIUtility.GetControlID (FocusType.Passive);
- }
- else if (eventType == EventType.MouseUp)
- {
- unityMouseUp (instanceID, relativePos.x, relativePos.y, mods);
- GUIUtility.hotControl = 0;
- }
- else if (eventType == EventType.MouseDrag)
- {
- unityMouseDrag (instanceID, relativePos.x, relativePos.y, mods, Event.current.button);
- }
-
- Event.current.Use();
-
- return true;
- }
-
- public void handleKeyEvent (EventType eventType)
- {
- if (eventType == EventType.KeyDown)
- {
- KeyCode code = Event.current.keyCode;
-
- if (code == KeyCode.None)
- return;
-
- EventModifiers mods = Event.current.modifiers;
-
- unityKeyEvent (instanceID, code, mods, code.ToString());
- }
- }
-
- private void setupTexture()
- {
- if (pixelHandle.IsAllocated)
- pixelHandle.Free();
-
- texture = new Texture2D ((int) bounds.width, (int) bounds.height, TextureFormat.ARGB32, false);
-
- pixels = texture.GetPixels32();
- pixelHandle = GCHandle.Alloc (pixels, GCHandleType.Pinned);
-
- unityInitialiseTexture (instanceID, pixelHandle.AddrOfPinnedObject(), texture.width, texture.height);
- }
-
- public int instanceID = -1;
- public bool hasEditor;
-
- private Vector2 screenPosition;
- private Rect bounds;
-
- private Texture2D texture;
- private Color32[] pixels;
- private GCHandle pixelHandle;
- }
- List<PluginGUIInstance> guis = new List<PluginGUIInstance>();
-
- private PluginGUIInstance getGUIInstanceForPlugin (ref IAudioEffectPlugin plugin)
- {
- float[] idArray;
- plugin.GetFloatBuffer ("ID", out idArray, 1);
-
- int id = (int) idArray[0];
-
- for (int i = 0; i < guis.Count; ++i)
- {
- if (guis[i].instanceID == id)
- return guis[i];
- }
-
- PluginGUIInstance newInstance = new PluginGUIInstance (ref plugin, id);
- guis.Add (newInstance);
-
- return guis[guis.Count - 1];
- }
-
- //==============================================================================
- public override bool OnGUI (IAudioEffectPlugin plugin)
- {
- PluginGUIInstance guiInstance = getGUIInstanceForPlugin (ref plugin);
-
- if (! guiInstance.hasEditor)
- return true;
-
- float[] arr;
- plugin.GetFloatBuffer ("Size", out arr, 6);
-
- Rect r = GUILayoutUtility.GetRect (arr[0], arr[1],
- new GUILayoutOption[] { GUILayout.MinWidth (arr[2]), GUILayout.MinHeight (arr[3]),
- GUILayout.MaxWidth (arr[4]), GUILayout.MaxHeight (arr[5]) });
-
- int controlID = GUIUtility.GetControlID (FocusType.Passive);
- Event currentEvent = Event.current;
- EventType currentEventType = currentEvent.GetTypeForControl (controlID);
-
- if (currentEventType == EventType.Repaint)
- guiInstance.repaint (r);
- else if (currentEvent.isMouse)
- guiInstance.handleMouseEvent (currentEventType);
- else if (currentEvent.isKey)
- guiInstance.handleKeyEvent (currentEventType);
-
- return false;
- }
-}
-
-#endif
{\r
jassert (document != nullptr);\r
\r
- if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
+ if (ProjectContentComponent* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
pcc->hideDocument (document);\r
}\r
\r
return true;\r
}\r
\r
-void DocumentEditorComponent::setEditedState (bool hasBeenEdited)\r
+void DocumentEditorComponent::setEditedState (bool /*hasBeenEdited*/)\r
{\r
- if (hasBeenEdited != lastEditedState)\r
- {\r
- if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
- pcc->refreshProjectTreeFileStatuses();\r
-\r
- lastEditedState = hasBeenEdited;\r
- }\r
}\r
\r
protected:\r
OpenDocumentManager::Document* document;\r
- bool lastEditedState = false;\r
\r
void setEditedState (bool hasBeenEdited);\r
\r
facts.add (file.getFullPathName());\r
drawable.reset();\r
\r
- if (auto input = std::unique_ptr<FileInputStream> (file.createInputStream()))\r
{\r
- auto totalSize = input->getTotalLength();\r
- String formatName;\r
+ std::unique_ptr<InputStream> input (file.createInputStream());\r
\r
- if (auto* format = ImageFileFormat::findImageFormatForStream (*input))\r
- formatName = " " + format->getFormatName();\r
+ if (input != nullptr)\r
+ {\r
+ auto totalSize = input->getTotalLength();\r
+ String formatName;\r
\r
- input.reset();\r
+ if (auto* format = ImageFileFormat::findImageFormatForStream (*input))\r
+ formatName = " " + format->getFormatName();\r
\r
- auto image = ImageCache::getFromFile (file);\r
+ input.reset();\r
\r
- if (image.isValid())\r
- {\r
- auto* d = new DrawableImage();\r
- d->setImage (image);\r
- drawable.reset (d);\r
+ auto image = ImageCache::getFromFile (file);\r
\r
- facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);\r
- }\r
+ if (image.isValid())\r
+ {\r
+ auto* d = new DrawableImage();\r
+ d->setImage (image);\r
+ drawable.reset (d);\r
+\r
+ facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);\r
+ }\r
\r
- if (totalSize > 0)\r
- facts.add (File::descriptionOfSizeInBytes (totalSize));\r
+ if (totalSize > 0)\r
+ facts.add (File::descriptionOfSizeInBytes (totalSize));\r
+ }\r
}\r
\r
if (drawable == nullptr)\r
- if (auto svg = parseXML (file))\r
+ {\r
+ std::unique_ptr<XmlElement> svg (XmlDocument::parse (file));\r
+\r
+ if (svg != nullptr)\r
drawable.reset (Drawable::createFromSVG (*svg));\r
+ }\r
\r
facts.removeEmptyStrings (true);\r
}\r
{\r
public:\r
ControlsComponent (CodeDocument& doc, const Range<int>& selection,\r
- CompileEngineChildProcess::Ptr cp, bool showColourSelector)\r
+ CompileEngineChildProcess* cp, bool showColourSelector)\r
: document (doc),\r
start (doc, selection.getStart()),\r
end (doc, selection.getEnd()),\r
\r
~LiteralHighlightOverlay()\r
{\r
- if (auto* p = getParentComponent())\r
+ if (Component* p = getParentComponent())\r
{\r
p->removeChildComponent (this);\r
\r
RelativePositionedRectangle rpr;\r
rpr.restoreFromXml (xml, currentPos);\r
\r
- jassert (layout != nullptr);\r
+ jassert (layout != 0);\r
setComponentPosition (comp, rpr, layout);\r
\r
if (SettableTooltipClient* const ttc = dynamic_cast<SettableTooltipClient*> (comp))\r
}\r
\r
//==============================================================================\r
- class ImageButtonResourceProperty : public ImageResourceProperty<ImageButton>\r
+ class ImageButtonResourceProperty : public ImageResourceProperty <ImageButton>\r
{\r
public:\r
ImageButtonResourceProperty (ComponentLayout& layout_, ImageButton* const owner_, const ImageRole role_, const String& name)\r
- : ImageResourceProperty<ImageButton> (*layout_.getDocument(), owner_, name, true),\r
+ : ImageResourceProperty <ImageButton> (*layout_.getDocument(), owner_, name, true),\r
role (role_),\r
layout (layout_)\r
{\r
ComponentLayout& layout;\r
};\r
\r
- class SetImageResourceAction : public ComponentUndoableAction<ImageButton>\r
+ class SetImageResourceAction : public ComponentUndoableAction <ImageButton>\r
{\r
public:\r
SetImageResourceAction (ImageButton* const button,\r
ComponentLayout& layout_,\r
const ImageRole role_,\r
const String& newResource_)\r
- : ComponentUndoableAction<ImageButton> (button, layout_),\r
+ : ComponentUndoableAction <ImageButton> (button, layout_),\r
newResource (newResource_),\r
- role (role_)\r
+ role (role_),\r
+ layout (layout_)\r
{\r
oldResource = ImageButtonHandler::getImageResource (button, role_);\r
}\r
\r
- bool perform() override\r
+ bool perform()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageResource (layout, getComponent(), role, newResource, false);\r
return true;\r
}\r
\r
- bool undo() override\r
+ bool undo()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageResource (layout, getComponent(), role, oldResource, false);\r
private:\r
String newResource, oldResource;\r
const ImageRole role;\r
+ ComponentLayout& layout;\r
};\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
- class SetImageKeepsPropAction : public ComponentUndoableAction<ImageButton>\r
+ class SetImageKeepsPropAction : public ComponentUndoableAction <ImageButton>\r
{\r
public:\r
SetImageKeepsPropAction (ImageButton* const button,\r
ComponentLayout& layout_,\r
const bool newState_)\r
- : ComponentUndoableAction<ImageButton> (button, layout_),\r
- newState (newState_)\r
+ : ComponentUndoableAction <ImageButton> (button, layout_),\r
+ newState (newState_),\r
+ layout (layout_)\r
{\r
oldState = ImageButtonHandler::doesImageKeepProportions (button);\r
}\r
\r
- bool perform() override\r
+ bool perform()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageKeepProportions (layout, getComponent(), newState, false);\r
return true;\r
}\r
\r
- bool undo() override\r
+ bool undo()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageKeepProportions (layout, getComponent(), oldState, false);\r
\r
private:\r
bool newState, oldState;\r
+ ComponentLayout& layout;\r
};\r
\r
static bool doesImageKeepProportions (ImageButton* button)\r
}\r
}\r
\r
- class ImageButtonProportionProperty : public ComponentBooleanProperty<ImageButton>\r
+ class ImageButtonProportionProperty : public ComponentBooleanProperty <ImageButton>\r
{\r
public:\r
ImageButtonProportionProperty (ComponentLayout& layout_, ImageButton* const owner_)\r
- : ComponentBooleanProperty<ImageButton> ("proportional", "maintain image proportions", "scale to fit",\r
- owner_, *layout_.getDocument()),\r
+ : ComponentBooleanProperty <ImageButton> ("proportional", "maintain image proportions", "scale to fit",\r
+ owner_, *layout_.getDocument()),\r
layout (layout_)\r
{\r
}\r
};\r
\r
//==============================================================================\r
- class SetImageOpacityAction : public ComponentUndoableAction<ImageButton>\r
+ class SetImageOpacityAction : public ComponentUndoableAction <ImageButton>\r
{\r
public:\r
SetImageOpacityAction (ImageButton* const button,\r
ComponentLayout& layout_,\r
const ImageRole role_,\r
const float newState_)\r
- : ComponentUndoableAction<ImageButton> (button, layout_),\r
+ : ComponentUndoableAction <ImageButton> (button, layout_),\r
role (role_),\r
- newState (newState_)\r
+ newState (newState_),\r
+ layout (layout_)\r
{\r
oldState = ImageButtonHandler::getImageOpacity (button, role_);\r
}\r
\r
- bool perform() override\r
+ bool perform()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageOpacity (layout, getComponent(), role, newState, false);\r
return true;\r
}\r
\r
- bool undo() override\r
+ bool undo()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageOpacity (layout, getComponent(), role, oldState, false);\r
private:\r
const ImageRole role;\r
float newState, oldState;\r
+ ComponentLayout& layout;\r
};\r
\r
static float getImageOpacity (ImageButton* button, const ImageRole role)\r
{\r
}\r
\r
- void setValue (double newValue) override\r
+ void setValue (double newValue)\r
{\r
setImageOpacity (layout, owner, role, (float) newValue, true);\r
}\r
\r
- double getValue() const override\r
+ double getValue() const\r
{\r
return getImageOpacity (owner, role);\r
}\r
};\r
\r
//==============================================================================\r
- class SetImageColourAction : public ComponentUndoableAction<ImageButton>\r
+ class SetImageColourAction : public ComponentUndoableAction <ImageButton>\r
{\r
public:\r
SetImageColourAction (ImageButton* const button,\r
Colour newState_)\r
: ComponentUndoableAction<ImageButton> (button, layout_),\r
role (role_),\r
- newState (newState_)\r
+ newState (newState_),\r
+ layout (layout_)\r
{\r
oldState = ImageButtonHandler::getImageColour (button, role_);\r
}\r
\r
- bool perform() override\r
+ bool perform()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageColour (layout, getComponent(), role, newState, false);\r
return true;\r
}\r
\r
- bool undo() override\r
+ bool undo()\r
{\r
showCorrectTab();\r
ImageButtonHandler::setImageColour (layout, getComponent(), role, oldState, false);\r
private:\r
const ImageRole role;\r
Colour newState, oldState;\r
+ ComponentLayout& layout;\r
};\r
\r
static Colour getImageColour (ImageButton* button, const ImageRole role)\r
\r
Component* createNewComponent (JucerDocument* doc) override\r
{\r
- return new TestComponent (doc, nullptr, false);\r
+ return new TestComponent (doc, 0, false);\r
}\r
\r
String getXmlTagName() const noexcept override { return "JUCERCOMP"; }\r
\r
bool restoreFromXml (const XmlElement& xml, Component* comp, const ComponentLayout* layout) override\r
{\r
- auto tc = dynamic_cast<TestComponent*> (comp);\r
+ TestComponent* const tc = dynamic_cast<TestComponent*> (comp);\r
\r
if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))\r
return false;\r
\r
String getClassName (Component* comp) const override\r
{\r
- auto tc = dynamic_cast<TestComponent*> (comp);\r
+ TestComponent* const tc = dynamic_cast<TestComponent*> (comp);\r
\r
String jucerCompClassName;\r
\r
- if (tc->getDocument() != nullptr)\r
+ if (tc->getDocument() != 0)\r
jucerCompClassName = tc->getDocument()->getClassName();\r
\r
if (jucerCompClassName.isEmpty())\r
if (multipleSelected)\r
return;\r
\r
- if (auto tc = dynamic_cast<TestComponent*> (component))\r
+ if (auto* const tc = dynamic_cast<TestComponent*> (component))\r
{\r
props.add (new JucerCompFileProperty (tc, document));\r
props.add (new ConstructorParamsProperty (tc, document));\r
{\r
ComponentTypeHandler::fillInCreationCode (code, component, memberVariableName);\r
\r
- if (auto tc = dynamic_cast<TestComponent*> (component))\r
+ if (TestComponent* const tc = dynamic_cast<TestComponent*> (component))\r
code.includeFilesH.add (tc->findFile().withFileExtension (".h"));\r
else\r
jassertfalse;\r
const String userCodeComment ("UserLabelCode_" + memberVariableName);\r
\r
callback\r
- << "if (labelThatHasChanged == " << memberVariableName << ".get())\n"\r
- << "{\n //[" << userCodeComment << "] -- add your label text handling code here..\n //[/" << userCodeComment << "]\n}\n";\r
+ << "if (labelThatHasChanged == " << memberVariableName\r
+ << ")\n{\n //[" << userCodeComment << "] -- add your label text handling code here..\n //[/" << userCodeComment << "]\n}\n";\r
}\r
}\r
\r
\r
String getText() const override\r
{\r
- auto s = dynamic_cast<Slider*> (component);\r
- jassert (s != nullptr);\r
+ Slider* s = dynamic_cast<Slider*> (component);\r
+ jassert (s != 0);\r
\r
return String (s->getSkewFactor());\r
}\r
//==============================================================================\r
static bool isTabUsingJucerComp (TabbedComponent* tc, int tabIndex)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
- return tdc != nullptr && tdc->isUsingJucerComp;\r
+ return tdc != 0 && tdc->isUsingJucerComp;\r
}\r
\r
static void setTabUsingJucerComp (TabbedComponent* tc, int tabIndex, const bool b)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
if (tdc != nullptr)\r
\r
static String getTabClassName (TabbedComponent* tc, int tabIndex)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
- return tdc != nullptr ? tdc->contentClassName : String();\r
+ return tdc != 0 ? tdc->contentClassName : String();\r
}\r
\r
static void setTabClassName (TabbedComponent* tc, int tabIndex, const String& newName)\r
\r
static String getTabConstructorParams (TabbedComponent* tc, int tabIndex)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
- return tdc != nullptr ? tdc->constructorParams : String();\r
+ return tdc != 0 ? tdc->constructorParams : String();\r
}\r
\r
static void setTabConstructorParams (TabbedComponent* tc, int tabIndex, const String& newParams)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
if (tdc != nullptr)\r
\r
static String getTabJucerFile (TabbedComponent* tc, int tabIndex)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
- return tdc != nullptr ? tdc->jucerComponentFile : String();\r
+ return tdc != 0 ? tdc->jucerComponentFile : String();\r
}\r
\r
static void setTabJucerFile (TabbedComponent* tc, int tabIndex, const String& newFile)\r
{\r
- auto tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
+ TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));\r
jassert (tdc != nullptr);\r
\r
if (tdc != nullptr)\r
{\r
jucerComp.reset();\r
\r
- jucerComp.reset (new TestComponent (ComponentTypeHandler::findParentDocument (this), nullptr, false));\r
+ jucerComp.reset (new TestComponent (ComponentTypeHandler::findParentDocument (this), 0, false));\r
jucerComp->setFilename (jucerComponentFile);\r
jucerComp->setToInitialSize();\r
\r
{\r
ComponentTypeHandler::fillInCreationCode (code, component, memberVariableName);\r
\r
- auto te = dynamic_cast<TextEditor*> (component);\r
- jassert (te != nullptr);\r
+ TextEditor* const te = dynamic_cast<TextEditor*> (component);\r
+ jassert (te != 0);\r
\r
String s;\r
s << memberVariableName << "->setMultiLine (" << CodeHelpers::boolLiteral (te->isMultiLine()) << ");\n"\r
\r
if (doc != nullptr)\r
{\r
- code.includeFilesCPP.add (File::createFileWithoutCheckingPath (doc->getHeaderFile()\r
- .getRelativePathFrom (code.document->getCppFile().getParentDirectory())\r
- .replaceCharacter ('\\', '/')));\r
+ code.includeFilesCPP.add (doc->getHeaderFile()\r
+ .getRelativePathFrom (code.document->getCppFile().getParentDirectory())\r
+ .replaceCharacter ('\\', '/'));\r
+\r
classNm = doc->getClassName();\r
}\r
else\r
if (getViewportContentType (vp) == 1)\r
{\r
JucerDocument* doc = findParentDocument (vp);\r
- auto tc = new TestComponent (doc, nullptr, false);\r
+ TestComponent* tc = new TestComponent (doc, 0, false);\r
\r
tc->setFilename (getViewportJucerComponentFile (vp));\r
tc->setToInitialSize();\r
\r
int chooseBestEnabledPaintRoutine (int paintRoutineWanted) const;\r
\r
- ComponentLayout* getComponentLayout() const { return nullptr; }\r
+ ComponentLayout* getComponentLayout() const { return 0; }\r
\r
void addExtraClassProperties (PropertyPanel&);\r
\r
\r
void PaintElementPath::mouseUp (const MouseEvent& e)\r
{\r
- if (points[mouseDownOnSegment] == nullptr)\r
+ if (points [mouseDownOnSegment] == 0)\r
ColouredElement::mouseUp (e);\r
else\r
owner->getSelectedPoints().addToSelectionOnMouseUp (points [mouseDownOnSegment],\r
: routine (*element->getOwner()),\r
elementIndex (element->getOwner()->indexOfElement (element))\r
{\r
- jassert (element != nullptr);\r
+ jassert (element != 0);\r
\r
if (elementIndex < 0)\r
findGroupIndices (element->getOwner(), element);\r
{\r
if (containerGroups.size() > 0)\r
{\r
- auto group = dynamic_cast<PaintElementGroup*> (routine.getElement (containerGroups.getFirst()));\r
+ PaintElementGroup* group = 0;\r
+ group = dynamic_cast<PaintElementGroup*> (routine.getElement (containerGroups.getFirst()));\r
\r
- if (group == nullptr)\r
- return nullptr;\r
+ if (group == 0)\r
+ return 0;\r
\r
for (int i = 1; i < containerGroups.size(); ++i)\r
{\r
group = dynamic_cast<PaintElementGroup*> (group->getElement (containerGroups.getUnchecked(i)));\r
\r
- if (group == nullptr)\r
- return nullptr;\r
+ if (group == 0)\r
+ return 0;\r
}\r
\r
- auto e = dynamic_cast<ElementType*> (group->getElement (elementIndex));\r
- jassert (e != nullptr);\r
+ ElementType* const e = dynamic_cast<ElementType*> (group->getElement (elementIndex));\r
+ jassert (e != 0);\r
return e;\r
}\r
else\r
{\r
- auto e = dynamic_cast<ElementType*> (routine.getElement (elementIndex));\r
- jassert (e != nullptr);\r
+ ElementType* const e = dynamic_cast<ElementType*> (routine.getElement (elementIndex));\r
+ jassert (e != 0);\r
return e;\r
}\r
}\r
{\r
for (int i = pr->getNumElements(); --i >= 0;)\r
{\r
- if (auto pg = dynamic_cast<PaintElementGroup*> (pr->getElement (i)))\r
+ PaintElementGroup* const pg = dynamic_cast<PaintElementGroup*> (pr->getElement (i));\r
+\r
+ if (pg != 0 && pg->containsElement (element))\r
{\r
- if (pg->containsElement (element))\r
- {\r
- containerGroups.add (i);\r
- findGroupIndices (pg, element);\r
- }\r
+ containerGroups.add (i);\r
+ findGroupIndices (pg, element);\r
}\r
}\r
}\r
{\r
for (int i = group->getNumElements(); --i >= 0;)\r
{\r
- if (auto pg = dynamic_cast<PaintElementGroup*> (group->getElement (i)))\r
+ PaintElementGroup* pg = dynamic_cast<PaintElementGroup*> (group->getElement (i));\r
+\r
+ if (pg != 0 && pg->containsElement (element))\r
{\r
- if (pg->containsElement (element))\r
- {\r
- containerGroups.add (i);\r
- findGroupIndices (pg, element);\r
- }\r
+ containerGroups.add (i);\r
+ findGroupIndices (pg, element);\r
}\r
}\r
}\r
\r
Rectangle<int> parentArea;\r
\r
- if (component->findParentComponentOfClass<ComponentLayoutEditor>() != nullptr)\r
+ if (component->findParentComponentOfClass<ComponentLayoutEditor>() != 0)\r
parentArea.setSize (component->getParentWidth(), component->getParentHeight());\r
- else if (auto pre = dynamic_cast<PaintRoutineEditor*> (component->getParentComponent()))\r
+ else if (PaintRoutineEditor* pre = dynamic_cast<PaintRoutineEditor*> (component->getParentComponent()))\r
parentArea = pre->getComponentArea();\r
else\r
jassertfalse;\r
\r
for (int i = layout.getNumComponents(); --i >= 0;)\r
{\r
- auto c = layout.getComponent (i);\r
+ Component* const c = layout.getComponent (i);\r
jassert (c != nullptr);\r
\r
- auto overlay = getOverlayCompFor (c);\r
+ ComponentOverlayComponent* overlay = getOverlayCompFor (c);\r
\r
bool isNewOverlay = false;\r
\r
- if (overlay == nullptr)\r
+ if (overlay == 0)\r
{\r
- auto handler = ComponentTypeHandler::getHandlerFor (*c);\r
+ ComponentTypeHandler* const handler = ComponentTypeHandler::getHandlerFor (*c);\r
jassert (handler != nullptr);\r
\r
overlay = handler->createOverlayComponent (c, layout);\r
{\r
if (e.mods.isPopupMenu())\r
{\r
- auto commandManager = &ProjucerApplication::getCommandManager();\r
+ ApplicationCommandManager* commandManager = &ProjucerApplication::getCommandManager();\r
\r
PopupMenu m;\r
\r
{\r
public:\r
ComponentClassNameProperty (JucerDocument& doc)\r
- : ComponentTextProperty<Component> ("Class name", 128, false, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Class name", 128, false, 0, doc)\r
{}\r
\r
void setText (const String& newText) override { document.setClassName (newText); }\r
{\r
public:\r
ComponentCompNameProperty (JucerDocument& doc)\r
- : ComponentTextProperty<Component> ("Component name", 200, false, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Component name", 200, false, 0, doc)\r
{}\r
\r
void setText (const String& newText) override { document.setComponentName (newText); }\r
{\r
public:\r
ComponentParentClassesProperty (JucerDocument& doc)\r
- : ComponentTextProperty<Component> ("Parent classes", 512, false, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Parent classes", 512, false, 0, doc)\r
{}\r
\r
void setText (const String& newText) override { document.setParentClasses (newText); }\r
{\r
public:\r
ComponentConstructorParamsProperty (JucerDocument& doc)\r
- : ComponentTextProperty<Component> ("Constructor params", 2048, false, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Constructor params", 2048, false, 0, doc)\r
{}\r
\r
void setText (const String& newText) override { document.setConstructorParams (newText); }\r
{\r
public:\r
ComponentInitialisersProperty (JucerDocument& doc)\r
- : ComponentTextProperty <Component> ("Member initialisers", 16384, true, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Member initialisers", 16384, true, 0, doc)\r
{\r
preferredHeight = 24 * 3;\r
}\r
{\r
public:\r
ComponentInitialSizeProperty (JucerDocument& doc, const bool isWidth_)\r
- : ComponentTextProperty<Component> (isWidth_ ? "Initial width"\r
- : "Initial height",\r
- 10, false, nullptr, doc),\r
+ : ComponentTextProperty <Component> (isWidth_ ? "Initial width"\r
+ : "Initial height",\r
+ 10, false, 0, doc),\r
isWidth (isWidth_)\r
{}\r
\r
{\r
public:\r
FixedSizeProperty (JucerDocument& doc)\r
- : ComponentChoiceProperty<Component> ("Fixed size", nullptr, doc)\r
+ : ComponentChoiceProperty <Component> ("Fixed size", 0, doc)\r
{\r
choices.add ("Resize component to fit workspace");\r
choices.add ("Keep component size fixed");\r
{\r
public:\r
TemplateFileProperty (JucerDocument& doc)\r
- : ComponentTextProperty<Component> ("Template file", 2048, false, nullptr, doc)\r
+ : ComponentTextProperty <Component> ("Template file", 2048, false, 0, doc)\r
{}\r
\r
void setText (const String& newText) override { document.setTemplateFile (newText); }\r
\r
for (int i = tabbedComponent.getNumTabs(); --i >= 0;)\r
{\r
- if (dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)) != nullptr\r
+ if (dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)) != 0\r
&& ! paintRoutineNames.contains (tabbedComponent.getTabNames() [i]))\r
{\r
tabbedComponent.removeTab (i);\r
\r
void JucerDocumentEditor::showGraphics (PaintRoutine* routine)\r
{\r
- if (getCurrentPaintRoutine() != routine || routine == nullptr)\r
+ if (getCurrentPaintRoutine() != routine || routine == 0)\r
{\r
for (int i = 0; i < tabbedComponent.getNumTabs(); ++i)\r
{\r
- if (auto pr = dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)))\r
+ if (PaintRoutinePanel* pr = dynamic_cast<PaintRoutinePanel*> (tabbedComponent.getTabContentComponent (i)))\r
{\r
if (routine == &(pr->getPaintRoutine()) || routine == nullptr)\r
{\r
\r
bool canPaste = false;\r
\r
- if (auto doc = parseXML (SystemClipboard::getTextFromClipboard()))\r
+ std::unique_ptr<XmlElement> doc (XmlDocument::parse (SystemClipboard::getTextFromClipboard()));\r
+\r
+ if (doc != nullptr)\r
{\r
if (doc->hasTagName (ComponentLayout::clipboardXmlTag))\r
canPaste = (currentLayout != nullptr);\r
break;\r
\r
case JucerCommandIDs::editCompGraphics:\r
- showGraphics (nullptr);\r
+ showGraphics (0);\r
break;\r
\r
case JucerCommandIDs::zoomIn: setZoom (snapToIntegerZoom (getZoom() * 2.0)); break;\r
\r
case StandardApplicationCommandIDs::paste:\r
{\r
- if (auto doc = parseXML (SystemClipboard::getTextFromClipboard()))\r
+ std::unique_ptr<XmlElement> doc (XmlDocument::parse (SystemClipboard::getTextFromClipboard()));\r
+\r
+ if (doc != nullptr)\r
{\r
if (doc->hasTagName (ComponentLayout::clipboardXmlTag))\r
{\r
*/\r
void updateFromComponent (const Component& comp) noexcept\r
{\r
- if (comp.getParentComponent() == nullptr && ! comp.isOnDesktop())\r
+ if (comp.getParentComponent() == 0 && ! comp.isOnDesktop())\r
updateFrom (comp.getBounds(), Rectangle<int>());\r
else\r
updateFrom (comp.getBounds(), Rectangle<int> (comp.getParentWidth(), comp.getParentHeight()));\r
int& x, int& xw, int& y, int& yh,\r
int& w, int& h) const\r
{\r
- Component* rx = {};\r
- Component* ry = {};\r
- Component* rw = {};\r
- Component* rh = {};\r
+ Component* rx = 0;\r
+ Component* ry = 0;\r
+ Component* rw = 0;\r
+ Component* rh = 0;\r
\r
- if (layout != nullptr)\r
+ if (layout != 0)\r
{\r
rx = layout->findComponentWithId (relativeToX);\r
ry = layout->findComponentWithId (relativeToY);\r
rh = layout->findComponentWithId (relativeToH);\r
}\r
\r
- x = parentArea.getX() + (rx != nullptr ? rx->getX() : 0);\r
- y = parentArea.getY() + (ry != nullptr ? ry->getY() : 0);\r
- w = rw != nullptr ? rw->getWidth() : parentArea.getWidth();\r
- h = rh != nullptr ? rh->getHeight() : parentArea.getHeight();\r
- xw = rx != nullptr ? rx->getWidth() : parentArea.getWidth();\r
- yh = ry != nullptr ? ry->getHeight() : parentArea.getHeight();\r
+ x = parentArea.getX() + (rx != 0 ? rx->getX() : 0);\r
+ y = parentArea.getY() + (ry != 0 ? ry->getY() : 0);\r
+ w = rw != 0 ? rw->getWidth() : parentArea.getWidth();\r
+ h = rh != 0 ? rh->getHeight() : parentArea.getHeight();\r
+ xw = rx != 0 ? rx->getWidth() : parentArea.getWidth();\r
+ yh = ry != 0 ? ry->getHeight() : parentArea.getHeight();\r
}\r
\r
Rectangle<int> getRectangle (const Rectangle<int>& parentArea,\r
\r
jassert (comp != nullptr);\r
jassert (pe != nullptr || components.contains (comp));\r
- jassert (compToBeRelativeTo == nullptr || components.contains (compToBeRelativeTo));\r
- jassert (compToBeRelativeTo == nullptr || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp));\r
+ jassert (compToBeRelativeTo == 0 || components.contains (compToBeRelativeTo));\r
+ jassert (compToBeRelativeTo == 0 || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp));\r
\r
if (compToBeRelativeTo != getComponentRelativePosTarget (comp, whichDimension)\r
- && (compToBeRelativeTo == nullptr || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp)))\r
+ && (compToBeRelativeTo == 0 || ! dependsOnComponentForRelativePos (compToBeRelativeTo, comp)))\r
{\r
const int64 compId = ComponentTypeHandler::getComponentId (compToBeRelativeTo);\r
\r
{\r
PopupMenu m;\r
\r
- auto current = getComponentRelativePosTarget (comp, whichDimension);\r
+ Component* const current = getComponentRelativePosTarget (comp, whichDimension);\r
\r
- m.addItem (menuIdBase, "Relative to parent component", true, current == nullptr);\r
+ m.addItem (menuIdBase, "Relative to parent component", true, current == 0);\r
m.addSeparator();\r
\r
for (int i = 0; i < components.size(); ++i)\r
return LicenseState::ApplicationUsageData::notChosenYet;\r
}\r
\r
-#if ! JUCER_ENABLE_GPL_MODE\r
+#if !JUCER_ENABLE_GPL_MODE\r
struct LicenseController::ModalCompletionCallback : ModalComponentManager::Callback\r
{\r
ModalCompletionCallback (LicenseController& controller) : owner (controller) {}\r
\r
void LicenseController::logout()\r
{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
#if ! JUCER_ENABLE_GPL_MODE\r
thread.reset();\r
\r
void LicenseController::chooseNewLicense()\r
{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
#if ! JUCER_ENABLE_GPL_MODE\r
thread.reset();\r
#if ! JUCER_ENABLE_GPL_MODE\r
//==============================================================================\r
struct ModalCompletionCallback;\r
+ friend struct ModalCompletionCallback;\r
+\r
+ friend struct ContainerDeletePolicy<LicenseThread>;\r
friend struct LicenseThread;\r
\r
//==============================================================================\r
\r
~NetWorkerThread()\r
{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
signalThreadShouldExit();\r
cancelPendingUpdate();\r
\r
if (productKey.isNotEmpty())\r
{\r
- DynamicObject::Ptr redeemObject (new DynamicObject());\r
- redeemObject->setProperty (serialIdentifier, productKey);\r
+ DynamicObject::Ptr redeamObject = new DynamicObject();\r
+ redeamObject->setProperty (serialIdentifier, productKey);\r
\r
- String postData (JSON::toString (var (redeemObject.get())));\r
+ String postData (JSON::toString (var (redeamObject.get())));\r
\r
std::unique_ptr<WebInputStream> shared (getSharedWebInputStream (URL ("https://api.roli.com/api/v1/user/products").withPOSTData (postData),\r
true));\r
if (chosenLicenseType.isNotEmpty())\r
{\r
// redeem the license\r
- DynamicObject::Ptr jsonLicenseObject (new DynamicObject());\r
+ DynamicObject::Ptr jsonLicenseObject = new DynamicObject();\r
jsonLicenseObject->setProperty (projucerLicenseTypeIdentifier, chosenLicenseType);\r
jsonLicenseObject->setProperty (versionIdentifier, 5);\r
\r
\r
- DynamicObject::Ptr jsonLicenseRequest (new DynamicObject());\r
+ DynamicObject::Ptr jsonLicenseRequest = new DynamicObject();\r
jsonLicenseRequest->setProperty (licenseIdentifier, var (jsonLicenseObject.get()));\r
jsonLicenseRequest->setProperty (searchInternalIdentifier, "com.roli.projucer");\r
jsonLicenseRequest->setProperty (licenseTypeIdentifier, "software");\r
\r
static void checkThread()\r
{\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActivityList)\r
server = createClangServer (command);\r
#endif\r
\r
- for (int i = 0; i < 20; ++i)\r
- {\r
- if (connectToPipe (pipeName, 10000))\r
- {\r
- MessageTypes::sendPing (*this);\r
- break;\r
- }\r
-\r
- Thread::sleep (50);\r
- }\r
-\r
- jassert (isConnected());\r
+ if (connectToPipe (pipeName, 10000))\r
+ MessageTypes::sendPing (*this);\r
+ else\r
+ jassertfalse;\r
\r
startTimer (serverKeepAliveTimeout);\r
}\r
scanProjectItem (proj.getMainGroup(), compileUnits, userFiles);\r
\r
{\r
- auto isVSTHost = project.getEnabledModules().isModuleEnabled ("juce_audio_processors")\r
- && (project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3") || project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST"));\r
+ auto isVST3Host = project.getModules().isModuleEnabled ("juce_audio_processors")\r
+ && project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
\r
auto isPluginProject = proj.getProjectType().isAudioPlugin();\r
\r
OwnedArray<LibraryModule> modules;\r
- proj.getEnabledModules().createRequiredModules (modules);\r
+ proj.getModules().createRequiredModules (modules);\r
\r
for (Project::ExporterIterator exporter (proj); exporter.next();)\r
{\r
{\r
for (auto* m : modules)\r
{\r
- auto localModuleFolder = proj.getEnabledModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue()\r
+ auto localModuleFolder = proj.getModules().shouldCopyModuleFilesLocally (m->moduleInfo.getID()).getValue()\r
? proj.getLocalModuleFolder (m->moduleInfo.getID())\r
: m->moduleInfo.getFolder();\r
\r
\r
m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits,\r
- isPluginProject || isVSTHost ? ProjectType::Target::SharedCodeTarget\r
- : ProjectType::Target::unspecified);\r
+ isPluginProject || isVST3Host ? ProjectType::Target::SharedCodeTarget\r
+ : ProjectType::Target::unspecified);\r
\r
- if (isPluginProject || isVSTHost)\r
+ if (isPluginProject || isVST3Host)\r
m->findAndAddCompiledUnits (*exporter, nullptr, compileUnits, ProjectType::Target::StandalonePlugIn);\r
}\r
\r
{\r
auto liveModules = project.getProjectRoot().getChildWithName (Ids::MODULES);\r
\r
- auto xml = parseXML (project.getFile());\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (project.getFile()));\r
\r
if (xml == nullptr || ! xml->hasTagName (Ids::JUCERPROJECT.toString()))\r
return false;\r
static bool areAnyModulesMissing (Project& project)\r
{\r
OwnedArray<LibraryModule> modules;\r
- project.getEnabledModules().createRequiredModules (modules);\r
+ project.getModules().createRequiredModules (modules);\r
\r
for (auto* module : modules)\r
if (! module->getFolder().isDirectory())\r
StringArray paths;\r
paths.addArray (getSearchPathsFromString (project.getCompileEngineSettings().getSystemHeaderPathString()));\r
\r
- auto isVSTHost = project.getEnabledModules().isModuleEnabled ("juce_audio_processors")\r
- && (project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3")\r
- || project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST"));\r
-\r
- auto customVst3Path = getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::getThisOS()).get().toString();\r
+ auto isVST3Host = project.getModules().isModuleEnabled ("juce_audio_processors")\r
+ && project.isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
\r
- if (customVst3Path.isNotEmpty() && (project.getProjectType().isAudioPlugin() || isVSTHost))\r
- paths.add (customVst3Path);\r
+ if (project.getProjectType().isAudioPlugin() || isVST3Host)\r
+ paths.add (getAppSettings().getStoredPath (Ids::vst3Path).toString());\r
\r
OwnedArray<LibraryModule> modules;\r
- project.getEnabledModules().createRequiredModules (modules);\r
+ project.getModules().createRequiredModules (modules);\r
\r
for (auto* module : modules)\r
- {\r
paths.addIfNotAlreadyThere (module->getFolder().getParentDirectory().getFullPathName());\r
\r
- if (customVst3Path.isEmpty() && (project.getProjectType().isAudioPlugin() || isVSTHost))\r
- if (module->getID() == "juce_audio_processors")\r
- paths.addIfNotAlreadyThere (module->getFolder().getChildFile ("format_types").getChildFile ("VST3_SDK").getFullPathName());\r
- }\r
-\r
return convertSearchPathsToAbsolute (paths);\r
}\r
\r
\r
CompileEngineChildProcess::Ptr getExisting (Project& project) const noexcept\r
{\r
- for (auto& p : processes)\r
+ for (CompileEngineChildProcess* p : processes)\r
if (&(p->project) == &project)\r
- return *p;\r
+ return p;\r
\r
- return {};\r
+ return nullptr;\r
}\r
\r
CompileEngineChildProcess::Ptr getOrCreate (Project& project)\r
{\r
- if (auto p = getExisting (project))\r
- return p;\r
+ CompileEngineChildProcess::Ptr p (getExisting (project));\r
\r
- auto p = new CompileEngineChildProcess (project);\r
- tellNewProcessAboutExistingEditors (*p);\r
- processes.add (p);\r
- return *p;\r
+ if (p == nullptr)\r
+ {\r
+ p = new CompileEngineChildProcess (project);\r
+ tellNewProcessAboutExistingEditors (p);\r
+ processes.add (p);\r
+ }\r
+\r
+ return p;\r
}\r
\r
- static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess& process)\r
+ static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess* process)\r
{\r
- auto& odm = ProjucerApplication::getApp().openDocumentManager;\r
+ OpenDocumentManager& odm = ProjucerApplication::getApp().openDocumentManager;\r
\r
for (int i = odm.getNumOpenDocuments(); --i >= 0;)\r
- if (auto d = dynamic_cast<SourceCodeDocument*> (odm.getOpenDocument (i)))\r
- process.editorOpened (d->getFile(), d->getCodeDocument());\r
+ if (SourceCodeDocument* d = dynamic_cast<SourceCodeDocument*> (odm.getOpenDocument (i)))\r
+ process->editorOpened (d->getFile(), d->getCodeDocument());\r
}\r
\r
void removeOrphans()\r
\r
static void checkThread()\r
{\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ErrorList)\r
\r
void showDocument() override\r
{\r
- showSettingsPage (new SettingsComp (*exporter));\r
+ showSettingsPage (new SettingsComp (exporter.get()));\r
}\r
\r
void deleteItem() override\r
//==============================================================================\r
struct SettingsComp : public Component\r
{\r
- SettingsComp (ProjectExporter& exp)\r
- : group (exp.getName(),\r
- ExporterItem::getIconForExporter (&exp),\r
- exp.getDescription())\r
+ SettingsComp (ProjectExporter* exp)\r
+ : group (exp->getName(),\r
+ ExporterItem::getIconForExporter (exp),\r
+ exp->getDescription())\r
{\r
addAndMakeVisible (group);\r
\r
PropertyListBuilder props;\r
- exp.createPropertyEditors (props);\r
+ exp->createPropertyEditors (props);\r
group.setProperties (props);\r
parentSizeChanged();\r
}\r
\r
void showDocument() override\r
{\r
- showSettingsPage (new SettingsComp (*config));\r
+ showSettingsPage (new SettingsComp (config));\r
}\r
\r
void deleteItem() override\r
class SettingsComp : public Component\r
{\r
public:\r
- SettingsComp (ProjectExporter::BuildConfiguration& conf)\r
- : group (conf.exporter.getName() + " - " + conf.getName(), Icon (getIcons().config, Colours::transparentBlack))\r
+ SettingsComp (ProjectExporter::BuildConfiguration* conf)\r
+ : group (conf->exporter.getName() + " - " + conf->getName(), Icon (getIcons().config, Colours::transparentBlack))\r
{\r
addAndMakeVisible (group);\r
\r
PropertyListBuilder props;\r
- conf.createPropertyEditors (props);\r
+ conf->createPropertyEditors (props);\r
group.setProperties (props);\r
parentSizeChanged();\r
}\r
return getFile().getFileName();\r
}\r
\r
- void paintItem (Graphics& g, int width, int height) override\r
- {\r
- JucerTreeViewBase::paintItem (g, width, height);\r
-\r
- if (item.needsSaving())\r
- {\r
- auto bounds = g.getClipBounds().withY (0).withHeight (height);\r
-\r
- g.setFont (getFont());\r
- g.setColour (getContentColour (false));\r
-\r
- g.drawFittedText ("*", bounds.removeFromLeft (height), Justification::centred, 1);\r
- }\r
- }\r
-\r
static File findCorrespondingHeaderOrCpp (const File& f)\r
{\r
if (f.hasFileExtension (sourceFileExtensions)) return f.withFileExtension (".h");\r
\r
static void setFilesToCompile (Project::Item item, const bool shouldCompile)\r
{\r
- if (item.isFile() && (item.getFile().hasFileExtension (fileTypesToCompileByDefault)))\r
+ if (item.isFile())\r
item.getShouldCompileValue() = shouldCompile;\r
\r
for (auto i = item.getNumChildren(); --i >= 0;)\r
private ChangeListener\r
{\r
public:\r
- LiveBuildTab (const CompileEngineChildProcess::Ptr& child, String lastErrorMessage)\r
+ LiveBuildTab (CompileEngineChildProcess* child, String lastErrorMessage)\r
{\r
settingsButton.reset (new IconButton ("Settings", &getIcons().settings));\r
addAndMakeVisible (settingsButton.get());\r
if (child != nullptr)\r
{\r
addAndMakeVisible (concertinaPanel);\r
- buildConcertina (*child);\r
+ buildConcertina (child);\r
isEnabled = true;\r
}\r
else\r
{\r
+ isEnabled = false;\r
+\r
errorMessage = getErrorMessage();\r
errorMessageLabel.reset (new Label ("Error", errorMessage));\r
errorMessageLabel->setJustificationType (Justification::centred);\r
}\r
}\r
\r
- bool isEnabled = false;\r
+ bool isEnabled;\r
String errorMessage;\r
Component::SafePointer<ProjucerAppClasses::ErrorListComp> errorListComp;\r
\r
}\r
}\r
\r
- void buildConcertina (CompileEngineChildProcess& child)\r
+ void buildConcertina (CompileEngineChildProcess* child)\r
{\r
for (auto i = concertinaPanel.getNumPanels() - 1; i >= 0 ; --i)\r
concertinaPanel.removePanel (concertinaPanel.getPanel (i));\r
\r
headers.clear();\r
\r
- errorListComp = new ProjucerAppClasses::ErrorListComp (child.errorList);\r
- auto* activities = new CurrentActivitiesComp (child.activityList);\r
- auto* comps = new ComponentListComp (child);\r
+ errorListComp = new ProjucerAppClasses::ErrorListComp (child->errorList);\r
+ auto* activities = new CurrentActivitiesComp (child->activityList);\r
+ auto* comps = new ComponentListComp (*child);\r
\r
concertinaPanel.addPanel (-1, errorListComp, true);\r
concertinaPanel.addPanel (-1, comps, true);\r
ModuleItem (Project& p, const String& modID)\r
: project (p), moduleID (modID)\r
{\r
- missingDependencies = project.getEnabledModules().getExtraDependenciesNeeded (moduleID).size() > 0;\r
- cppStandardHigherThanProject = project.getEnabledModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
+ missingDependencies = project.getModules().getExtraDependenciesNeeded (moduleID).size() > 0;\r
+ cppStandardHigherThanProject = project.getModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
\r
- moduleInfo = project.getEnabledModules().getModuleInfo (moduleID);\r
+ moduleInfo = project.getModules().getModuleInfo (moduleID);\r
}\r
\r
bool canBeSelected() const override { return true; }\r
void deleteItem() override\r
{\r
closeSettingsPage();\r
- project.getEnabledModules().removeModule (moduleID);\r
+ project.getModules().removeModule (moduleID);\r
}\r
\r
Icon getIcon() const override\r
bool checkCppStandard()\r
{\r
auto oldVal = cppStandardHigherThanProject;\r
- cppStandardHigherThanProject = project.getEnabledModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
+ cppStandardHigherThanProject = project.getModules().doesModuleHaveHigherCppStandardThanProject (moduleID);\r
\r
if (oldVal != cppStandardHigherThanProject)\r
return true;\r
return false;\r
}\r
\r
+ void refreshModuleInfoIfCurrentlyShowing (bool juceModulePathChanged)\r
+ {\r
+ auto isJuceModule = isJUCEModule (moduleID);\r
+ auto shouldRefresh = (juceModulePathChanged && isJuceModule) || (! juceModulePathChanged && ! isJuceModule);\r
+\r
+ if (! shouldRefresh)\r
+ return;\r
+\r
+ if (auto* pcc = getProjectContentComponent())\r
+ if (auto* settingsPanel = dynamic_cast<ModuleSettingsPanel*> (pcc->getEditorComponentContent()))\r
+ if (settingsPanel->getModuleID() == moduleID)\r
+ showDocument();\r
+ }\r
+\r
Project& project;\r
String moduleID;\r
\r
\r
//==============================================================================\r
class ModuleSettingsPanel : public Component,\r
- private Value::Listener,\r
- private Timer\r
+ private Value::Listener\r
{\r
public:\r
ModuleSettingsPanel (Project& p, const String& modID, TreeView* tree)\r
- : group (p.getEnabledModules().getModuleInfo (modID).getID(),\r
+ : group (p.getModules().getModuleInfo (modID).getID(),\r
Icon (getIcons().singleModule, Colours::transparentBlack)),\r
project (p),\r
modulesTree (tree),\r
\r
void refresh()\r
{\r
- auto& modules = project.getEnabledModules();\r
+ auto& modules = project.getModules();\r
\r
setEnabled (modules.isModuleEnabled (moduleID));\r
\r
if (modules.doesModuleHaveHigherCppStandardThanProject (moduleID))\r
props.add (new CppStandardWarningComponent());\r
\r
- group.properties.clear();\r
- exporterModulePathValues.clear();\r
+ modulePathValueSources.clear();\r
\r
for (Project::ExporterIterator exporter (project); exporter.next();)\r
{\r
if (exporter->isCLion())\r
continue;\r
\r
- exporterModulePathValues.add (exporter->getPathForModuleValue (moduleID));\r
+ auto key = isJUCEModule (moduleID) ? Ids::defaultJuceModulePath\r
+ : Ids::defaultUserModulePath;\r
\r
- auto& value = exporterModulePathValues.getReference (exporterModulePathValues.size() - 1);\r
- value.onDefaultChange = [this] { startTimer (50); };\r
+ Value src (modulePathValueSources.add (new DependencyPathValueSource (exporter->getPathForModuleValue (moduleID),\r
+ key, exporter->getTargetOSForExporter())));\r
\r
- auto* pathComponent = new FilePathPropertyComponent (value, "Path for " + exporter->getName().quoted(), true,\r
- exporter->getTargetOSForExporter() == TargetOS::getThisOS(),\r
- "*", project.getProjectFolder());\r
+ auto* pathComponent = new DependencyFilePathPropertyComponent (src, "Path for " + exporter->getName().quoted(),\r
+ true, "*", project.getProjectFolder());\r
\r
props.add (pathComponent,\r
"A path to the folder that contains the " + moduleID + " module when compiling the "\r
"is empty then the global path will be used.");\r
\r
pathComponent->setEnabled (! modules.shouldUseGlobalPath (moduleID));\r
+ pathComponent->getValue().addListener (this);\r
}\r
\r
- globalPathValue.removeListener (this);\r
globalPathValue.referTo (modules.getShouldUseGlobalPathValue (moduleID));\r
- globalPathValue.addListener (this);\r
\r
auto menuItemString = (TargetOS::getThisOS() == TargetOS::osx ? "\"Projucer->Global Paths...\""\r
: "\"File->Global Paths...\"");\r
String ("If this is enabled, then the locally-stored global path (set in the ") + menuItemString + " menu item) "\r
"will be used as the path to this module. "\r
"This means that if this Projucer project is opened on another machine it will use that machine's global path as the path to this module.");\r
+ globalPathValue.addListener (this);\r
\r
props.add (new BooleanPropertyComponent (modules.shouldCopyModuleFilesLocally (moduleID),\r
"Create local copy", "Copy the module into the project folder"),\r
String getModuleID() const noexcept { return moduleID; }\r
\r
private:\r
- void valueChanged (Value&) override { startTimer (50); }\r
- void timerCallback() override { stopTimer(); refresh(); }\r
-\r
- //==============================================================================\r
- Array<ValueWithDefault> exporterModulePathValues;\r
- Value globalPathValue;\r
-\r
- OwnedArray <Project::ConfigFlag> configFlags;\r
-\r
PropertyGroupComponent group;\r
Project& project;\r
SafePointer<TreeView> modulesTree;\r
String moduleID;\r
+ Value globalPathValue;\r
+ Value defaultJuceModulePathValue, defaultUserModulePathValue;\r
+ OwnedArray <Project::ConfigFlag> configFlags;\r
+\r
+ ReferenceCountedArray<Value::ValueSource> modulePathValueSources;\r
+\r
+ //==============================================================================\r
+ void valueChanged (Value& v) override\r
+ {\r
+ if (v == globalPathValue)\r
+ {\r
+ auto useGlobalPath = globalPathValue.getValue();\r
+\r
+ for (auto prop : group.properties)\r
+ {\r
+ if (auto* pathPropertyComponent = dynamic_cast<DependencyFilePathPropertyComponent*> (prop))\r
+ pathPropertyComponent->setEnabled (! useGlobalPath);\r
+ }\r
+ }\r
+\r
+ if (auto* infoComponent = dynamic_cast<ModuleInfoComponent*> (group.properties.getUnchecked (0)))\r
+ infoComponent->refresh();\r
+ }\r
\r
//==============================================================================\r
class ModuleInfoComponent : public PropertyComponent,\r
: PropertyComponent ("Module", 150), project (p), moduleID (modID)\r
{\r
for (Project::ExporterIterator exporter (project); exporter.next();)\r
- listeningValues.add (new Value (exporter->getPathForModuleValue (moduleID).getPropertyAsValue()))->addListener (this);\r
+ listeningValues.add (new Value (exporter->getPathForModuleValue (moduleID)))\r
+ ->addListener (this);\r
\r
refresh();\r
}\r
\r
void refresh() override\r
{\r
- info = project.getEnabledModules().getModuleInfo (moduleID);\r
+ info = project.getModules().getModuleInfo (moduleID);\r
repaint();\r
}\r
\r
MissingDependenciesComponent (Project& p, const String& modID)\r
: PropertyComponent ("Dependencies", 100),\r
project (p), moduleID (modID),\r
- missingDependencies (project.getEnabledModules().getExtraDependenciesNeeded (modID))\r
+ missingDependencies (project.getModules().getExtraDependenciesNeeded (modID))\r
{\r
addAndMakeVisible (fixButton);\r
fixButton.setColour (TextButton::buttonColourId, Colours::red);\r
\r
void fixDependencies()\r
{\r
- if (! tryToFix())\r
+ ModuleList list;\r
+\r
+ list.scanGlobalJuceModulePath();\r
+\r
+ if (! tryToFix (list))\r
{\r
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
- "Adding Missing Dependencies",\r
- "Couldn't locate some of these modules - you'll need to find their "\r
- "folders manually and add them to the list.");\r
+ list.scanGlobalUserModulePath();\r
\r
- return;\r
+ if (! tryToFix (list))\r
+ {\r
+ list.scanProjectExporterModulePaths (project);\r
+\r
+ if (! tryToFix (list))\r
+ {\r
+ AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
+ "Adding Missing Dependencies",\r
+ "Couldn't locate some of these modules - you'll need to find their "\r
+ "folders manually and add them to the list.");\r
+\r
+ return;\r
+ }\r
+ }\r
}\r
\r
refreshAndReselectItem();\r
StringArray missingDependencies;\r
TextButton fixButton { "Add Required Modules" };\r
\r
- bool tryToFix()\r
+ bool tryToFix (ModuleList& list)\r
{\r
- auto& enabledModules = project.getEnabledModules();\r
-\r
- auto copyLocally = enabledModules.areMostModulesCopiedLocally();\r
- auto useGlobalPath = enabledModules.areMostModulesUsingGlobalPath();\r
+ auto& modules = project.getModules();\r
+ auto copyLocally = modules.areMostModulesCopiedLocally();\r
+ auto useGlobalPath = modules.areMostModulesUsingGlobalPath();\r
\r
StringArray missing;\r
\r
for (auto missingModule : missingDependencies)\r
{\r
- auto mod = project.getModuleWithID (missingModule);\r
-\r
- if (mod.second != File())\r
- enabledModules.addModule (mod.second, copyLocally, useGlobalPath, false);\r
+ if (auto* info = list.getModuleWithID (missingModule))\r
+ modules.addModule (info->moduleFolder, copyLocally, useGlobalPath, false);\r
else\r
missing.add (missingModule);\r
}\r
\r
//==============================================================================\r
class EnabledModulesItem : public ProjectTreeItemBase,\r
- private Value::Listener,\r
- private AvailableModuleList::Listener\r
+ private Value::Listener\r
{\r
public:\r
EnabledModulesItem (Project& p)\r
: project (p),\r
- moduleListTree (p.getEnabledModules().state)\r
+ moduleListTree (p.getModules().state)\r
{\r
moduleListTree.addListener (this);\r
\r
projectCppStandardValue.referTo (project.getProjectValue (Ids::cppLanguageStandard));\r
- projectCppStandardValue.addListener (this);\r
+ defaultJuceModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultJuceModulePath));\r
+ defaultUserModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultUserModulePath));\r
\r
- ProjucerApplication::getApp().getJUCEPathModuleList().addListener (this);\r
- ProjucerApplication::getApp().getUserPathsModuleList().addListener (this);\r
- project.getExporterPathsModuleList().addListener (this);\r
- }\r
-\r
- ~EnabledModulesItem()\r
- {\r
- ProjucerApplication::getApp().getJUCEPathModuleList().removeListener (this);\r
- ProjucerApplication::getApp().getUserPathsModuleList().removeListener (this);\r
- project.getExporterPathsModuleList().removeListener (this);\r
+ projectCppStandardValue.addListener (this);\r
+ defaultJuceModulePathValue.addListener (this);\r
+ defaultUserModulePathValue.addListener (this);\r
}\r
\r
int getItemHeight() const override { return 22; }\r
}\r
\r
for (int i = 0; i < modules.size(); ++i)\r
- project.getEnabledModules().addModule (modules.getReference(i).moduleFolder,\r
- project.getEnabledModules().areMostModulesCopiedLocally(),\r
- project.getEnabledModules().areMostModulesUsingGlobalPath(),\r
- true);\r
+ project.getModules().addModule (modules.getReference(i).moduleFolder,\r
+ project.getModules().areMostModulesCopiedLocally(),\r
+ project.getModules().areMostModulesUsingGlobalPath(),\r
+ true);\r
}\r
\r
void addSubItems() override\r
{\r
- for (int i = 0; i < project.getEnabledModules().getNumModules(); ++i)\r
- addSubItem (new ModuleItem (project, project.getEnabledModules().getModuleID (i)));\r
+ for (int i = 0; i < project.getModules().getNumModules(); ++i)\r
+ addSubItem (new ModuleItem (project, project.getModules().getModuleID (i)));\r
}\r
\r
void showPopupMenu() override\r
{\r
- auto& enabledModules = project.getEnabledModules();\r
- PopupMenu allModules;\r
+ auto& modules = project.getModules();\r
+ PopupMenu knownModules, jucePathModules, userPathModules, exporterPathsModules;\r
\r
int index = 100;\r
+ for (auto m : getAvailableModulesInGlobalJucePath())\r
+ jucePathModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
\r
- // JUCE path\r
- PopupMenu jucePathModules;\r
-\r
- for (auto& mod : ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules())\r
- jucePathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
-\r
- jucePathModules.addSeparator();\r
- jucePathModules.addItem (-1, "Re-scan path");\r
+ knownModules.addSubMenu ("Global JUCE modules path", jucePathModules);\r
\r
- allModules.addSubMenu ("Global JUCE modules path", jucePathModules);\r
-\r
- // User path\r
index = 200;\r
- PopupMenu userPathModules;\r
-\r
- for (auto& mod : ProjucerApplication::getApp().getUserPathsModuleList().getAllModules())\r
- userPathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
+ for (auto m : getAvailableModulesInGlobalUserPath())\r
+ userPathModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
\r
- userPathModules.addSeparator();\r
- userPathModules.addItem (-2, "Re-scan path");\r
+ knownModules.addSubMenu ("Global user modules path", userPathModules);\r
\r
- allModules.addSubMenu ("Global user modules path", userPathModules);\r
-\r
- // Exporter path\r
index = 300;\r
- PopupMenu exporterPathModules;\r
-\r
- for (auto& mod : project.getExporterPathsModuleList().getAllModules())\r
- exporterPathModules.addItem (index++, mod.first, ! enabledModules.isModuleEnabled (mod.first));\r
-\r
- exporterPathModules.addSeparator();\r
- exporterPathModules.addItem (-3, "Re-scan path");\r
+ for (auto m : getAvailableModulesInExporterPaths())\r
+ exporterPathsModules.addItem (index++, m, ! modules.isModuleEnabled (m));\r
\r
- allModules.addSubMenu ("Exporter paths", exporterPathModules);\r
+ knownModules.addSubMenu ("Exporter paths", exporterPathsModules);\r
\r
PopupMenu menu;\r
- menu.addSubMenu ("Add a module", allModules);\r
-\r
+ menu.addSubMenu ("Add a module", knownModules);\r
menu.addSeparator();\r
menu.addItem (1001, "Add a module from a specified folder...");\r
\r
\r
void handlePopupMenuResult (int resultCode) override\r
{\r
+ auto& modules = project.getModules();\r
+\r
if (resultCode == 1001)\r
{\r
- project.getEnabledModules().addModuleFromUserSelectedFile();\r
- }\r
- else if (resultCode < 0)\r
- {\r
- if (resultCode == -1) ProjucerApplication::getApp().rescanJUCEPathModules();\r
- else if (resultCode == -2) ProjucerApplication::getApp().rescanUserPathModules();\r
- else if (resultCode == -3) project.rescanExporterPathModules();\r
+ modules.addModuleFromUserSelectedFile();\r
}\r
else if (resultCode > 0)\r
{\r
- std::vector<ModuleIDAndFolder> list;\r
- int offset = -1;\r
-\r
if (resultCode < 200)\r
- {\r
- list = ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules();\r
- offset = 100;\r
- }\r
+ modules.addModuleInteractive (getAvailableModulesInGlobalJucePath() [resultCode - 100]);\r
else if (resultCode < 300)\r
- {\r
- list = ProjucerApplication::getApp().getUserPathsModuleList().getAllModules();\r
- offset = 200;\r
- }\r
+ modules.addModuleInteractive (getAvailableModulesInGlobalUserPath() [resultCode - 200]);\r
else if (resultCode < 400)\r
- {\r
- list = project.getExporterPathsModuleList().getAllModules();\r
- offset = 300;\r
- }\r
+ modules.addModuleInteractive (getAvailableModulesInExporterPaths() [resultCode - 300]);\r
+ }\r
+ }\r
+\r
+ StringArray getAvailableModulesInGlobalJucePath()\r
+ {\r
+ ModuleList list;\r
+ list.addAllModulesInFolder ({ getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString() });\r
+\r
+ return list.getIDs();\r
+ }\r
+\r
+ StringArray getAvailableModulesInGlobalUserPath()\r
+ {\r
+ ModuleList list;\r
+ auto paths = StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), ";", {});\r
+\r
+ for (auto p : paths)\r
+ {\r
+ p = p.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
\r
- if (offset != -1)\r
- project.getEnabledModules().addModuleInteractive (list[(size_t) (resultCode - offset)].first);\r
+ auto f = File::createFileWithoutCheckingPath (p.trim());\r
+ if (f.exists())\r
+ list.addAllModulesInFolder (f);\r
}\r
+\r
+ auto ids = list.getIDs();\r
+\r
+ for (auto m : getAvailableModulesInGlobalJucePath())\r
+ ids.removeString (m);\r
+\r
+ return ids;\r
+ }\r
+\r
+ StringArray getAvailableModulesInExporterPaths()\r
+ {\r
+ ModuleList list;\r
+ list.scanProjectExporterModulePaths (project);\r
+\r
+ auto ids = list.getIDs();\r
+\r
+ for (auto m : getAvailableModulesInGlobalJucePath())\r
+ ids.removeString (m);\r
+\r
+ for (auto m : getAvailableModulesInGlobalUserPath())\r
+ ids.removeString (m);\r
+\r
+ return ids;\r
}\r
\r
//==============================================================================\r
private:\r
Project& project;\r
ValueTree moduleListTree;\r
- Value projectCppStandardValue;\r
+ Value projectCppStandardValue, defaultJuceModulePathValue, defaultUserModulePathValue;\r
\r
//==============================================================================\r
void valueChanged (Value& v) override\r
}\r
}\r
}\r
- }\r
-\r
- void removeDuplicateModules()\r
- {\r
- auto jucePathModuleList = ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules();\r
-\r
- auto& userPathModules = ProjucerApplication::getApp().getUserPathsModuleList();\r
- userPathModules.removeDuplicates (jucePathModuleList);\r
+ else if (v == defaultJuceModulePathValue || v == defaultUserModulePathValue)\r
+ {\r
+ auto juceModulePathChanged = (v == defaultJuceModulePathValue);\r
\r
- auto& exporterPathModules = project.getExporterPathsModuleList();\r
- exporterPathModules.removeDuplicates (jucePathModuleList);\r
- exporterPathModules.removeDuplicates (userPathModules.getAllModules());\r
- }\r
+ for (int i = 0; i < getNumSubItems(); ++i)\r
+ if (auto* moduleItem = dynamic_cast<ModuleItem*> (getSubItem (i)))\r
+ moduleItem->refreshModuleInfoIfCurrentlyShowing (juceModulePathChanged);\r
\r
- void availableModulesChanged() override\r
- {\r
- removeDuplicateModules();\r
- refreshSubItems();\r
+ refreshSubItems();\r
+ }\r
}\r
\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnabledModulesItem)\r
};\r
void HeaderComponent::showUserSettings() noexcept\r
{\r
#if JUCER_ENABLE_GPL_MODE\r
- auto settingsPopupHeight = 100;\r
+ auto settingsPopupHeight = 40;\r
auto settingsPopupWidth = 200;\r
#else\r
auto settingsPopupHeight = 150;\r
{\r
sendProjectButtonAnalyticsEvent ("User Settings");\r
\r
- if (findParentComponentOfClass<ProjectContentComponent>() != nullptr)\r
+ if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
showUserSettings();\r
};\r
\r
public:\r
ModulesInformationComponent (Project& p)\r
: project (p),\r
- modulesValueTree (p.getEnabledModules().state)\r
+ modulesValueTree (p.getModules().state)\r
{\r
listHeader = new ListBoxHeader ( { "Module", "Version", "Make Local Copy", "Paths" },\r
{ 0.25f, 0.2f, 0.2f, 0.35f } );\r
\r
int getNumRows() override\r
{\r
- return project.getEnabledModules().getNumModules();\r
+ return project.getModules().getNumModules();\r
}\r
\r
void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) override\r
g.setColour (rowIsSelected ? findColour (defaultHighlightedTextColourId) : findColour (widgetTextColourId));\r
\r
//======================================================================\r
- auto moduleID = project.getEnabledModules().getModuleID (rowNumber);\r
+ auto moduleID = project.getModules().getModuleID (rowNumber);\r
\r
g.drawFittedText (moduleID, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (0) * width)), Justification::centredLeft, 1);\r
\r
//======================================================================\r
- auto version = project.getEnabledModules().getModuleInfo (moduleID).getVersion();\r
+ auto version = project.getModules().getModuleInfo (moduleID).getVersion();\r
if (version.isEmpty())\r
version = "?";\r
\r
g.drawFittedText (version, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (1) * width)), Justification::centredLeft, 1);\r
\r
//======================================================================\r
- auto copyLocally = project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue() ? "Yes" : "No";\r
+ auto copyLocally = project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue() ? "Yes" : "No";\r
\r
g.drawFittedText (copyLocally, bounds.removeFromLeft (roundToInt (listHeader->getProportionAtIndex (2) * width)), Justification::centredLeft, 1);\r
\r
//======================================================================\r
String pathText;\r
\r
- if (project.getEnabledModules().shouldUseGlobalPath (moduleID))\r
+ if (project.getModules().shouldUseGlobalPath (moduleID))\r
{\r
pathText = "Global";\r
}\r
\r
void listBoxItemDoubleClicked (int row, const MouseEvent&) override\r
{\r
- auto moduleID = project.getEnabledModules().getModuleID (row);\r
+ auto moduleID = project.getModules().getModuleID (row);\r
\r
if (moduleID.isNotEmpty())\r
if (auto* pcc = findParentComponentOfClass<ProjectContentComponent>())\r
\r
void deleteKeyPressed (int row) override\r
{\r
- project.getEnabledModules().removeModule (project.getEnabledModules().getModuleID (row));\r
+ project.getModules().removeModule (project.getModules().getModuleID (row));\r
}\r
\r
void lookAndFeelChanged() override\r
auto res = m.showAt (&setCopyModeButton);\r
\r
if (res != 0)\r
- project.getEnabledModules().setLocalCopyModeForAllModules (res == 1);\r
+ project.getModules().setLocalCopyModeForAllModules (res == 1);\r
}\r
\r
void showGlobalPathsMenu()\r
{\r
auto enableGlobalPaths = (res % 2 == 1);\r
\r
- auto& moduleList = project.getEnabledModules();\r
+ auto& moduleList = project.getModules();\r
\r
if (res < 3)\r
{\r
pastePathsID\r
};\r
\r
- auto& moduleList = project.getEnabledModules();\r
+ auto& moduleList = project.getModules();\r
auto moduleToCopy = moduleList.getModuleID (list.getSelectedRow());\r
\r
if (moduleToCopy.isNotEmpty())\r
auto modID = moduleList.getModuleID (i);\r
\r
if (modID != moduleToCopy)\r
- exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).get();\r
+ exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).getValue();\r
}\r
}\r
}\r
modulePathClipboard.clear();\r
\r
for (Project::ExporterIterator exporter (project); exporter.next();)\r
- modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).get();\r
+ modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).getValue();\r
}\r
else if (res == pastePathsID)\r
{\r
{\r
LogoComponent()\r
{\r
- if (auto svg = parseXML (BinaryData::background_logo_svg))\r
- logo.reset (Drawable::createFromSVG (*svg));\r
- else\r
- jassertfalse;\r
+ std::unique_ptr<XmlElement> svg (XmlDocument::parse (BinaryData::background_logo_svg));\r
+ logo.reset (Drawable::createFromSVG (*svg));\r
}\r
\r
void paint (Graphics& g) override\r
updateMissingFileStatuses();\r
}\r
\r
-void ProjectContentComponent::refreshProjectTreeFileStatuses()\r
-{\r
- if (auto* projectTab = getProjectTab())\r
- if (auto* fileTree = projectTab->getFileTreePanel())\r
- fileTree->repaint();\r
-}\r
-\r
void ProjectContentComponent::updateMissingFileStatuses()\r
{\r
if (auto* pTab = getProjectTab())\r
{\r
if (! currentDocument->save())\r
showSaveWarning (currentDocument);\r
-\r
- refreshProjectTreeFileStatuses();\r
}\r
else\r
{\r
\r
void ProjectContentComponent::saveAs()\r
{\r
- if (currentDocument != nullptr)\r
- {\r
- if (! currentDocument->saveAs())\r
- showSaveWarning (currentDocument);\r
-\r
- refreshProjectTreeFileStatuses();\r
- }\r
+ if (currentDocument != nullptr && ! currentDocument->saveAs())\r
+ showSaveWarning (currentDocument);\r
}\r
\r
bool ProjectContentComponent::goToPreviousFile()\r
"Saves the current project",\r
CommandCategories::general, 0);\r
result.setActive (project != nullptr && ! project->isCurrentlySaving());\r
- result.defaultKeypresses.add ({ 'p', ModifierKeys::commandModifier, 0 });\r
break;\r
\r
case CommandIDs::closeProject:\r
\r
void deleteSelectedTreeItems();\r
\r
- void refreshProjectTreeFileStatuses();\r
void updateMissingFileStatuses();\r
void createProjectTabs();\r
void deleteProjectTabs();\r
*/\r
\r
#include "../Application/jucer_Headers.h"\r
+#include "jucer_Module.h"\r
#include "../ProjectSaving/jucer_ProjectSaver.h"\r
#include "../ProjectSaving/jucer_ProjectExport_Xcode.h"\r
-#include "../Application/jucer_Application.h"\r
+#include "../Application/jucer_ProjucerAnalytics.h"\r
\r
//==============================================================================\r
+static var parseModuleDesc (const StringArray& lines)\r
+{\r
+ DynamicObject* o = new DynamicObject();\r
+ var result (o);\r
+\r
+ for (auto line : lines)\r
+ {\r
+ line = trimCommentCharsFromStartOfLine (line);\r
+\r
+ auto colon = line.indexOfChar (':');\r
+\r
+ if (colon >= 0)\r
+ {\r
+ auto key = line.substring (0, colon).trim();\r
+ auto value = line.substring (colon + 1).trim();\r
+\r
+ o->setProperty (key, value);\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+static var parseModuleDesc (const File& header)\r
+{\r
+ StringArray lines;\r
+ header.readLines (lines);\r
+\r
+ for (int i = 0; i < lines.size(); ++i)\r
+ {\r
+ if (trimCommentCharsFromStartOfLine (lines[i]).startsWith ("BEGIN_JUCE_MODULE_DECLARATION"))\r
+ {\r
+ StringArray desc;\r
+\r
+ for (int j = i + 1; j < lines.size(); ++j)\r
+ {\r
+ if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_MODULE_DECLARATION"))\r
+ return parseModuleDesc (desc);\r
+\r
+ desc.add (lines[j]);\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ return {};\r
+}\r
+\r
ModuleDescription::ModuleDescription (const File& folder)\r
: moduleFolder (folder),\r
- moduleInfo (parseJUCEHeaderMetadata (getHeader()))\r
+ moduleInfo (parseModuleDesc (getHeader()))\r
{\r
}\r
\r
}\r
\r
//==============================================================================\r
-static bool tryToAddModuleFromFolder (const File& path, ModuleIDAndFolderList& list)\r
+ModuleList::ModuleList()\r
+{\r
+}\r
+\r
+ModuleList::ModuleList (const ModuleList& other)\r
+{\r
+ operator= (other);\r
+}\r
+\r
+ModuleList& ModuleList::operator= (const ModuleList& other)\r
+{\r
+ modules.clear();\r
+ modules.addCopiesOf (other.modules);\r
+ return *this;\r
+}\r
+\r
+const ModuleDescription* ModuleList::getModuleWithID (const String& moduleID) const\r
+{\r
+ for (auto* m : modules)\r
+ if (m->getID() == moduleID)\r
+ return m;\r
+\r
+ return nullptr;\r
+}\r
+\r
+void ModuleList::sort()\r
+{\r
+ std::sort (modules.begin(), modules.end(), [] (const ModuleDescription* m1, const ModuleDescription* m2)\r
+ {\r
+ return m1->getID().compareIgnoreCase (m2->getID()) < 0;\r
+ });\r
+}\r
+\r
+StringArray ModuleList::getIDs() const\r
+{\r
+ StringArray results;\r
+\r
+ for (auto* m : modules)\r
+ results.add (m->getID());\r
+\r
+ results.sort (true);\r
+ return results;\r
+}\r
+\r
+Result ModuleList::tryToAddModuleFromFolder (const File& path)\r
{\r
ModuleDescription m (path);\r
\r
if (m.isValid())\r
{\r
- list.push_back ({ m.getID(), path });\r
- return true;\r
+ modules.add (new ModuleDescription (m));\r
+ return Result::ok();\r
+ }\r
+\r
+ return Result::fail (path.getFullPathName() + " is not a valid module");\r
+}\r
+\r
+Result ModuleList::addAllModulesInFolder (const File& path)\r
+{\r
+ if (! tryToAddModuleFromFolder (path))\r
+ {\r
+ int subfolders = 2;\r
+ return addAllModulesInSubfoldersRecursively (path, subfolders);\r
}\r
\r
- return false;\r
+ return Result::ok();\r
}\r
\r
-static void addAllModulesInSubfoldersRecursively (const File& path, int depth, ModuleIDAndFolderList& list)\r
+Result ModuleList::addAllModulesInSubfoldersRecursively (const File& path, int depth)\r
{\r
if (depth > 0)\r
{\r
for (DirectoryIterator iter (path, false, "*", File::findDirectories); iter.next();)\r
{\r
- if (auto* job = ThreadPoolJob::getCurrentThreadPoolJob())\r
- if (job->shouldExit())\r
- return;\r
+ auto childPath = iter.getFile().getLinkedTarget();\r
\r
- auto childPath = iter.getFile();\r
-\r
- if (! tryToAddModuleFromFolder (childPath, list))\r
- addAllModulesInSubfoldersRecursively (childPath, depth - 1, list);\r
+ if (! tryToAddModuleFromFolder (childPath))\r
+ addAllModulesInSubfoldersRecursively (childPath, depth - 1);\r
}\r
}\r
+\r
+ return Result::ok();\r
}\r
\r
-static void addAllModulesInFolder (const File& path, ModuleIDAndFolderList& list)\r
+static File getModuleFolderFromPathIfItExists (const String& path, const String& moduleID, const Project& project)\r
{\r
- if (! tryToAddModuleFromFolder (path, list))\r
+ if (path.isNotEmpty())\r
{\r
- int subfolders = 3;\r
- addAllModulesInSubfoldersRecursively (path, subfolders, list);\r
+ auto moduleFolder = project.resolveFilename (path);\r
+\r
+ if (moduleFolder.exists())\r
+ {\r
+ if (ModuleDescription (moduleFolder).getID() == moduleID)\r
+ return moduleFolder;\r
+\r
+ auto f = moduleFolder.getChildFile (moduleID);\r
+\r
+ if (ModuleDescription (f).getID() == moduleID)\r
+ return f;\r
+ }\r
}\r
-}\r
\r
-static void sort (ModuleIDAndFolderList& listToSort)\r
-{\r
- std::sort (listToSort.begin(), listToSort.end(), [] (const ModuleIDAndFolder& m1, const ModuleIDAndFolder& m2)\r
- {\r
- return m1.first.compareIgnoreCase (m2.first) < 0;\r
- });\r
+ return {};\r
}\r
\r
-//==============================================================================\r
-struct ModuleScannerJob : public ThreadPoolJob\r
+static File getPathToSpecifiedModule (Project& project, StringRef moduleID)\r
{\r
- ModuleScannerJob (const Array<File>& paths, std::function<void (const ModuleIDAndFolderList&)>&& callback)\r
- : ThreadPoolJob ("ModuleScannerJob"),\r
- pathsToScan (paths),\r
- completionCallback (std::move (callback))\r
+ auto& modules = project.getModules();\r
+\r
+ if (! modules.shouldUseGlobalPath (moduleID))\r
{\r
+ for (Project::ExporterIterator exporter (project); exporter.next();)\r
+ {\r
+ if (! exporter->mayCompileOnCurrentOS())\r
+ continue;\r
+\r
+ auto path = getModuleFolderFromPathIfItExists (exporter->getPathForModuleString (moduleID), moduleID, project);\r
+\r
+ if (path != File())\r
+ return path;\r
+ }\r
}\r
\r
- JobStatus runJob() override\r
- {\r
- ModuleIDAndFolderList list;\r
+ return {};\r
+}\r
\r
- for (auto& p : pathsToScan)\r
- addAllModulesInFolder (p, list);\r
+static Array<File> getAllPossibleModulePathsFromExporters (Project& project)\r
+{\r
+ StringArray paths;\r
\r
- if (! shouldExit())\r
+ for (Project::ExporterIterator exporter (project); exporter.next();)\r
+ {\r
+ auto& modules = project.getModules();\r
+ auto n = modules.getNumModules();\r
+\r
+ for (int i = 0; i < n; ++i)\r
{\r
- sort (list);\r
- completionCallback (list);\r
+ auto id = modules.getModuleID (i);\r
+\r
+ if (modules.shouldUseGlobalPath (id))\r
+ continue;\r
+\r
+ auto path = exporter->getPathForModuleString (id);\r
+\r
+ if (path.isNotEmpty())\r
+ paths.addIfNotAlreadyThere (path);\r
}\r
\r
- return jobHasFinished;\r
+ auto oldPath = exporter->getLegacyModulePath();\r
+\r
+ if (oldPath.isNotEmpty())\r
+ paths.addIfNotAlreadyThere (oldPath);\r
}\r
\r
- Array<File> pathsToScan;\r
- std::function<void (const ModuleIDAndFolderList&)> completionCallback;\r
-};\r
+ Array<File> files;\r
\r
-AvailableModuleList::AvailableModuleList()\r
-{\r
-}\r
+ for (auto& path : paths)\r
+ {\r
+ auto f = project.resolveFilename (path);\r
\r
-ThreadPoolJob* AvailableModuleList::createScannerJob (const Array<File>& paths)\r
-{\r
- return new ModuleScannerJob (paths, [this] (ModuleIDAndFolderList scannedModuleList)\r
- {\r
- {\r
- const ScopedLock swapLock (lock);\r
- moduleList.swap (scannedModuleList);\r
- }\r
+ if (f.isDirectory())\r
+ {\r
+ files.addIfNotAlreadyThere (f);\r
\r
- listeners.call ([] (Listener& l) { MessageManager::callAsync ([&] { l.availableModulesChanged(); }); });\r
- });\r
-}\r
+ if (f.getChildFile ("modules").isDirectory())\r
+ files.addIfNotAlreadyThere (f.getChildFile ("modules"));\r
+ }\r
+ }\r
\r
-void AvailableModuleList::removePendingAndAddJob (ThreadPoolJob* jobToAdd)\r
-{\r
- scanPool.removeAllJobs (false, 100);\r
- scanPool.addJob (jobToAdd, true);\r
+ return files;\r
}\r
\r
-void AvailableModuleList::scanPaths (const Array<File>& paths)\r
+Result ModuleList::scanProjectExporterModulePaths (Project& project)\r
{\r
- auto* job = createScannerJob (paths);\r
+ modules.clear();\r
+ Result result (Result::ok());\r
\r
- removePendingAndAddJob (job);\r
- scanPool.waitForJobToFinish (job, -1);\r
-}\r
+ for (auto& m : getAllPossibleModulePathsFromExporters (project))\r
+ {\r
+ result = addAllModulesInFolder (m);\r
\r
-void AvailableModuleList::scanPathsAsync (const Array<File>& paths)\r
-{\r
- removePendingAndAddJob (createScannerJob (paths));\r
+ if (result.failed())\r
+ break;\r
+ }\r
+\r
+ sort();\r
+ return result;\r
}\r
\r
-ModuleIDAndFolderList AvailableModuleList::getAllModules() const\r
+void ModuleList::scanGlobalJuceModulePath()\r
{\r
- const ScopedLock readLock (lock);\r
+ modules.clear();\r
\r
- return moduleList;\r
-}\r
+ auto& settings = getAppSettings();\r
\r
-ModuleIDAndFolder AvailableModuleList::getModuleWithID (const String& id) const\r
-{\r
- const ScopedLock readLock (lock);\r
+ auto path = settings.getStoredPath (Ids::defaultJuceModulePath).toString();\r
\r
- for (auto& mod : moduleList)\r
- if (mod.first == id)\r
- return mod;\r
+ if (path.isNotEmpty())\r
+ addAllModulesInFolder ({ path });\r
\r
- return {};\r
+ sort();\r
}\r
\r
-void AvailableModuleList::removeDuplicates (const ModuleIDAndFolderList& other)\r
+void ModuleList::scanGlobalUserModulePath()\r
{\r
- const ScopedLock readLock (lock);\r
+ modules.clear();\r
\r
- for (auto& m : other)\r
- {\r
- auto pos = std::find (moduleList.begin(), moduleList.end(), m);\r
+ auto paths = StringArray::fromTokens (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), ";", {});\r
\r
- if (pos != moduleList.end())\r
- moduleList.erase (pos);\r
+ for (auto p : paths)\r
+ {\r
+ auto f = File::createFileWithoutCheckingPath (p.trim());\r
+ if (f.exists())\r
+ addAllModulesInFolder (f);\r
}\r
+\r
+ sort();\r
}\r
\r
//==============================================================================\r
void LibraryModule::writeIncludes (ProjectSaver& projectSaver, OutputStream& out)\r
{\r
auto& project = projectSaver.project;\r
- auto& modules = project.getEnabledModules();\r
+ auto& modules = project.getModules();\r
\r
auto id = getID();\r
\r
\r
{\r
Array<File> compiled;\r
- auto& modules = project.getEnabledModules();\r
+ auto& modules = project.getModules();\r
auto id = getID();\r
\r
auto localModuleFolder = modules.shouldCopyModuleFilesLocally (id).getValue() ? project.getLocalModuleFolder (id)\r
\r
ModuleDescription EnabledModuleList::getModuleInfo (const String& moduleID)\r
{\r
- return ModuleDescription (project.getModuleWithID (moduleID).second);\r
+ return ModuleDescription (getModuleFolder (moduleID));\r
}\r
\r
bool EnabledModuleList::isModuleEnabled (const String& moduleID) const\r
.getPropertyAsValue (Ids::showAllCode, getUndoManager());\r
}\r
\r
+File EnabledModuleList::findUserModuleFolder (const String& possiblePaths, const String& moduleID)\r
+{\r
+ auto paths = StringArray::fromTokens (possiblePaths, ";", {});\r
+\r
+ for (auto p : paths)\r
+ {\r
+ auto f = File::createFileWithoutCheckingPath (p.trim());\r
+ if (f.exists())\r
+ {\r
+ auto moduleFolder = getModuleFolderFromPathIfItExists (f.getFullPathName(), moduleID, project);\r
+ if (moduleFolder != File())\r
+ return moduleFolder;\r
+ }\r
+ }\r
+\r
+ return {};\r
+}\r
+\r
+File EnabledModuleList::getModuleFolder (const String& moduleID)\r
+{\r
+ if (shouldUseGlobalPath (moduleID))\r
+ {\r
+ if (isJUCEModule (moduleID))\r
+ return getModuleFolderFromPathIfItExists (getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString(), moduleID, project);\r
+\r
+ return findUserModuleFolder (getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString(), moduleID);\r
+ }\r
+\r
+ {\r
+ auto path = getPathToSpecifiedModule (project, moduleID);\r
+\r
+ if (path != File())\r
+ return path;\r
+ }\r
+\r
+ auto paths = getAllPossibleModulePathsFromExporters (project);\r
+ for (auto p : paths)\r
+ {\r
+ auto f = getModuleFolderFromPathIfItExists (p.getFullPathName(), moduleID, project);\r
+ if (f != File())\r
+ return f;\r
+ }\r
+\r
+ return {};\r
+}\r
+\r
struct ModuleTreeSorter\r
{\r
static int compareElements (const ValueTree& m1, const ValueTree& m2)\r
if (! isModuleEnabled (moduleID))\r
{\r
ValueTree module (Ids::MODULE);\r
- module.setProperty (Ids::ID, moduleID, getUndoManager());\r
+ module.setProperty (Ids::ID, moduleID, nullptr);\r
\r
state.appendChild (module, getUndoManager());\r
sortAlphabetically();\r
for (Project::ExporterIterator exporter (project); exporter.next();)\r
exporter->getPathForModuleValue (moduleID) = path.toUnixStyle();\r
\r
- if (! useGlobalPath)\r
- project.rescanExporterPathModules (false);\r
-\r
if (sendAnalyticsEvent)\r
{\r
StringPairArray data;\r
\r
static void getDependencies (Project& project, const String& moduleID, StringArray& dependencies)\r
{\r
- auto info = project.getEnabledModules().getModuleInfo (moduleID);\r
+ auto info = project.getModules().getModuleInfo (moduleID);\r
\r
for (auto uid : info.getDependencies())\r
{\r
void EnabledModuleList::setLocalCopyModeForAllModules (bool copyLocally)\r
{\r
for (auto i = getNumModules(); --i >= 0;)\r
- shouldCopyModuleFilesLocally (project.getEnabledModules().getModuleID (i)) = copyLocally;\r
+ shouldCopyModuleFilesLocally (project.getModules().getModuleID (i)) = copyLocally;\r
+}\r
+\r
+File EnabledModuleList::findGlobalModulesFolder()\r
+{\r
+ auto& settings = getAppSettings();\r
+ auto path = settings.getStoredPath (Ids::defaultJuceModulePath).toString();\r
+\r
+ if (settings.isGlobalPathValid ({}, Ids::defaultJuceModulePath, path))\r
+ return { path };\r
+\r
+ return {};\r
}\r
\r
File EnabledModuleList::findDefaultModulesFolder (Project& project)\r
{\r
- File globalPath (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString());\r
+ auto globalPath = findGlobalModulesFolder();\r
\r
- if (globalPath.exists())\r
+ if (globalPath != File())\r
return globalPath;\r
\r
- for (auto& exporterPathModule : project.getExporterPathsModuleList().getAllModules())\r
+ ModuleList available;\r
+ available.scanProjectExporterModulePaths (project);\r
+\r
+ for (auto i = available.modules.size(); --i >= 0;)\r
{\r
- auto f = exporterPathModule.second;\r
+ auto f = available.modules.getUnchecked(i)->getFolder();\r
\r
if (f.isDirectory())\r
return f.getParentDirectory();\r
\r
void EnabledModuleList::addModuleInteractive (const String& moduleID)\r
{\r
- auto f = project.getModuleWithID (moduleID).second;\r
+ ModuleList list;\r
\r
- if (f != File())\r
+ list.scanGlobalJuceModulePath();\r
+ if (auto* info = list.getModuleWithID (moduleID))\r
{\r
- addModule (f, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
+ addModule (info->moduleFolder, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
return;\r
}\r
\r
- addModuleFromUserSelectedFile();\r
+ list.scanGlobalUserModulePath();\r
+ if (auto* info = list.getModuleWithID (moduleID))\r
+ {\r
+ addModule (info->moduleFolder, areMostModulesCopiedLocally(), areMostModulesUsingGlobalPath(), true);\r
+ return;\r
+ }\r
+\r
+ list.scanProjectExporterModulePaths (project);\r
+ if (auto* info = list.getModuleWithID (moduleID))\r
+ addModule (info->moduleFolder, areMostModulesCopiedLocally(), false, true);\r
+ else\r
+ addModuleFromUserSelectedFile();\r
}\r
\r
void EnabledModuleList::addModuleOfferingToCopy (const File& f, bool isFromUserSpecifiedFolder)\r
URL url;\r
};\r
\r
+//==============================================================================\r
+struct ModuleList\r
+{\r
+ ModuleList();\r
+ ModuleList (const ModuleList&);\r
+ ModuleList& operator= (const ModuleList&);\r
+\r
+ const ModuleDescription* getModuleWithID (const String& moduleID) const;\r
+ StringArray getIDs() const;\r
+ void sort();\r
+\r
+ Result tryToAddModuleFromFolder (const File&);\r
+\r
+ Result addAllModulesInFolder (const File&);\r
+ Result addAllModulesInSubfoldersRecursively (const File&, int depth);\r
+ Result scanProjectExporterModulePaths (Project&);\r
+ void scanGlobalJuceModulePath();\r
+ void scanGlobalUserModulePath();\r
+\r
+ OwnedArray<ModuleDescription> modules;\r
+};\r
+\r
//==============================================================================\r
class LibraryModule\r
{\r
void addBrowseableCode (ProjectExporter&, const Array<File>& compiled, const File& localModuleFolder) const;\r
};\r
\r
-//==============================================================================\r
-using ModuleIDAndFolder = std::pair<String, File>;\r
-using ModuleIDAndFolderList = std::vector<ModuleIDAndFolder>;\r
-\r
-class AvailableModuleList\r
-{\r
-public:\r
- AvailableModuleList();\r
-\r
- void scanPaths (const Array<File>&);\r
- void scanPathsAsync (const Array<File>&);\r
-\r
- ModuleIDAndFolderList getAllModules() const;\r
- ModuleIDAndFolder getModuleWithID (const String&) const;\r
-\r
- void removeDuplicates (const ModuleIDAndFolderList& other);\r
-\r
- //==============================================================================\r
- struct Listener\r
- {\r
- virtual ~Listener() {}\r
-\r
- virtual void availableModulesChanged() = 0;\r
- };\r
-\r
- void addListener (Listener* listenerToAdd) { listeners.add (listenerToAdd); }\r
- void removeListener (Listener* listenerToRemove) { listeners.remove (listenerToRemove); }\r
-\r
-private:\r
- ThreadPoolJob* createScannerJob (const Array<File>&);\r
- void removePendingAndAddJob (ThreadPoolJob*);\r
-\r
- ThreadPool scanPool { 1 };\r
-\r
- ModuleIDAndFolderList moduleList;\r
- ListenerList<Listener> listeners;\r
- CriticalSection lock;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AvailableModuleList)\r
-};\r
-\r
//==============================================================================\r
class EnabledModuleList\r
{\r
public:\r
EnabledModuleList (Project&, const ValueTree&);\r
\r
+ static File findGlobalModulesFolder();\r
static File findDefaultModulesFolder (Project&);\r
\r
bool isModuleEnabled (const String& moduleID) const;\r
bool isAudioPluginModuleMissing() const;\r
\r
ModuleDescription getModuleInfo (const String& moduleID);\r
+ File getModuleFolder (const String& moduleID);\r
\r
void addModule (const File& moduleManifestFile, bool copyLocally, bool useGlobalPath, bool sendAnalyticsEvent);\r
void addModuleInteractive (const String& moduleID);\r
private:\r
UndoManager* getUndoManager() const { return project.getUndoManagerFor (state); }\r
\r
+ File findUserModuleFolder (const String& possiblePaths, const String& moduleID);\r
+\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnabledModuleList)\r
};\r
setFile (f);\r
\r
removeDefunctExporters();\r
- exporterPathsModuleList.reset (new AvailableModuleList());\r
updateOldModulePaths();\r
updateOldStyleConfigList();\r
setCppVersionFromOldExporterSettings();\r
\r
parsedPreprocessorDefs = parsePreprocessorDefs (preprocessorDefsValue.get());\r
\r
- getEnabledModules().sortAlphabetically();\r
+ getModules().sortAlphabetically();\r
\r
projectRoot.addListener (this);\r
\r
{\r
projectNameValue = newTitle;\r
\r
- updateTitleDependencies();\r
+ updateTitle();\r
}\r
\r
-void Project::updateTitleDependencies()\r
+void Project::updateTitle()\r
{\r
auto projectName = getProjectNameString();\r
\r
getMainGroup().getNameValue() = projectName;\r
\r
- pluginNameValue. setDefault (projectName);\r
- pluginDescriptionValue. setDefault (projectName);\r
- bundleIdentifierValue. setDefault (getDefaultBundleIdentifierString());\r
+ pluginNameValue.setDefault (projectName);\r
+ pluginDescriptionValue.setDefault (projectName);\r
+ bundleIdentifierValue.setDefault (getDefaultBundleIdentifierString());\r
pluginAUExportPrefixValue.setDefault (CodeHelpers::makeValidIdentifier (projectName, false, true, false) + "AU");\r
- pluginAAXIdentifierValue. setDefault (getDefaultAAXIdentifierString());\r
+ pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString());\r
}\r
\r
String Project::getDocumentTitle()\r
return getProjectNameString();\r
}\r
\r
-void Project::updateCompanyNameDependencies()\r
-{\r
- bundleIdentifierValue.setDefault (getDefaultBundleIdentifierString());\r
- pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString());\r
- pluginManufacturerValue.setDefault (getDefaultPluginManufacturerString());\r
-}\r
-\r
void Project::updateProjectSettings()\r
{\r
projectRoot.setProperty (Ids::jucerVersion, ProjectInfo::versionString, nullptr);\r
if (! projectRoot.getChildWithName (Ids::MAINGROUP).isValid())\r
{\r
Item mainGroup (*this, ValueTree (Ids::MAINGROUP), false);\r
- projectRoot.addChild (mainGroup.state, 0, nullptr);\r
+ projectRoot.addChild (mainGroup.state, 0, 0);\r
}\r
\r
getMainGroup().initialiseMissingProperties();\r
if (projectUIDValue.isUsingDefault())\r
projectUIDValue = projectUIDValue.getDefault();\r
\r
+ projectTypeValue.referTo (projectRoot, Ids::projectType, getUndoManager(), ProjectType_GUIApp::getTypeName());\r
+ versionValue.referTo (projectRoot, Ids::version, getUndoManager(), "1.0.0");\r
+ bundleIdentifierValue.referTo (projectRoot, Ids::bundleIdentifier, getUndoManager(), getDefaultBundleIdentifierString());\r
+\r
companyNameValue.referTo (projectRoot, Ids::companyName, getUndoManager());\r
companyCopyrightValue.referTo (projectRoot, Ids::companyCopyright, getUndoManager());\r
companyWebsiteValue.referTo (projectRoot, Ids::companyWebsite, getUndoManager());\r
companyEmailValue.referTo (projectRoot, Ids::companyEmail, getUndoManager());\r
\r
- projectTypeValue.referTo (projectRoot, Ids::projectType, getUndoManager(), ProjectType_GUIApp::getTypeName());\r
- versionValue.referTo (projectRoot, Ids::version, getUndoManager(), "1.0.0");\r
- bundleIdentifierValue.referTo (projectRoot, Ids::bundleIdentifier, getUndoManager(), getDefaultBundleIdentifierString());\r
-\r
displaySplashScreenValue.referTo (projectRoot, Ids::displaySplashScreen, getUndoManager(), ! ProjucerApplication::getApp().isPaidOrGPL());\r
splashScreenColourValue.referTo (projectRoot, Ids::splashScreenColour, getUndoManager(), "Dark");\r
reportAppUsageValue.referTo (projectRoot, Ids::reportAppUsage, getUndoManager());\r
void Project::initialiseAudioPluginValues()\r
{\r
pluginFormatsValue.referTo (projectRoot, Ids::pluginFormats, getUndoManager(),\r
- Array<var> (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()), ",");\r
+ Array<var> (Ids::buildVST.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()), ",");\r
pluginCharacteristicsValue.referTo (projectRoot, Ids::pluginCharacteristicsValue, getUndoManager(), Array<var> (), ",");\r
\r
pluginNameValue.referTo (projectRoot, Ids::pluginName, getUndoManager(), getProjectNameString());\r
pluginDescriptionValue.referTo (projectRoot, Ids::pluginDesc, getUndoManager(), getProjectNameString());\r
- pluginManufacturerValue.referTo (projectRoot, Ids::pluginManufacturer, getUndoManager(), getDefaultPluginManufacturerString());\r
+ pluginManufacturerValue.referTo (projectRoot, Ids::pluginManufacturer, getUndoManager(), "yourcompany");\r
pluginManufacturerCodeValue.referTo (projectRoot, Ids::pluginManufacturerCode, getUndoManager(), "Manu");\r
pluginCodeValue.referTo (projectRoot, Ids::pluginCode, getUndoManager(), makeValid4CC (getProjectUIDString() + getProjectUIDString()));\r
pluginChannelConfigsValue.referTo (projectRoot, Ids::pluginChannelConfigs, getUndoManager());\r
CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false) + "AU");\r
\r
pluginAUMainTypeValue.referTo (projectRoot, Ids::pluginAUMainType, getUndoManager(), getDefaultAUMainTypes(), ",");\r
- pluginAUSandboxSafeValue.referTo (projectRoot, Ids::pluginAUIsSandboxSafe, getUndoManager(), false);\r
pluginVSTCategoryValue.referTo (projectRoot, Ids::pluginVSTCategory, getUndoManager(), getDefaultVSTCategories(), ",");\r
pluginVST3CategoryValue.referTo (projectRoot, Ids::pluginVST3Category, getUndoManager(), getDefaultVST3Categories(), ",");\r
pluginRTASCategoryValue.referTo (projectRoot, Ids::pluginRTASCategory, getUndoManager(), getDefaultRTASCategories(), ",");\r
\r
if (formatsToBuild.size() > 0)\r
{\r
- if (pluginFormatsValue.isUsingDefault())\r
- {\r
- pluginFormatsValue = formatsToBuild;\r
- }\r
- else\r
- {\r
- auto formatVar = pluginFormatsValue.get();\r
-\r
- if (auto* arr = formatVar.getArray())\r
- arr->addArray (formatsToBuild);\r
- }\r
-\r
+ pluginFormatsValue = formatsToBuild;\r
shouldWriteLegacyPluginFormatSettings = true;\r
}\r
}\r
+ JUCE_BUILDNUMBER;\r
}\r
\r
-static bool isModuleNewerThanProjucer (const ModuleDescription& module)\r
+static bool isAnyModuleNewerThanProjucer (const OwnedArray<ModuleDescription>& modules)\r
{\r
- if (module.getID().startsWith ("juce_")\r
- && getJuceVersion (module.getVersion()) > getBuiltJuceVersion())\r
- return true;\r
+ for (auto i = modules.size(); --i >= 0;)\r
+ {\r
+ auto* m = modules.getUnchecked(i);\r
+\r
+ if (m->getID().startsWith ("juce_")\r
+ && getJuceVersion (m->getVersion()) > getBuiltJuceVersion())\r
+ return true;\r
+ }\r
\r
return false;\r
}\r
\r
void Project::warnAboutOldProjucerVersion()\r
{\r
- for (auto& juceModule : ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules())\r
- {\r
- if (isModuleNewerThanProjucer ({ juceModule.second }))\r
- {\r
- // Projucer is out of date!\r
- if (ProjucerApplication::getApp().isRunningCommandLine)\r
- std::cout << "WARNING! This version of the Projucer is out-of-date!" << std::endl;\r
- else\r
- AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
- "Projucer",\r
- "This version of the Projucer is out-of-date!"\r
- "\n\n"\r
- "Always make sure that you're running the very latest version, "\r
- "preferably compiled directly from the JUCE repository that you're working with!");\r
-\r
- return;\r
- }\r
- }\r
+ ModuleList available;\r
+\r
+ available.scanGlobalJuceModulePath();\r
+\r
+ if (! isAnyModuleNewerThanProjucer (available.modules))\r
+ available.scanGlobalUserModulePath();\r
+\r
+ if (! isAnyModuleNewerThanProjucer (available.modules))\r
+ available.scanProjectExporterModulePaths (*this);\r
+\r
+ if (! isAnyModuleNewerThanProjucer (available.modules))\r
+ return;\r
+\r
+ // Projucer is out of date!\r
+ if (ProjucerApplication::getApp().isRunningCommandLine)\r
+ std::cout << "WARNING! This version of the Projucer is out-of-date!" << std::endl;\r
+ else\r
+ AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,\r
+ "Projucer",\r
+ "This version of the Projucer is out-of-date!"\r
+ "\n\n"\r
+ "Always make sure that you're running the very latest version, "\r
+ "preferably compiled directly from the JUCE repository that you're working with!");\r
}\r
\r
//==============================================================================\r
//==============================================================================\r
Result Project::loadDocument (const File& file)\r
{\r
- auto xml = parseXML (file);\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (file));\r
\r
if (xml == nullptr || ! xml->hasTagName (Ids::JUCERPROJECT.toString()))\r
return Result::fail ("Not a valid Jucer project!");\r
\r
registerRecentFile (file);\r
\r
- enabledModuleList.reset();\r
+ enabledModulesList.reset();\r
projectRoot = newTree;\r
\r
initialiseProjectValues();\r
\r
compileEngineSettings.reset (new CompileEngineSettings (projectRoot));\r
\r
- exporterPathsModuleList.reset (new AvailableModuleList());\r
- rescanExporterPathModules (! ProjucerApplication::getApp().isRunningCommandLine);\r
-\r
return Result::ok();\r
}\r
\r
\r
updateProjectSettings();\r
\r
- if (! isCommandLineApp)\r
- {\r
- ProjucerApplication::getApp().openDocumentManager.saveAll();\r
-\r
- if (! isTemporaryProject())\r
- registerRecentFile (file);\r
- }\r
+ if (! isCommandLineApp && ! isTemporaryProject())\r
+ registerRecentFile (file);\r
\r
const ScopedValueSetter<bool> vs (isSaving, true, false);\r
\r
}\r
else if (property == Ids::name)\r
{\r
- updateTitleDependencies();\r
- }\r
- else if (property == Ids::companyName)\r
- {\r
- updateCompanyNameDependencies();\r
+ updateTitle();\r
}\r
else if (property == Ids::defines)\r
{\r
return shouldBuildAUv3();\r
case ProjectType::Target::StandalonePlugIn:\r
return shouldBuildStandalonePlugin();\r
- case ProjectType::Target::UnityPlugIn:\r
- return shouldBuildUnityPlugin();\r
case ProjectType::Target::AggregateTarget:\r
case ProjectType::Target::SharedCodeTarget:\r
return projectType.isAudioPlugin();\r
else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST2")) return ProjectType::Target::VSTPlugIn;\r
else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST3")) return ProjectType::Target::VST3PlugIn;\r
else if (LibraryModule::CompileUnit::hasSuffix (file, "_Standalone")) return ProjectType::Target::StandalonePlugIn;\r
- else if (LibraryModule::CompileUnit::hasSuffix (file, "_Unity")) return ProjectType::Target::UnityPlugIn;\r
\r
return (returnSharedTargetIfNoValidSuffix ? ProjectType::Target::SharedCodeTarget : ProjectType::Target::unspecified);\r
}\r
case AudioUnitv3PlugIn: return "AUv3 AppExtension";\r
case AAXPlugIn: return "AAX";\r
case RTASPlugIn: return "RTAS";\r
- case UnityPlugIn: return "Unity Plugin";\r
case SharedCodeTarget: return "Shared Code";\r
case AggregateTarget: return "All";\r
default: return "undefined";\r
case AudioUnitv3PlugIn: return macOSAppex;\r
case AAXPlugIn: return pluginBundle;\r
case RTASPlugIn: return pluginBundle;\r
- case UnityPlugIn: return pluginBundle;\r
case SharedCodeTarget: return staticLibrary;\r
default:\r
break;\r
"The name of the project.");\r
\r
props.add (new TextPropertyComponent (versionValue, "Project Version", 16, false),\r
- "The project's version number. This should be in the format major.minor.point[.point] where you should omit the final "\r
- "(optional) [.point] if you are targeting AU and AUv3 plug-ins as they only support three number versions.");\r
+ "The project's version number, This should be in the format major.minor.point[.point]");\r
\r
props.add (new TextPropertyComponent (companyNameValue, "Company Name", 256, false),\r
"Your company name, which will be added to the properties of the binary where possible");\r
void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)\r
{\r
props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats",\r
- { "VST3", "AU", "AUv3", "RTAS", "AAX", "Standalone", "Unity", "Enable IAA", "VST (Legacy)" },\r
- { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(),\r
- Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::buildUnity.toString(),\r
- Ids::enableIAA.toString(), Ids::buildVST.toString() }),\r
- "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK "\r
- "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK "\r
- "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins.");\r
+ { "VST", "VST3", "AU", "AUv3", "RTAS", "AAX", "Standalone", "Enable IAA" },\r
+ { Ids::buildVST.toString(), Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(),\r
+ Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::enableIAA.toString() }),\r
+ "Plugin formats to build.");\r
props.add (new MultiChoicePropertyComponent (pluginCharacteristicsValue, "Plugin Characteristics",\r
{ "Plugin is a Synth", "Plugin MIDI Input", "Plugin MIDI Output", "MIDI Effect Plugin", "Plugin Editor Requires Keyboard Focus",\r
"Disable RTAS Bypass", "Disable AAX Bypass", "Disable RTAS Multi-Mono", "Disable AAX Multi-Mono" },\r
Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), Ids::pluginRTASDisableBypass.toString(),\r
Ids::pluginAAXDisableBypass.toString(), Ids::pluginRTASDisableMultiMono.toString(), Ids::pluginAAXDisableMultiMono.toString() }),\r
"Some characteristics of your plugin such as whether it is a synth, produces MIDI messages, accepts MIDI messages etc.");\r
+\r
props.add (new TextPropertyComponent (pluginNameValue, "Plugin Name", 128, false),\r
"The name of your plugin (keep it short!)");\r
props.add (new TextPropertyComponent (pluginDescriptionValue, "Plugin Description", 256, false),\r
"The value to use for the JucePlugin_AAXIdentifier setting");\r
props.add (new TextPropertyComponent (pluginAUExportPrefixValue, "Plugin AU Export Prefix", 128, false),\r
"A prefix for the names of exported entry-point functions that the component exposes - typically this will be a version of your plugin's name that can be used as part of a C++ token.");\r
+\r
props.add (new MultiChoicePropertyComponent (pluginAUMainTypeValue, "Plugin AU Main Type", getAllAUMainTypeStrings(), getAllAUMainTypeVars(), 1),\r
"AU main type.");\r
- props.add (new ChoicePropertyComponent (pluginAUSandboxSafeValue, "Plugin AU is sandbox safe"),\r
- "Check this box if your plug-in is sandbox safe. A sand-box safe plug-in is loaded in a restricted path and can only access it's own bundle resources and "\r
- "the Music folder. Your plug-in must be able to deal with this. Newer versions of GarageBand require this to be enabled.");\r
\r
{\r
- Array<var> vst3CategoryVars;\r
+ Array<var> vstCategoryVars;\r
+ for (auto s : getAllVSTCategoryStrings())\r
+ vstCategoryVars.add (s);\r
\r
+ props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST Category", getAllVSTCategoryStrings(), vstCategoryVars, 1),\r
+ "VST category.");\r
+ }\r
+\r
+ {\r
+ Array<var> vst3CategoryVars;\r
for (auto s : getAllVST3CategoryStrings())\r
vst3CategoryVars.add (s);\r
\r
props.add (new MultiChoicePropertyComponent (pluginVST3CategoryValue, "Plugin VST3 Category", getAllVST3CategoryStrings(), vst3CategoryVars),\r
- "VST3 category. Most hosts require either \"Fx\" or \"Instrument\" to be selected in order for the plugin to be recognised. "\r
- "If neither of these are selected, the appropriate one will be automatically added based on the \"Plugin is a synth\" option.");\r
+ "VST3 category.");\r
}\r
\r
props.add (new MultiChoicePropertyComponent (pluginRTASCategoryValue, "Plugin RTAS Category", getAllRTASCategoryStrings(), getAllRTASCategoryVars()),\r
"RTAS category.");\r
props.add (new MultiChoicePropertyComponent (pluginAAXCategoryValue, "Plugin AAX Category", getAllAAXCategoryStrings(), getAllAAXCategoryVars()),\r
"AAX category.");\r
-\r
- {\r
- Array<var> vstCategoryVars;\r
- for (auto s : getAllVSTCategoryStrings())\r
- vstCategoryVars.add (s);\r
-\r
- props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST (Legacy) Category", getAllVSTCategoryStrings(), vstCategoryVars, 1),\r
- "VST category.");\r
- }\r
}\r
\r
//==============================================================================\r
+ (segments[1].getIntValue() << 8)\r
+ segments[2].getIntValue();\r
\r
- if (segments.size() > 3)\r
+ if (segments.size() >= 4)\r
value = (value << 8) + segments[3].getIntValue();\r
\r
return value;\r
|| getFile().hasFileExtension (headerFileExtensions));\r
}\r
\r
-bool Project::Item::needsSaving() const noexcept\r
-{\r
- auto& odm = ProjucerApplication::getApp().openDocumentManager;\r
-\r
- if (odm.anyFilesNeedSaving())\r
- {\r
- for (int i = 0; i < odm.getNumOpenDocuments(); ++i)\r
- {\r
- auto* doc = odm.getOpenDocument (i);\r
- if (doc->needsSaving() && doc->getFile() == getFile())\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
-}\r
-\r
//==============================================================================\r
ValueTree Project::getConfigNode()\r
{\r
}\r
\r
//==============================================================================\r
-static String getCompanyNameOrDefault (StringRef str)\r
-{\r
- if (str.isEmpty())\r
- return "yourcompany";\r
-\r
- return str;\r
-}\r
-\r
-String Project::getDefaultBundleIdentifierString() const\r
-{\r
- return "com." + getCompanyNameOrDefault (getCompanyNameString()) + "." + CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false);\r
-}\r
-\r
-String Project::getDefaultPluginManufacturerString() const\r
-{\r
- return getCompanyNameOrDefault (getCompanyNameString());\r
-}\r
-\r
String Project::getAUMainTypeString() const noexcept\r
{\r
auto v = pluginAUMainTypeValue.get();\r
return {};\r
}\r
\r
-bool Project::isAUSandBoxSafe() const noexcept\r
-{\r
- return pluginAUSandboxSafeValue.get();\r
-}\r
-\r
String Project::getVSTCategoryString() const noexcept\r
{\r
auto v = pluginVSTCategoryValue.get();\r
return {};\r
}\r
\r
-static String getVST3CategoryStringFromSelection (Array<var> selected, const Project& p) noexcept\r
+static String getVST3CategoryStringFromSelection (Array<var> selected) noexcept\r
{\r
StringArray categories;\r
\r
for (auto& category : selected)\r
categories.add (category);\r
\r
- // One of these needs to be selected in order for the plug-in to be recognised in Cubase\r
- if (! categories.contains ("Fx") && ! categories.contains ("Instrument"))\r
- {\r
- categories.insert (0, p.isPluginSynth() ? "Instrument"\r
- : "Fx");\r
- }\r
- else\r
- {\r
- // "Fx" and "Instrument" should come first and if both are present prioritise "Fx"\r
- if (categories.contains ("Instrument"))\r
- categories.move (categories.indexOf ("Instrument"), 0);\r
+ // "Fx" and "Instrument" should come first and if both are present prioritise "Fx"\r
+ if (categories.contains ("Instrument"))\r
+ categories.move (categories.indexOf ("Instrument"), 0);\r
\r
- if (categories.contains ("Fx"))\r
- categories.move (categories.indexOf ("Fx"), 0);\r
- }\r
+ if (categories.contains ("Fx"))\r
+ categories.move (categories.indexOf ("Fx"), 0);\r
\r
return categories.joinIntoString ("|");\r
}\r
auto v = pluginVST3CategoryValue.get();\r
\r
if (auto* arr = v.getArray())\r
- return getVST3CategoryStringFromSelection (*arr, *this);\r
+ return getVST3CategoryStringFromSelection (*arr);\r
\r
jassertfalse;\r
return {};\r
//==============================================================================\r
bool Project::isAUPluginHost()\r
{\r
- return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_AU");\r
+ return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_AU");\r
}\r
\r
bool Project::isVSTPluginHost()\r
{\r
- return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST");\r
+ return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST");\r
}\r
\r
bool Project::isVST3PluginHost()\r
{\r
- return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
+ return getModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3");\r
}\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
-EnabledModuleList& Project::getEnabledModules()\r
-{\r
- if (enabledModuleList == nullptr)\r
- enabledModuleList.reset (new EnabledModuleList (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr)));\r
-\r
- return *enabledModuleList;\r
-}\r
-\r
-static StringArray getModulePathsFromExporters (Project& project, bool onlyThisOS)\r
-{\r
- StringArray paths;\r
-\r
- for (Project::ExporterIterator exporter (project); exporter.next();)\r
- {\r
- if (onlyThisOS && ! exporter->mayCompileOnCurrentOS())\r
- continue;\r
-\r
- auto& modules = project.getEnabledModules();\r
- auto n = modules.getNumModules();\r
-\r
- for (int i = 0; i < n; ++i)\r
- {\r
- auto id = modules.getModuleID (i);\r
-\r
- if (modules.shouldUseGlobalPath (id))\r
- continue;\r
-\r
- auto path = exporter->getPathForModuleString (id);\r
-\r
- if (path.isNotEmpty())\r
- paths.addIfNotAlreadyThere (path);\r
- }\r
-\r
- auto oldPath = exporter->getLegacyModulePath();\r
-\r
- if (oldPath.isNotEmpty())\r
- paths.addIfNotAlreadyThere (oldPath);\r
- }\r
-\r
- return paths;\r
-}\r
-\r
-static Array<File> getExporterModulePathsToScan (Project& project)\r
+EnabledModuleList& Project::getModules()\r
{\r
- auto exporterPaths = getModulePathsFromExporters (project, true);\r
-\r
- if (exporterPaths.isEmpty())\r
- exporterPaths = getModulePathsFromExporters (project, false);\r
-\r
- Array<File> files;\r
-\r
- for (auto& path : exporterPaths)\r
- {\r
- auto f = project.resolveFilename (path);\r
-\r
- if (f.isDirectory())\r
- {\r
- files.addIfNotAlreadyThere (f);\r
-\r
- if (f.getChildFile ("modules").isDirectory())\r
- files.addIfNotAlreadyThere (f.getChildFile ("modules"));\r
- }\r
- }\r
-\r
- return files;\r
-}\r
-\r
-AvailableModuleList& Project::getExporterPathsModuleList()\r
-{\r
- return *exporterPathsModuleList;\r
-}\r
-\r
-void Project::rescanExporterPathModules (bool async)\r
-{\r
- if (async)\r
- exporterPathsModuleList->scanPathsAsync (getExporterModulePathsToScan (*this));\r
- else\r
- exporterPathsModuleList->scanPaths (getExporterModulePathsToScan (*this));\r
-}\r
-\r
-ModuleIDAndFolder Project::getModuleWithID (const String& id)\r
-{\r
- if (! getEnabledModules().shouldUseGlobalPath (id))\r
- {\r
- const auto& mod = exporterPathsModuleList->getModuleWithID (id);\r
-\r
- if (mod.second != File())\r
- return mod;\r
- }\r
-\r
- const auto& list = (isJUCEModule (id) ? ProjucerApplication::getApp().getJUCEPathModuleList().getAllModules()\r
- : ProjucerApplication::getApp().getUserPathsModuleList().getAllModules());\r
-\r
- for (auto& m : list)\r
- if (m.first == id)\r
- return m;\r
+ if (enabledModulesList == nullptr)\r
+ enabledModulesList.reset (new EnabledModuleList (*this, projectRoot.getOrCreateChildWithName (Ids::MODULES, nullptr)));\r
\r
- return exporterPathsModuleList->getModuleWithID (id);\r
+ return *enabledModulesList;\r
}\r
\r
//==============================================================================\r
class ProjectExporter;\r
class LibraryModule;\r
class EnabledModuleList;\r
-class AvailableModuleList;\r
class ProjectContentComponent;\r
class CompileEngineSettings;\r
\r
void setProjectVersion (const String& newVersion) { versionValue = newVersion; }\r
\r
String getBundleIdentifierString() const { return bundleIdentifierValue.get(); }\r
- String getDefaultBundleIdentifierString() const;\r
- String getDefaultAAXIdentifierString() const { return getDefaultBundleIdentifierString(); }\r
- String getDefaultPluginManufacturerString() const;\r
+ String getDefaultBundleIdentifierString() { return "com.yourcompany." + CodeHelpers::makeValidIdentifier (getProjectNameString(), false, true, false); }\r
+ String getDefaultAAXIdentifierString() { return getDefaultBundleIdentifierString(); }\r
\r
String getCompanyNameString() const { return companyNameValue.get(); }\r
String getCompanyCopyrightString() const { return companyCopyrightValue.get(); }\r
bool shouldBuildRTAS() const { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildRTAS); }\r
bool shouldBuildAAX() const { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildAAX); }\r
bool shouldBuildStandalonePlugin() const { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildStandalone); }\r
- bool shouldBuildUnityPlugin() const { return checkMultiChoiceVar (pluginFormatsValue, Ids::buildUnity); }\r
bool shouldEnableIAA() const { return checkMultiChoiceVar (pluginFormatsValue, Ids::enableIAA); }\r
\r
//==============================================================================\r
Array<var> getDefaultRTASCategories() const noexcept;\r
\r
String getAUMainTypeString() const noexcept;\r
- bool isAUSandBoxSafe() const noexcept;\r
String getVSTCategoryString() const noexcept;\r
String getVST3CategoryString() const noexcept;\r
int getAAXCategory() const noexcept;\r
String getIAATypeCode();\r
String getIAAPluginName();\r
\r
- String getUnityScriptName() const { return addUnityPluginPrefixIfNecessary (getProjectNameString()) + "_UnityScript.cs"; }\r
- static String addUnityPluginPrefixIfNecessary (const String& name)\r
- {\r
- if (! name.startsWithIgnoreCase ("audioplugin"))\r
- return "audioplugin_" + name;\r
-\r
- return name;\r
- }\r
-\r
//==============================================================================\r
bool isAUPluginHost();\r
bool isVSTPluginHost();\r
Icon getIcon (bool isOpen = false) const;\r
bool isIconCrossedOut() const;\r
\r
- bool needsSaving() const noexcept;\r
-\r
Project& project;\r
ValueTree state;\r
\r
bool isConfigFlagEnabled (const String& name, bool defaultIsEnabled = false) const;\r
\r
//==============================================================================\r
- EnabledModuleList& getEnabledModules();\r
-\r
- AvailableModuleList& getExporterPathsModuleList();\r
- void rescanExporterPathModules (bool async = false);\r
-\r
- std::pair<String, File> getModuleWithID (const String&);\r
+ EnabledModuleList& getModules();\r
\r
//==============================================================================\r
String getFileTemplate (const String& templateName);\r
\r
ValueWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue,\r
pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue,\r
- pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue;\r
+ pluginAUMainTypeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue;\r
\r
//==============================================================================\r
std::unique_ptr<CompileEngineSettings> compileEngineSettings;\r
- std::unique_ptr<EnabledModuleList> enabledModuleList;\r
- std::unique_ptr<AvailableModuleList> exporterPathsModuleList;\r
\r
//==============================================================================\r
bool shouldWriteLegacyPluginFormatSettings = false;\r
\r
//==============================================================================\r
friend class Item;\r
+ std::unique_ptr<EnabledModuleList> enabledModulesList;\r
bool isSaving = false;\r
Time modificationTime;\r
StringPairArray parsedPreprocessorDefs;\r
void createAudioPluginPropertyEditors (PropertyListBuilder& props);\r
\r
//==============================================================================\r
- void updateTitleDependencies();\r
- void updateCompanyNameDependencies();\r
+ void updateTitle();\r
void updateProjectSettings();\r
ValueTree getConfigurations() const;\r
ValueTree getConfigNode();\r
AudioUnitPlugIn = 14,\r
AudioUnitv3PlugIn = 15,\r
StandalonePlugIn = 16,\r
- UnityPlugIn = 17,\r
\r
SharedCodeTarget = 20, // internal\r
AggregateTarget = 21,\r
case Target::AudioUnitPlugIn:\r
case Target::AudioUnitv3PlugIn:\r
case Target::StandalonePlugIn:\r
- case Target::UnityPlugIn:\r
case Target::SharedCodeTarget:\r
case Target::AggregateTarget:\r
return true;\r
return nullptr;\r
}\r
\r
+ //==============================================================================\r
+ void initialiseDependencyPathValues() override\r
+ {\r
+ sdkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidSDKPath), Ids::androidSDKPath, TargetOS::getThisOS())));\r
+ ndkPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::androidNDKPath), Ids::androidNDKPath, TargetOS::getThisOS())));\r
+ }\r
+\r
//==============================================================================\r
ValueWithDefault androidJavaLibs, androidRepositories, androidDependencies, androidScreenOrientation, androidActivityClass,\r
androidActivitySubClassName, androidActivityBaseClassName, androidManifestCustomXmlElements, androidVersionCode,\r
androidKeyAliasPass (settings, Ids::androidKeyAliasPass, getUndoManager(), "android"),\r
gradleVersion (settings, Ids::gradleVersion, getUndoManager(), "4.4"),\r
gradleToolchain (settings, Ids::gradleToolchain, getUndoManager(), "clang"),\r
- androidPluginVersion (settings, Ids::androidPluginVersion, getUndoManager(), "3.1.3"),\r
- buildToolsVersion (settings, Ids::buildToolsVersion, getUndoManager(), "28.0.0"),\r
- AndroidExecutable (getAppSettings().getStoredPath (Ids::androidStudioExePath, TargetOS::getThisOS()).get().toString())\r
+ androidPluginVersion (settings, Ids::androidPluginVersion, getUndoManager(), "3.1.1"),\r
+ buildToolsVersion (settings, Ids::buildToolsVersion, getUndoManager(), "27.0.3"),\r
+ AndroidExecutable (findAndroidExecutable())\r
{\r
name = getName();\r
\r
//==============================================================================\r
void createToolchainExporterProperties (PropertyListBuilder& props)\r
{\r
- props.add (new TextPropertyComponent (gradleVersion, "Gradle Version", 32, false),\r
+ props.add (new TextPropertyComponent (gradleVersion, "gradle version", 32, false),\r
"The version of gradle that is used to build this app (4.4 is fine for JUCE)");\r
\r
- props.add (new TextPropertyComponent (androidPluginVersion, "Android Plug-in Version", 32, false),\r
+ props.add (new TextPropertyComponent (androidPluginVersion, "android plug-in version", 32, false),\r
"The version of the android build plugin for gradle that is used to build this app");\r
\r
props.add (new ChoicePropertyComponent (gradleToolchain, "NDK Toolchain",\r
{ "clang", "gcc" }),\r
"The toolchain that gradle should invoke for NDK compilation (variable model.android.ndk.tooclhain in app/build.gradle)");\r
\r
- props.add (new TextPropertyComponent (buildToolsVersion, "Android Build Tools Version", 32, false),\r
+ props.add (new TextPropertyComponent (buildToolsVersion, "Android build tools version", 32, false),\r
"The Android build tools version that should use to build this app");\r
}\r
\r
void createLibraryModuleExporterProperties (PropertyListBuilder& props)\r
{\r
- props.add (new TextPropertyComponent (androidStaticLibraries, "Import Static Library Modules", 8192, true),\r
+ props.add (new TextPropertyComponent (androidStaticLibraries, "Import static library modules", 8192, true),\r
"Comma or whitespace delimited list of static libraries (.a) defined in NDK_MODULE_PATH.");\r
\r
- props.add (new TextPropertyComponent (androidSharedLibraries, "Import Shared Library Modules", 8192, true),\r
+ props.add (new TextPropertyComponent (androidSharedLibraries, "Import shared library modules", 8192, true),\r
"Comma or whitespace delimited list of shared libraries (.so) defined in NDK_MODULE_PATH.");\r
}\r
\r
overwriteFileIfDifferentOrThrow (gradleProjectFolder.getChildFile (filePath), outStream);\r
}\r
\r
+ //==============================================================================\r
+ static File findAndroidExecutable()\r
+ {\r
+ #if JUCE_WINDOWS\r
+ File defaultInstallation ("C:\\Program Files\\Android\\Android Studio\\bin");\r
+\r
+ if (defaultInstallation.exists())\r
+ {\r
+ {\r
+ auto studio64 = defaultInstallation.getChildFile ("studio64.exe");\r
+\r
+ if (studio64.existsAsFile())\r
+ return studio64;\r
+ }\r
+\r
+ {\r
+ auto studio = defaultInstallation.getChildFile ("studio.exe");\r
+\r
+ if (studio.existsAsFile())\r
+ return studio;\r
+ }\r
+ }\r
+ #elif JUCE_MAC\r
+ File defaultInstallation ("/Applications/Android Studio.app");\r
+\r
+ if (defaultInstallation.exists())\r
+ return defaultInstallation;\r
+ #endif\r
+\r
+ return {};\r
+ }\r
+\r
protected:\r
//==============================================================================\r
class AndroidBuildConfiguration : public BuildConfiguration\r
public:\r
AndroidBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e)\r
: BuildConfiguration (p, settings, e),\r
- androidArchitectures (config, Ids::androidArchitectures, getUndoManager(), isDebug() ? "armeabi-v7a x86" : ""),\r
+ androidArchitectures (config, Ids::androidArchitectures, getUndoManager(), isDebug() ? "armeabi x86" : ""),\r
androidBuildConfigRemoteNotifsConfigFile (config, Ids::androidBuildConfigRemoteNotifsConfigFile, getUndoManager()),\r
androidAdditionalXmlValueResources (config, Ids::androidAdditionalXmlValueResources, getUndoManager()),\r
androidAdditionalDrawableResources (config, Ids::androidAdditionalDrawableResources, getUndoManager()),\r
addGCCOptimisationProperty (props);\r
\r
props.add (new TextPropertyComponent (androidArchitectures, "Architectures", 256, false),\r
- "A list of the ARM architectures to build (for a fat binary). Leave empty to build for all possible android architectures.");\r
+ "A list of the ARM architectures to build (for a fat binary). Leave empty to build for all possible android archiftectures.");\r
\r
props.add (new TextPropertyComponent (androidBuildConfigRemoteNotifsConfigFile.getPropertyAsValue(), "Remote Notifications Config File", 2048, false),\r
"Path to google-services.json file. This will be the file provided by Firebase when creating a new app in Firebase console. "\r
"Paths to additional \"raw resource\" files that should be included in the app (one per line). "\r
"Resource file names must contain only lowercase a-z, 0-9 or underscore.");\r
\r
- props.add (new TextPropertyComponent (androidCustomStringXmlElements, "Custom String Resources", 8192, true),\r
+ props.add (new TextPropertyComponent (androidCustomStringXmlElements, "Custom string resources", 8192, true),\r
"Custom XML resources that will be added to string.xml as children of <resources> element. "\r
"Example: \n<string name=\"value\">text</string>\n"\r
"<string name2=\"value2\">text2</string>\n");\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
{\r
- return *new AndroidBuildConfiguration (project, v, *this);\r
+ return new AndroidBuildConfiguration (project, v, *this);\r
}\r
\r
private:\r
mo << (first ? "IF" : "ELSEIF") << "(JUCE_BUILD_CONFIGURATION MATCHES \"" << cfg.getProductFlavourCMakeIdentifier() <<"\")" << newLine;\r
\r
if (isLibrary())\r
- {\r
mo << " SET(BINARY_NAME \"" << getNativeModuleBinaryName (cfg) << "\")" << newLine;\r
\r
- auto binaryLocation = cfg.getTargetBinaryRelativePathString();\r
-\r
- if (binaryLocation.isNotEmpty())\r
- {\r
- auto locationRelativeToCmake = RelativePath (binaryLocation, RelativePath::projectFolder)\r
- .rebased (getProject().getFile().getParentDirectory(),\r
- file.getParentDirectory(), RelativePath::buildTargetFolder);\r
-\r
- mo << " SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY \"" << "../../../../" << locationRelativeToCmake.toUnixStyle() << "\")" << newLine;\r
- }\r
- }\r
-\r
writeCmakePathLines (mo, " ", "link_directories(", libSearchPaths);\r
\r
if (cfgDefines.size() > 0)\r
{\r
String props;\r
\r
- props << "ndk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidNDKPath, TargetOS::getThisOS()).get().toString()) << newLine\r
- << "sdk.dir=" << sanitisePath (getAppSettings().getStoredPath (Ids::androidSDKPath, TargetOS::getThisOS()).get().toString()) << newLine;\r
+ props << "ndk.dir=" << sanitisePath (ndkPath.toString()) << newLine\r
+ << "sdk.dir=" << sanitisePath (sdkPath.toString()) << newLine;\r
\r
return props;\r
}\r
//==============================================================================\r
void createBaseExporterProperties (PropertyListBuilder& props)\r
{\r
- props.add (new TextPropertyComponent (androidJavaLibs, "Java Libraries to Include", 32768, true),\r
+ props.add (new TextPropertyComponent (androidJavaLibs, "Java libraries to include", 32768, true),\r
"Java libs (JAR files) (one per line). These will be copied to app/libs folder and \"implementation files\" "\r
"dependency will be automatically added to module \"dependencies\" section for each library, so do "\r
"not add the dependency yourself.");\r
\r
- props.add (new TextPropertyComponent (androidRepositories, "Module Repositories", 32768, true),\r
+ props.add (new TextPropertyComponent (androidRepositories, "Module repositories", 32768, true),\r
"Module repositories (one per line). These will be added to module-level gradle file repositories section. ");\r
\r
- props.add (new TextPropertyComponent (androidDependencies, "Module Dependencies", 32768, true),\r
+ props.add (new TextPropertyComponent (androidDependencies, "Module dependencies", 32768, true),\r
"Module dependencies (one per line). These will be added to module-level gradle file \"dependencies\" section. "\r
"If adding any java libs in \"Java libraries to include\" setting, do not add them here as "\r
"they will be added automatically.");\r
\r
- props.add (new ChoicePropertyComponent (androidScreenOrientation, "Screen Orientation",\r
+ props.add (new ChoicePropertyComponent (androidScreenOrientation, "Screen orientation",\r
{ "Portrait and Landscape", "Portrait", "Landscape" },\r
{ "unspecified", "portrait", "landscape" }),\r
"The screen orientations that this app should support");\r
\r
- props.add (new TextPropertyComponent (androidActivityClass, "Android Activity Class Name", 256, false),\r
+ props.add (new TextPropertyComponent (androidActivityClass, "Android Activity class name", 256, false),\r
"The full java class name to use for the app's Activity class.");\r
\r
- props.add (new TextPropertyComponent (androidActivitySubClassName, "Android Activity Sub-Class Name", 256, false),\r
+ props.add (new TextPropertyComponent (androidActivitySubClassName, "Android Activity sub-class name", 256, false),\r
"If not empty, specifies the Android Activity class name stored in the app's manifest. "\r
"Use this if you would like to use your own Android Activity sub-class.");\r
\r
- props.add (new TextPropertyComponent (androidActivityBaseClassName, "Android Activity Base Class", 256, false),\r
+ props.add (new TextPropertyComponent (androidActivityBaseClassName, "Android Activity base class", 256, false),\r
"If not empty, specifies the base class to use for your activity. If custom base class is "\r
"specified, that base class should be a sub-class of android.app.Activity. When empty, Activity "\r
"(android.app.Activity) will be used as the base class. "\r
props.add (new TextPropertyComponent (androidVersionCode, "Android Version Code", 32, false),\r
"An integer value that represents the version of the application code, relative to other versions.");\r
\r
- props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK Version", 32, false),\r
+ props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), sdkPath, "Android SDK Path"),\r
+ "The path to the Android SDK folder on the target build machine");\r
+\r
+ props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), ndkPath, "Android NDK Path"),\r
+ "The path to the Android NDK folder on the target build machine");\r
+\r
+ props.add (new TextPropertyComponent (androidMinimumSDK, "Minimum SDK version", 32, false),\r
"The number of the minimum version of the Android SDK that the app requires");\r
\r
props.add (new TextPropertyComponent (androidExtraAssetsFolder, "Extra Android Assets", 256, false),\r
//==============================================================================\r
void createManifestExporterProperties (PropertyListBuilder& props)\r
{\r
- props.add (new TextPropertyComponent (androidOboeRepositoryPath, "Oboe Repository Path", 2048, false),\r
+ props.add (new TextPropertyComponent (androidOboeRepositoryPath, "Oboe repository path", 2048, false),\r
"Path to the root of Oboe repository. Make sure to point Oboe repository to "\r
- "commit with SHA c5c3cc17f78974bf005bf33a2de1a093ac55cc07 before building.");\r
+ "commit with SHA 44c6b6ea9c8fa9b5b74cbd60f355068b57b50b37 before building.");\r
\r
props.add (new ChoicePropertyComponent (androidInternetNeeded, "Internet Access"),\r
"If enabled, this will set the android.permission.INTERNET flag in the manifest.");\r
props.add (new ChoicePropertyComponent (androidCameraNeeded, "Camera Required"),\r
"If enabled, this will set the android.permission.CAMERA flag in the manifest.");\r
\r
- props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth Permissions Required"),\r
+ props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth permissions Required"),\r
"If enabled, this will set the android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flag in the manifest. This is required for Bluetooth MIDI on Android.");\r
\r
- props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read From External Storage"),\r
+ props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read from external storage"),\r
"If enabled, this will set the android.permission.READ_EXTERNAL_STORAGE flag in the manifest.");\r
\r
- props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to External Storage"),\r
+ props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to external storage"),\r
"If enabled, this will set the android.permission.WRITE_EXTERNAL_STORAGE flag in the manifest.");\r
\r
props.add (new ChoicePropertyComponent (androidInAppBillingPermission, "In-App Billing"),\r
props.add (new ChoicePropertyComponent (androidEnableContentSharing, "Content Sharing"),\r
"If enabled, your app will be able to share content with other apps.");\r
\r
- props.add (new TextPropertyComponent (androidOtherPermissions, "Custom Permissions", 2048, false),\r
+ props.add (new TextPropertyComponent (androidOtherPermissions, "Custom permissions", 2048, false),\r
"A space-separated list of other permission flags that should be added to the manifest.");\r
\r
props.add (new ChoicePropertyComponent (androidEnableRemoteNotifications, "Remote Notifications"),\r
props.add (new TextPropertyComponent (androidRemoteNotificationsConfigFile.getPropertyAsValue(), "Remote Notifications Config File", 2048, false),\r
"Path to google-services.json file. This will be the file provided by Firebase when creating a new app in Firebase console.");\r
\r
- props.add (new TextPropertyComponent (androidManifestCustomXmlElements, "Custom Manifest XML Content", 8192, true),\r
+ props.add (new TextPropertyComponent (androidManifestCustomXmlElements, "Custom manifest XML content", 8192, true),\r
"You can specify custom AndroidManifest.xml content overriding the default one generated by Projucer. "\r
"Projucer will automatically create any missing and required XML elements and attributes "\r
"and merge them into your custom content.");\r
auto midiCode = getMidiCode (javaSourceFolder, className);\r
auto webViewCode = getWebViewCode (javaSourceFolder);\r
auto cameraCode = getCameraCode (javaSourceFolder);\r
- auto videoCode = getVideoCode (javaSourceFolder);\r
\r
auto javaSourceFile = javaSourceFolder.getChildFile ("JuceAppActivity.java");\r
auto javaSourceLines = StringArray::fromLines (javaSourceFile.loadFileAsString());\r
newFile << cameraCode.imports;\r
else if (line.contains ("$$JuceAndroidCameraCode$$"))\r
newFile << cameraCode.main;\r
- else if (line.contains ("$$JuceAndroidVideoImports$$"))\r
- newFile << videoCode.imports;\r
- else if (line.contains ("$$JuceAndroidVideoCode$$"))\r
- newFile << videoCode.main;\r
else\r
newFile << line.replace ("$$JuceAppActivityBaseClass$$", androidActivityBaseClassName.get().toString())\r
.replace ("JuceAppActivity", className)\r
String juceCameraImports, juceCameraCode;\r
\r
if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
- {\r
juceCameraImports << "import android.hardware.camera2.*;" << newLine;\r
\r
- auto javaCameraFile = javaSourceFolder.getChildFile ("AndroidCamera.java");\r
- auto juceCameraCodeAll = javaCameraFile.loadFileAsString();\r
+ auto javaCameraFile = javaSourceFolder.getChildFile ("AndroidCamera.java");\r
+ auto juceCameraCodeAll = javaCameraFile.loadFileAsString();\r
\r
+ if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
+ {\r
juceCameraCode << juceCameraCodeAll.fromFirstOccurrenceOf ("$$CameraApi21", false, false)\r
.upToFirstOccurrenceOf ("CameraApi21$$", false, false);\r
}\r
return { juceCameraImports, juceCameraCode };\r
}\r
\r
- struct VideoCode\r
- {\r
- String imports;\r
- String main;\r
- };\r
-\r
- VideoCode getVideoCode (const File& javaSourceFolder) const\r
- {\r
- String juceVideoImports, juceVideoCode;\r
-\r
- if (static_cast<int> (androidMinimumSDK.get()) >= 21)\r
- {\r
- juceVideoImports << "import android.database.ContentObserver;" << newLine;\r
- juceVideoImports << "import android.media.session.*;" << newLine;\r
- juceVideoImports << "import android.media.MediaMetadata;" << newLine;\r
-\r
- auto javaVideoFile = javaSourceFolder.getChildFile ("AndroidVideo.java");\r
- auto juceVideoCodeAll = javaVideoFile.loadFileAsString();\r
-\r
- juceVideoCode << juceVideoCodeAll.fromFirstOccurrenceOf ("$$VideoApi21", false, false)\r
- .upToFirstOccurrenceOf ("VideoApi21$$", false, false);\r
- }\r
-\r
- return { juceVideoImports, juceVideoCode };\r
- }\r
-\r
void copyAdditionalJavaFiles (const File& sourceFolder, const File& targetFolder) const\r
{\r
auto inAppBillingJavaFileName = String ("IInAppBillingService.java");\r
customStringsXmlContent << cfg.getCustomStringsXml();\r
customStringsXmlContent << "\n</resources>";\r
\r
- if (auto strings = parseXML (customStringsXmlContent))\r
- {\r
- String dir = cfg.isDebug() ? "debug" : "release";\r
- String subPath = "app/src/" + dir + "/res/values/string.xml";\r
+ std::unique_ptr<XmlElement> strings (XmlDocument::parse (customStringsXmlContent));\r
\r
- writeXmlOrThrow (*strings, folder.getChildFile (subPath), "utf-8", 100, true);\r
- }\r
- else\r
- {\r
- jassertfalse; // needs handling?\r
- }\r
+ String dir = cfg.isDebug() ? "debug" : "release";\r
+ String subPath = "app/src/" + dir + "/res/values/string.xml";\r
+\r
+ writeXmlOrThrow (*strings, folder.getChildFile (subPath), "utf-8", 100, true);\r
}\r
}\r
\r
auto* manifest = createManifestElement();\r
\r
createSupportsScreensElement (*manifest);\r
+ createUsesSdkElement (*manifest);\r
createPermissionElements (*manifest);\r
createOpenGlFeatureElement (*manifest);\r
\r
}\r
}\r
\r
+ void createUsesSdkElement (XmlElement& manifest) const\r
+ {\r
+ auto* sdk = getOrCreateChildWithName (manifest, "uses-sdk");\r
+ setAttributeIfNotPresent (*sdk, "android:minSdkVersion", androidMinimumSDK.get());\r
+ setAttributeIfNotPresent (*sdk, "android:targetSdkVersion", androidMinimumSDK.get());\r
+ }\r
+\r
void createPermissionElements (XmlElement& manifest) const\r
{\r
auto permissions = getPermissionsRequired();\r
\r
void createOpenGlFeatureElement (XmlElement& manifest) const\r
{\r
- if (project.getEnabledModules().isModuleEnabled ("juce_opengl"))\r
+ if (project.getModules().isModuleEnabled ("juce_opengl"))\r
{\r
XmlElement* glVersion = nullptr;\r
\r
}\r
\r
//==============================================================================\r
+ Value sdkPath, ndkPath;\r
const File AndroidExecutable;\r
\r
JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter)\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
{\r
- return *new CLionBuildConfiguration (project, tree, *this);\r
+ return new CLionBuildConfiguration (project, tree, *this);\r
}\r
\r
public:\r
bool supportsTargetType (ProjectType::Target::Type) const override { return true; }\r
\r
void addPlatformSpecificSettingsForProjectType (const ProjectType&) override {}\r
+ void initialiseDependencyPathValues() override {}\r
\r
//==============================================================================\r
bool canLaunchProject() override\r
#endif\r
\r
if (getProject().getExporters().getChildWithName (exporterName).isValid())\r
- return getCLionExecutableOrApp().exists();\r
+ return getCLionExecutable().existsAsFile();\r
\r
return false;\r
}\r
\r
bool launchProject() override\r
{\r
- return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted());\r
+ return getCLionExecutable().startAsProcess (getTargetFolder().getFullPathName().quoted());\r
}\r
\r
String getDescription() override\r
\r
// We'll append to this later.\r
overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("CMakeLists.txt"), out);\r
-\r
- // CMake has stopped adding PkgInfo files to bundles, so we need to do it manually\r
- MemoryOutputStream pkgInfoOut;\r
- pkgInfoOut << "BNDL????";\r
- overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("PkgInfo"), out);\r
}\r
\r
void writeCMakeListsExporterSection (ProjectExporter* exporter) const\r
\r
private:\r
//==============================================================================\r
- static File getCLionExecutableOrApp()\r
+ static File getCLionExecutable()\r
{\r
- File clionExeOrApp (getAppSettings()\r
- .getStoredPath (Ids::clionExePath, TargetOS::getThisOS()).get()\r
- .toString()\r
- .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
+ File clionExe (getAppSettings()\r
+ .getStoredPath (Ids::clionExePath)\r
+ .toString()\r
+ .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName()));\r
\r
#if JUCE_MAC\r
- if (clionExeOrApp.getFullPathName().endsWith ("/Contents/MacOS/clion"))\r
- clionExeOrApp = clionExeOrApp.getParentDirectory()\r
- .getParentDirectory()\r
- .getParentDirectory();\r
+ if (clionExe.getFileName().endsWith (".app"))\r
+ clionExe = clionExe.getChildFile ("Contents/MacOS/clion");\r
#endif\r
\r
- return clionExeOrApp;\r
+ return clionExe;\r
}\r
\r
//==============================================================================\r
for (auto& fileInfo : fileInfoList)\r
out << " " << fileInfo.first.quoted() << newLine;\r
\r
- auto isCMakeBundle = exporter.isXcode() && target->getTargetFileType() == ProjectType::Target::TargetFileType::pluginBundle;\r
- String pkgInfoPath = File (getTargetFolder().getChildFile ("PkgInfo")).getFullPathName().quoted();\r
-\r
- if (isCMakeBundle)\r
- out << " " << pkgInfoPath << newLine;\r
-\r
out << ")" << newLine << newLine;\r
\r
- if (isCMakeBundle)\r
- out << "set_source_files_properties (" << pkgInfoPath << " PROPERTIES MACOSX_PACKAGE_LOCATION .)" << newLine;\r
-\r
for (auto& fileInfo : fileInfoList)\r
if (! fileInfo.second)\r
out << "set_source_files_properties (" << fileInfo.first.quoted() << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine;\r
jassert (targets.size() > 0);\r
}\r
\r
+ //==============================================================================\r
+ void initialiseDependencyPathValues() override {}\r
+\r
private:\r
ValueWithDefault targetPlatformValue;\r
\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
{\r
- return *new CodeBlocksBuildConfiguration (project, tree, *this);\r
+ return new CodeBlocksBuildConfiguration (project, tree, *this);\r
}\r
\r
//==============================================================================\r
\r
static String guiExtrasModule ("juce_gui_extra");\r
\r
- if (project.getEnabledModules().isModuleEnabled (guiExtrasModule)\r
+ if (project.getModules().isModuleEnabled (guiExtrasModule)\r
&& project.isConfigFlagEnabled ("JUCE_WEB_BROWSER", true))\r
{\r
result.add ("webkit2gtk-4.0");\r
\r
props.add (new TextPropertyComponent (targetPlatformVersion, "Windows Target Platform", 20, false),\r
String ("Specifies the version of the Windows SDK that will be used when building this project. ")\r
- + (isWindows10SDK ? "Leave this field empty to use the latest Windows 10 SDK installed on the build machine."\r
- : "The default value for this exporter is " + getDefaultWindowsTargetPlatformVersion()));\r
+ + (isWindows10SDK ? "You can see which SDKs you have installed on your machine by going to \"Program Files (x86)\\Windows Kits\\10\\Lib\". " : "")\r
+ + "The default value for this exporter is " + getDefaultWindowsTargetPlatformVersion());\r
+ }\r
+\r
+ void addPlatformToolsetToPropertyGroup (XmlElement& p) const\r
+ {\r
+ forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+ e->createNewChildElement ("PlatformToolset")->addTextElement (getPlatformToolset());\r
+ }\r
+\r
+ void addWindowsTargetPlatformVersionToPropertyGroup (XmlElement& p) const\r
+ {\r
+ forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+ e->createNewChildElement ("WindowsTargetPlatformVersion")->addTextElement (getWindowsTargetPlatformVersion());\r
+ }\r
+\r
+ void addIPPSettingToPropertyGroup (XmlElement& p) const\r
+ {\r
+ auto ippLibrary = getIPPLibrary();\r
+\r
+ if (ippLibrary.isNotEmpty())\r
+ forEachXmlChildElementWithTagName (p, e, "PropertyGroup")\r
+ e->createNewChildElement ("UseIntelIPP")->addTextElement (ippLibrary);\r
}\r
\r
void create (const OwnedArray<LibraryModule>&) const override\r
//==============================================================================\r
void initialiseDependencyPathValues() override\r
{\r
- vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::windows), TargetOS::windows);\r
+ vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder),\r
+ Ids::vst3Path,\r
+ TargetOS::windows)));\r
\r
- vst3PathValueWrapper.init ({ settings, Ids::vst3Folder, nullptr },\r
- getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::windows), TargetOS::windows);\r
+ aaxPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder),\r
+ Ids::aaxPath,\r
+ TargetOS::windows)));\r
\r
- aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::windows), TargetOS::windows);\r
-\r
- rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::windows), TargetOS::windows);\r
+ rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder),\r
+ Ids::rtasPath,\r
+ TargetOS::windows)));\r
}\r
\r
//==============================================================================\r
public:\r
MSVCBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e)\r
: BuildConfiguration (p, settings, e),\r
- warningLevelValue (config, Ids::winWarningLevel, getUndoManager(), 4),\r
- warningsAreErrorsValue (config, Ids::warningsAreErrors, getUndoManager(), false),\r
- prebuildCommandValue (config, Ids::prebuildCommand, getUndoManager()),\r
- postbuildCommandValue (config, Ids::postbuildCommand, getUndoManager()),\r
- generateDebugSymbolsValue (config, Ids::alwaysGenerateDebugSymbols, getUndoManager(), false),\r
- generateManifestValue (config, Ids::generateManifest, getUndoManager(), true),\r
- enableIncrementalLinkingValue (config, Ids::enableIncrementalLinking, getUndoManager(), false),\r
- useRuntimeLibDLLValue (config, Ids::useRuntimeLibDLL, getUndoManager(), true),\r
- multiProcessorCompilationValue (config, Ids::multiProcessorCompilation, getUndoManager(), true),\r
- intermediatesPathValue (config, Ids::intermediatesPath, getUndoManager()),\r
- characterSetValue (config, Ids::characterSet, getUndoManager()),\r
- architectureTypeValue (config, Ids::winArchitecture, getUndoManager(), get64BitArchName()),\r
- fastMathValue (config, Ids::fastMath, getUndoManager()),\r
- debugInformationFormatValue (config, Ids::debugInformationFormat, getUndoManager(), isDebug() ? "ProgramDatabase" : "None"),\r
- pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false),\r
- vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager()),\r
- vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager()),\r
- rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager()),\r
- aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager()),\r
- unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager(), {})\r
+ warningLevelValue (config, Ids::winWarningLevel, getUndoManager(), 4),\r
+ warningsAreErrorsValue (config, Ids::warningsAreErrors, getUndoManager(), false),\r
+ prebuildCommandValue (config, Ids::prebuildCommand, getUndoManager()),\r
+ postbuildCommandValue (config, Ids::postbuildCommand, getUndoManager()),\r
+ generateDebugSymbolsValue (config, Ids::alwaysGenerateDebugSymbols, getUndoManager(), false),\r
+ generateManifestValue (config, Ids::generateManifest, getUndoManager(), true),\r
+ enableIncrementalLinkingValue (config, Ids::enableIncrementalLinking, getUndoManager(), false),\r
+ useRuntimeLibDLLValue (config, Ids::useRuntimeLibDLL, getUndoManager(), true),\r
+ intermediatesPathValue (config, Ids::intermediatesPath, getUndoManager()),\r
+ characterSetValue (config, Ids::characterSet, getUndoManager()),\r
+ architectureTypeValue (config, Ids::winArchitecture, getUndoManager(), get64BitArchName()),\r
+ fastMathValue (config, Ids::fastMath, getUndoManager()),\r
+ debugInformationFormatValue (config, Ids::debugInformationFormat, getUndoManager(), isDebug() ? "ProgramDatabase" : "None"),\r
+ pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false),\r
+ vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager()),\r
+ vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager()),\r
+ rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager()),\r
+ aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager())\r
{\r
if (! isDebug())\r
updateOldLTOSetting();\r
\r
String getPrebuildCommandString() const { return prebuildCommandValue.get(); }\r
String getPostbuildCommandString() const { return postbuildCommandValue.get(); }\r
- String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); }\r
- String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); }\r
- String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();}\r
- String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();}\r
- String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); }\r
- String getIntermediatesPathString() const { return intermediatesPathValue.get(); }\r
- String getCharacterSetString() const { return characterSetValue.get(); }\r
- String get64BitArchName() const { return "x64"; }\r
- String get32BitArchName() const { return "Win32"; }\r
- String getArchitectureString() const { return architectureTypeValue.get(); }\r
- String getDebugInformationFormatString() const { return debugInformationFormatValue.get(); }\r
\r
bool shouldGenerateDebugSymbols() const { return generateDebugSymbolsValue.get(); }\r
bool shouldGenerateManifest() const { return generateManifestValue.get(); }\r
+\r
bool shouldLinkIncremental() const { return enableIncrementalLinkingValue.get(); }\r
+\r
bool isUsingRuntimeLibDLL() const { return useRuntimeLibDLLValue.get(); }\r
- bool shouldUseMultiProcessorCompilation() const { return multiProcessorCompilationValue.get(); }\r
+\r
+ String getIntermediatesPathString() const { return intermediatesPathValue.get(); }\r
+\r
+ String getCharacterSetString() const { return characterSetValue.get(); }\r
+\r
+ String get64BitArchName() const { return "x64"; }\r
+ String get32BitArchName() const { return "Win32"; }\r
+ String getArchitectureString() const { return architectureTypeValue.get(); }\r
bool is64Bit() const { return getArchitectureString() == get64BitArchName(); }\r
+\r
bool isFastMathEnabled() const { return fastMathValue.get(); }\r
+\r
+ String getDebugInformationFormatString() const { return debugInformationFormatValue.get(); }\r
+\r
bool isPluginBinaryCopyStepEnabled() const { return pluginBinaryCopyStepValue.get(); }\r
\r
+ String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); }\r
+ String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); }\r
+ String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();}\r
+ String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();}\r
+\r
//==============================================================================\r
String createMSVCConfigName() const\r
{\r
return getName() + "|" + (is64Bit() ? "x64" : "Win32");\r
}\r
\r
- String getOutputFilename (const String& suffix, bool forceSuffix, bool forceUnityPrefix) const\r
+ String getOutputFilename (const String& suffix, bool forceSuffix) const\r
{\r
- auto target = File::createLegalFileName (getTargetBinaryNameString (forceUnityPrefix).trim());\r
+ auto target = File::createLegalFileName (getTargetBinaryNameString().trim());\r
\r
if (forceSuffix || ! target.containsChar ('.'))\r
return target.upToLastOccurrenceOf (".", false, false) + suffix;\r
"C++ runtime installed. However, if you are linking libraries from different sources you must select the same type of runtime "\r
"used by the libraries.");\r
\r
- props.add (new ChoicePropertyComponent (multiProcessorCompilationValue, "Multi-Processor Compilation",\r
- { "Enabled", "Disabled" },\r
- { true, false }),\r
- "Allows the compiler to use of all the available processors, which can reduce compilation time. "\r
- "This is enabled by default and should only be disabled if you know what you are doing.");\r
-\r
props.add (new ChoicePropertyComponent (enableIncrementalLinkingValue, "Incremental Linking"),\r
"Enable to avoid linking from scratch for every new build. "\r
"Disable to ensure that your final release build does not contain padding or thunks.");\r
\r
private:\r
ValueWithDefault warningLevelValue, warningsAreErrorsValue, prebuildCommandValue, postbuildCommandValue, generateDebugSymbolsValue,\r
- generateManifestValue, enableIncrementalLinkingValue, useRuntimeLibDLLValue, multiProcessorCompilationValue,\r
- intermediatesPathValue, characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue,\r
- pluginBinaryCopyStepValue;\r
+ generateManifestValue, enableIncrementalLinkingValue, useRuntimeLibDLLValue, intermediatesPathValue,\r
+ characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue, pluginBinaryCopyStepValue;\r
\r
- ValueWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation, unityPluginBinaryLocation;\r
+ ValueWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation;\r
\r
Value architectureValueToListenTo;\r
\r
\r
void addVisualStudioPluginInstallPathProperties (PropertyListBuilder& props)\r
{\r
- auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildRTAS()\r
- || project.shouldBuildAAX() || project.shouldBuildUnityPlugin());\r
+ auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3()\r
+ || project.shouldBuildRTAS() || project.shouldBuildAAX());\r
\r
if (isBuildingAnyPlugins)\r
props.add (new ChoicePropertyComponent (pluginBinaryCopyStepValue, "Enable Plugin Copy Step"),\r
"Enable this to copy plugin binaries to a specified folder after building.");\r
\r
+ if (project.shouldBuildVST())\r
+ props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepValue, "VST Binary Location",\r
+ 1024, false),\r
+ "The folder in which the compiled VST binary should be placed.");\r
+\r
if (project.shouldBuildVST3())\r
props.add (new TextPropertyComponentWithEnablement (vst3BinaryLocation, pluginBinaryCopyStepValue, "VST3 Binary Location",\r
1024, false),\r
1024, false),\r
"The folder in which the compiled AAX binary should be placed.");\r
\r
- if (project.shouldBuildUnityPlugin())\r
- props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location",\r
- 1024, false),\r
- "The folder in which the compiled Unity plugin binary and associated C# GUI script should be placed.");\r
-\r
- if (project.shouldBuildVST())\r
- props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepValue, "VST (Legacy) Binary Location",\r
- 1024, false),\r
- "The folder in which the compiled lehacy VST binary should be placed.");\r
-\r
}\r
\r
void setPluginBinaryCopyLocationDefaults()\r
if (config.shouldLinkIncremental())\r
e->createNewChildElement ("LinkIncremental")->addTextElement ("true");\r
\r
- e->createNewChildElement ("PlatformToolset")->addTextElement (owner.getPlatformToolset());\r
-\r
- addWindowsTargetPlatformToConfig (*e);\r
-\r
- auto ippLibrary = owner.getIPPLibrary();\r
-\r
- if (ippLibrary.isNotEmpty())\r
- e->createNewChildElement ("UseIntelIPP")->addTextElement (ippLibrary);\r
+ if (config.is64Bit())\r
+ e->createNewChildElement ("PlatformToolset")->addTextElement (getOwner().getPlatformToolset());\r
}\r
\r
{\r
p->setAttribute ("Label", "LocalAppDataPlatform");\r
}\r
\r
+ {\r
+ auto* e = projectXml.createNewChildElement ("PropertyGroup");\r
+ e->setAttribute ("Label", "UserMacros");\r
+ }\r
+\r
{\r
auto* props = projectXml.createNewChildElement ("PropertyGroup");\r
props->createNewChildElement ("_ProjectFileVersion")->addTextElement ("10.0.30319.1");\r
{\r
auto* targetName = props->createNewChildElement ("TargetName");\r
setConditionAttribute (*targetName, config);\r
- targetName->addTextElement (config.getOutputFilename ("", false, type == UnityPlugIn));\r
+ targetName->addTextElement (config.getOutputFilename ("", false));\r
}\r
\r
{\r
cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";"));\r
cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)");\r
\r
- cl->createNewChildElement ("RuntimeLibrary")->addTextElement (config.isUsingRuntimeLibDLL() ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL")\r
- : (isDebug ? "MultiThreadedDebug" : "MultiThreaded"));\r
+ bool runtimeDLL = config.isUsingRuntimeLibDLL();\r
+ cl->createNewChildElement ("RuntimeLibrary")->addTextElement (runtimeDLL ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL")\r
+ : (isDebug ? "MultiThreadedDebug" : "MultiThreaded"));\r
cl->createNewChildElement ("RuntimeTypeInfo")->addTextElement ("true");\r
cl->createNewChildElement ("PrecompiledHeader");\r
cl->createNewChildElement ("AssemblerListingLocation")->addTextElement ("$(IntDir)\\");\r
cl->createNewChildElement ("ProgramDataBaseFileName")->addTextElement ("$(IntDir)\\");\r
cl->createNewChildElement ("WarningLevel")->addTextElement ("Level" + String (config.getWarningLevel()));\r
cl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
- cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement (config.shouldUseMultiProcessorCompilation() ? "true" : "false");\r
+ cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement ("true");\r
\r
if (config.isFastMathEnabled())\r
cl->createNewChildElement ("FloatingPointModel")->addTextElement ("Fast");\r
\r
{\r
auto* link = group->createNewChildElement ("Link");\r
- link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config, type == UnityPlugIn));\r
+ link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config));\r
link->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
link->createNewChildElement ("IgnoreSpecificDefaultLibraries")->addTextElement (isDebug ? "libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)"\r
: "%(IgnoreSpecificDefaultLibraries)");\r
link->createNewChildElement ("GenerateDebugInformation")->addTextElement ((isDebug || config.shouldGenerateDebugSymbols()) ? "true" : "false");\r
- link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type == UnityPlugIn)));\r
+ link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true)));\r
link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp ? "Console" : "Windows");\r
\r
if (! config.is64Bit())\r
{\r
auto* bsc = group->createNewChildElement ("Bscmake");\r
bsc->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true");\r
- bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type == UnityPlugIn)));\r
+ bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true)));\r
}\r
\r
if (type != SharedCodeTarget)\r
auto* e = projectXml.createNewChildElement ("ImportGroup");\r
e->setAttribute ("Label", "ExtensionTargets");\r
}\r
+\r
+ getOwner().addPlatformToolsetToPropertyGroup (projectXml);\r
+ getOwner().addWindowsTargetPlatformVersionToPropertyGroup (projectXml);\r
+ getOwner().addIPPSettingToPropertyGroup (projectXml);\r
}\r
\r
String getProjectType() const\r
//==============================================================================\r
RelativePath getAAXIconFile() const\r
{\r
- RelativePath aaxSDK (owner.getAAXPathString(), RelativePath::projectFolder);\r
+ RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder);\r
RelativePath projectIcon ("icon.ico", RelativePath::buildTargetFolder);\r
\r
if (getOwner().getTargetFolder().getChildFile ("icon.ico").existsAsFile())\r
{\r
if (type == AAXPlugIn)\r
{\r
- RelativePath aaxSDK (owner.getAAXPathString(), RelativePath::projectFolder);\r
+ RelativePath aaxSDK (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder);\r
RelativePath aaxLibsFolder = aaxSDK.getChildFile ("Libs");\r
RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat");\r
RelativePath iconFilePath = getAAXIconFile();\r
\r
- auto outputFilename = config.getOutputFilename (".aaxplugin", true, false);\r
+ auto outputFilename = config.getOutputFilename (".aaxplugin", true);\r
auto bundleDir = getOwner().getOutDirFile (config, outputFilename);\r
auto bundleContents = bundleDir + "\\Contents";\r
auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32");\r
auto executable = archDir + String ("\\") + outputFilename;\r
\r
- auto pkgScript = String ("copy /Y ") + getOutputFilePath (config, false).quoted() + String (" ") + executable.quoted() + String ("\r\ncall ")\r
+ auto pkgScript = String ("copy /Y ") + getOutputFilePath (config).quoted() + String (" ") + executable.quoted() + String ("\r\ncall ")\r
+ createRebasedPath (bundleScript) + String (" ") + archDir.quoted() + String (" ") + createRebasedPath (iconFilePath);\r
\r
if (config.isPluginBinaryCopyStepEnabled())\r
\r
return pkgScript;\r
}\r
- else if (type == UnityPlugIn)\r
- {\r
- RelativePath scriptPath (config.project.getGeneratedCodeFolder().getChildFile (config.project.getUnityScriptName()),\r
- getOwner().getTargetFolder(),\r
- RelativePath::projectFolder);\r
-\r
- auto pkgScript = String ("copy /Y ") + scriptPath.toWindowsStyle().quoted() + " \"$(OutDir)\"";\r
-\r
- if (config.isPluginBinaryCopyStepEnabled())\r
- {\r
- auto copyLocation = config.getUnityPluginBinaryLocationString();\r
-\r
- pkgScript += "\r\ncopy /Y \"$(OutDir)$(TargetFileName)\" " + String (copyLocation + "\\$(TargetFileName)").quoted();\r
- pkgScript += "\r\ncopy /Y " + String ("$(OutDir)" + config.project.getUnityScriptName()).quoted() + " " + String (copyLocation + "\\" + config.project.getUnityScriptName()).quoted();\r
- }\r
-\r
- return pkgScript;\r
- }\r
else if (config.isPluginBinaryCopyStepEnabled())\r
{\r
auto copyScript = String ("copy /Y \"$(OutDir)$(TargetFileName)\"") + String (" \"$COPYDIR$\\$(TargetFileName)\"");\r
{\r
String script;\r
\r
- auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, false));\r
+ auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false));\r
auto bundleContents = bundleDir + "\\Contents";\r
auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32");\r
\r
{\r
case AAXPlugIn:\r
{\r
- auto aaxLibsFolder = RelativePath (owner.getAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs");\r
+ auto aaxLibsFolder = RelativePath (getOwner().getAAXPathValue().toString(), RelativePath::projectFolder).getChildFile ("Libs");\r
defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder));\r
}\r
break;\r
case RTASPlugIn:\r
{\r
- RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+ RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder);\r
defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag")));\r
}\r
break;\r
StringArray searchPaths;\r
if (type == RTASPlugIn)\r
{\r
- RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+ RelativePath rtasFolder (getOwner().getRTASPathValue().toString(), RelativePath::projectFolder);\r
\r
static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses",\r
"AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses",\r
return searchPaths;\r
}\r
\r
- String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const\r
+ String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config) const\r
{\r
- return config.getOutputFilename (getTargetSuffix(), true, forceUnityPrefix);\r
+ return config.getOutputFilename (getTargetSuffix(), true);\r
}\r
\r
- String getOutputFilePath (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const\r
+ String getOutputFilePath (const MSVCBuildConfiguration& config) const\r
{\r
- return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config, forceUnityPrefix));\r
+ return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config));\r
}\r
\r
StringArray getLibrarySearchPaths (const BuildConfiguration& config) const\r
\r
if (type != SharedCodeTarget)\r
if (auto* shared = getOwner().getSharedCodeTarget())\r
- libraries.add (shared->getBinaryNameWithSuffix (config, false));\r
+ libraries.add (shared->getBinaryNameWithSuffix (config));\r
\r
return libraries.joinIntoString (";");\r
}\r
\r
String createRebasedPath (const RelativePath& path) const { return getOwner().createRebasedPath (path); }\r
\r
- void addWindowsTargetPlatformToConfig (XmlElement& e) const\r
- {\r
- auto target = owner.getWindowsTargetPlatformVersion();\r
-\r
- if (target == "Latest")\r
- {\r
- auto* child = e.createNewChildElement ("WindowsTargetPlatformVersion");\r
-\r
- child->setAttribute ("Condition", "'$(WindowsTargetPlatformVersion)' == ''");\r
- child->addTextElement ("$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))");\r
- }\r
- else\r
- {\r
- e.createNewChildElement ("WindowsTargetPlatformVersion")->addTextElement (target);\r
- }\r
- }\r
-\r
protected:\r
const MSVCProjectExporterBase& owner;\r
String projectGuid;\r
case ProjectType::Target::VST3PlugIn:\r
case ProjectType::Target::AAXPlugIn:\r
case ProjectType::Target::RTASPlugIn:\r
- case ProjectType::Target::UnityPlugIn:\r
case ProjectType::Target::DynamicLibrary:\r
return true;\r
default:\r
}\r
\r
//==============================================================================\r
+ const String& getProjectName() const { return projectName; }\r
+\r
bool launchProject() override\r
{\r
#if JUCE_WINDOWS\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
{\r
- return *new MSVCBuildConfiguration (project, v, *this);\r
+ return new MSVCBuildConfiguration (project, v, *this);\r
}\r
\r
StringArray getHeaderSearchPaths (const BuildConfiguration& config) const\r
\r
static bool shouldUseStdCall (const RelativePath& path)\r
{\r
- return path.getFileNameWithoutExtension().startsWithIgnoreCase ("include_juce_audio_plugin_client_RTAS_");\r
+ return path.getFileNameWithoutExtension().startsWithIgnoreCase ("juce_audio_plugin_client_RTAS_");\r
}\r
\r
StringArray getModuleLibs() const\r
String getSolutionComment() const override { return "# Visual Studio 2017"; }\r
String getToolsVersion() const override { return "15.0"; }\r
String getDefaultToolset() const override { return "v141"; }\r
- String getDefaultWindowsTargetPlatformVersion() const override { return "Latest"; }\r
+ String getDefaultWindowsTargetPlatformVersion() const override { return "10.0.16299.0"; }\r
\r
static MSVCProjectExporterVC2017* createForSettings (Project& project, const ValueTree& settings)\r
{\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override\r
{\r
- return *new MakeBuildConfiguration (project, tree, *this);\r
+ return new MakeBuildConfiguration (project, tree, *this);\r
}\r
\r
public:\r
switch (type)\r
{\r
case VSTPlugIn:\r
- case UnityPlugIn:\r
case DynamicLibrary: return ".so";\r
case SharedCodeTarget:\r
case StaticLibrary: return ".a";\r
return String (getName()).upToFirstOccurrenceOf (" ", false, false);\r
}\r
\r
- void writeTargetLine (OutputStream& out, const StringArray& packages)\r
+ void writeTargetLine (OutputStream& out, const bool useLinuxPackages)\r
{\r
jassert (type != AggregateTarget);\r
\r
out << getBuildProduct() << " : "\r
+ << ((useLinuxPackages) ? "check-pkg-config " : "")\r
<< "$(OBJECTS_" << getTargetVarName() << ") $(RESOURCES)";\r
\r
if (type != SharedCodeTarget && owner.shouldBuildTargetType (SharedCodeTarget))\r
out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_SHARED_CODE)";\r
\r
- out << newLine;\r
-\r
- if (! packages.isEmpty())\r
- {\r
- out << "\t@command -v pkg-config >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine\r
- << "\t@pkg-config --print-errors";\r
-\r
- for (auto& pkg : packages)\r
- out << " " << pkg;\r
-\r
- out << newLine;\r
- }\r
-\r
- out << "\t@echo Linking \"" << owner.projectName << " - " << getName() << "\"" << newLine\r
+ out << newLine << "\t@echo Linking \"" << owner.projectName << " - " << getName() << "\"" << newLine\r
<< "\t-$(V_AT)mkdir -p $(JUCE_BINDIR)" << newLine\r
<< "\t-$(V_AT)mkdir -p $(JUCE_LIBDIR)" << newLine\r
<< "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)" << newLine;\r
\r
- if (type == UnityPlugIn)\r
- {\r
- auto scriptName = owner.getProject().getUnityScriptName();\r
-\r
- RelativePath scriptPath (owner.getProject().getGeneratedCodeFolder().getChildFile (scriptName),\r
- owner.getTargetFolder(),\r
- RelativePath::projectFolder);\r
-\r
- out << "\t-$(V_AT)cp " + scriptPath.toUnixStyle() + " $(JUCE_OUTDIR)/" + scriptName << newLine;\r
- }\r
-\r
if (owner.projectType.isStaticLibrary() || type == SharedCodeTarget)\r
- {\r
out << "\t$(V_AT)$(AR) -rcs " << getBuildProduct()\r
<< " $(OBJECTS_" << getTargetVarName() << ")" << newLine;\r
- }\r
else\r
{\r
out << "\t$(V_AT)$(CXX) -o " << getBuildProduct()\r
case ProjectType::Target::VSTPlugIn:\r
case ProjectType::Target::StandalonePlugIn:\r
case ProjectType::Target::DynamicLibrary:\r
- case ProjectType::Target::UnityPlugIn:\r
return true;\r
default:\r
break;\r
jassert (targets.size() > 0);\r
}\r
\r
+ //==============================================================================\r
+ void initialiseDependencyPathValues() override {}\r
+\r
private:\r
ValueWithDefault extraPkgConfigValue;\r
\r
packages.add ("gtk+-x11-3.0");\r
}\r
\r
- // don't add libcurl if curl symbols are loaded at runtime\r
- if (! isLoadCurlSymbolsLazilyEnabled())\r
- packages.add ("libcurl");\r
-\r
packages.removeDuplicates (false);\r
\r
return packages;\r
{\r
static String guiExtrasModule ("juce_gui_extra");\r
\r
- return (project.getEnabledModules().isModuleEnabled (guiExtrasModule)\r
+ return (project.getModules().isModuleEnabled (guiExtrasModule)\r
&& project.isConfigFlagEnabled ("JUCE_WEB_BROWSER", true));\r
}\r
\r
- bool isLoadCurlSymbolsLazilyEnabled() const\r
- {\r
- static String juceCoreModule ("juce_core");\r
-\r
- return (project.getEnabledModules().isModuleEnabled (juceCoreModule)\r
- && project.isConfigFlagEnabled ("JUCE_LOAD_CURL_SYMBOLS_LAZILY", false));\r
- }\r
-\r
//==============================================================================\r
void writeDefineFlags (OutputStream& out, const MakeBuildConfiguration& config) const\r
{\r
out << " $(LDFLAGS)" << newLine;\r
}\r
\r
- void writeTargetLines (OutputStream& out, const StringArray& packages) const\r
+ void writeTargetLines (OutputStream& out, const bool useLinuxPackages) const\r
{\r
auto n = targets.size();\r
\r
if (! getProject().getProjectType().isAudioPlugin())\r
out << "all : " << target->getBuildProduct() << newLine << newLine;\r
\r
- target->writeTargetLine (out, packages);\r
+ target->writeTargetLine (out, useLinuxPackages);\r
}\r
}\r
}\r
\r
out << getPhonyTargetLine() << newLine << newLine;\r
\r
- writeTargetLines (out, getPackages());\r
+ auto packages = getPackages();\r
+\r
+ writeTargetLines (out, ! packages.isEmpty());\r
\r
for (auto target : targets)\r
- target->addFiles (out);out << "clean:" << newLine\r
+ target->addFiles (out);\r
+\r
+ if (! packages.isEmpty())\r
+ {\r
+ out << "check-pkg-config:" << newLine\r
+ << "\t@command -v pkg-config >/dev/null 2>&1 || "\r
+ "{ echo >&2 \"pkg-config not installed. Please, install it.\"; "\r
+ "exit 1; }" << newLine\r
+ << "\t@pkg-config --print-errors";\r
+\r
+ for (auto& pkg : packages)\r
+ out << " " << pkg;\r
+\r
+ out << newLine << newLine;\r
+ }\r
+\r
+ out << "clean:" << newLine\r
<< "\t@echo Cleaning " << projectName << newLine\r
<< "\t$(V_AT)$(CLEANCMD)" << newLine\r
<< newLine;\r
{\r
MemoryOutputStream phonyTargetLine;\r
\r
- phonyTargetLine << ".PHONY: clean all strip";\r
+ phonyTargetLine << ".PHONY: clean all";\r
\r
if (! getProject().getProjectType().isAudioPlugin())\r
return phonyTargetLine.toString();\r
\r
#pragma once\r
\r
-#include "jucer_XcodeProjectParser.h"\r
\r
//==============================================================================\r
namespace\r
const char* const iosVersionDefault = "9.3";\r
\r
const int oldestSDKVersion = 7;\r
- const int currentSDKVersion = 14;\r
+ const int currentSDKVersion = 13;\r
const int minimumAUv3SDKVersion = 11;\r
\r
const char* const osxArch_Default = "default";\r
customPListValue (settings, Ids::customPList, getUndoManager()),\r
pListPrefixHeaderValue (settings, Ids::pListPrefixHeader, getUndoManager()),\r
pListPreprocessValue (settings, Ids::pListPreprocess, getUndoManager()),\r
- subprojectsValue (settings, Ids::xcodeSubprojects, getUndoManager()),\r
extraFrameworksValue (settings, Ids::extraFrameworks, getUndoManager()),\r
- frameworkSearchPathsValue (settings, Ids::frameworkSearchPaths, getUndoManager()),\r
- extraCustomFrameworksValue (settings, Ids::extraCustomFrameworks, getUndoManager()),\r
- embeddedFrameworksValue (settings, Ids::embeddedFrameworks, getUndoManager()),\r
postbuildCommandValue (settings, Ids::postbuildCommand, getUndoManager()),\r
prebuildCommandValue (settings, Ids::prebuildCommand, getUndoManager()),\r
duplicateAppExResourcesFolderValue (settings, Ids::duplicateAppExResourcesFolder, getUndoManager(), true),\r
customXcassetsFolderValue (settings, Ids::customXcassetsFolder, getUndoManager()),\r
microphonePermissionNeededValue (settings, Ids::microphonePermissionNeeded, getUndoManager()),\r
microphonePermissionsTextValue (settings, Ids::microphonePermissionsText, getUndoManager(),\r
- "This app requires audio input. If you do not have an audio interface connected it will use the built-in microphone."),\r
+ "This is an audio app which requires audio input. If you do not have a USB audio interface connected it will use the microphone."),\r
cameraPermissionNeededValue (settings, Ids::cameraPermissionNeeded, getUndoManager()),\r
cameraPermissionTextValue (settings, Ids::cameraPermissionText, getUndoManager(),\r
- "This app requires access to the camera to function correctly."),\r
+ "This app requires camera usage to function properly."),\r
uiFileSharingEnabledValue (settings, Ids::UIFileSharingEnabled, getUndoManager()),\r
uiSupportsDocumentBrowserValue (settings, Ids::UISupportsDocumentBrowser, getUndoManager()),\r
uiStatusBarHiddenValue (settings, Ids::UIStatusBarHidden, getUndoManager()),\r
String getPListPrefixHeaderString() const { return pListPrefixHeaderValue.get(); }\r
bool isPListPreprocessEnabled() const { return pListPreprocessValue.get(); }\r
\r
- String getSubprojectsString() const { return subprojectsValue.get(); }\r
-\r
String getExtraFrameworksString() const { return extraFrameworksValue.get(); }\r
- String getFrameworkSearchPathsString() const { return frameworkSearchPathsValue.get(); }\r
- String getExtraCustomFrameworksString() const { return extraCustomFrameworksValue.get(); }\r
- String getEmbeddedFrameworksString() const { return embeddedFrameworksValue.get(); }\r
\r
String getPostBuildScript() const { return postbuildCommandValue.get(); }\r
String getPreBuildScript() const { return prebuildCommandValue.get(); }\r
case ProjectType::Target::RTASPlugIn:\r
case ProjectType::Target::AudioUnitPlugIn:\r
case ProjectType::Target::DynamicLibrary:\r
- case ProjectType::Target::UnityPlugIn:\r
return ! iOS;\r
default:\r
break;\r
\r
props.add (new ChoicePropertyComponent (uiStatusBarHiddenValue, "Status Bar Hidden"),\r
"Enable this to disable the status bar in your app.");\r
+\r
+ props.add (new ChoicePropertyComponent (microphonePermissionNeededValue, "Microphone Access"),\r
+ "Enable this to allow your app to use the microphone. "\r
+ "The user of your app will be prompted to grant microphone access permissions.");\r
+\r
+ props.add (new TextPropertyComponentWithEnablement (microphonePermissionsTextValue, microphonePermissionNeededValue,\r
+ "Microphone Access Text", 1024, false),\r
+ "A short description of why your app requires microphone access.");\r
+\r
+ props.add (new ChoicePropertyComponent (cameraPermissionNeededValue, "Camera Access"),\r
+ "Enable this to allow your app to use the camera. "\r
+ "The user of your app will be prompted to grant camera access permissions.");\r
+\r
+ props.add (new TextPropertyComponentWithEnablement (cameraPermissionTextValue, cameraPermissionNeededValue,\r
+ "Camera Access Text", 1024, false),\r
+ "A short description of why your app requires camera access.");\r
}\r
else if (projectType.isGUIApplication())\r
{\r
"Using a leading '.' is optional, and the extensions are not case-sensitive.");\r
}\r
\r
- props.add (new ChoicePropertyComponent (microphonePermissionNeededValue, "Microphone Access"),\r
- "Enable this to allow your app to use the microphone. "\r
- "The user of your app will be prompted to grant microphone access permissions.");\r
-\r
- props.add (new TextPropertyComponentWithEnablement (microphonePermissionsTextValue, microphonePermissionNeededValue,\r
- "Microphone Access Text", 1024, false),\r
- "A short description of why your app requires microphone access.");\r
-\r
- props.add (new ChoicePropertyComponent (cameraPermissionNeededValue, "Camera Access"),\r
- "Enable this to allow your app to use the camera. "\r
- "The user of your app will be prompted to grant camera access permissions.");\r
-\r
- props.add (new TextPropertyComponentWithEnablement (cameraPermissionTextValue, cameraPermissionNeededValue,\r
- "Camera Access Text", 1024, false),\r
- "A short description of why your app requires camera access.");\r
-\r
props.add (new ChoicePropertyComponent (iosInAppPurchasesValue, "In-App Purchases Capability"),\r
"Enable this to grant your app the capability for in-app purchases. "\r
"This option requires that you specify a valid Development Team ID.");\r
props.add (new TextPropertyComponent (pListPrefixHeaderValue, "PList Prefix Header", 512, false),\r
"Header file containing definitions used in plist file (see PList Preprocess).");\r
\r
- props.add (new TextPropertyComponent (extraFrameworksValue, "Extra System Frameworks", 2048, false),\r
- "A comma-separated list of extra system frameworks that should be added to the build. "\r
- "(Don't include the .framework extension in the name)"\r
- " The frameworks are expected to be located in /System/Library/Frameworks");\r
-\r
- props.add (new TextPropertyComponent (frameworkSearchPathsValue, "Framework Search Paths", 8192, true),\r
- "A set of paths to search for custom frameworks (one per line).");\r
-\r
- props.add (new TextPropertyComponent (extraCustomFrameworksValue, "Extra Custom Frameworks", 8192, true),\r
- "Paths to custom frameworks that should be added to the build (one per line). "\r
- "You will probably need to add an entry to the Framework Search Paths for each unique directory.");\r
-\r
- props.add (new TextPropertyComponent (embeddedFrameworksValue, "Embedded Frameworks", 8192, true),\r
- "Paths to frameworks to be embedded with the app (one per line). "\r
- "If you are adding a framework here then you do not need to specify it in Extra Custom Frameworks too. "\r
- "You will probably need to add an entry to the Framework Search Paths for each unique directory.");\r
-\r
- props.add (new TextPropertyComponent (subprojectsValue, "Xcode Subprojects", 8192, true),\r
- "Paths to Xcode projects that should be added to the build (one per line). "\r
- "The names of the required build products can be specified after a colon, comma seperated, "\r
- "e.g. \"path/to/MySubProject.xcodeproj: MySubProject, OtherTarget\". "\r
- "If no build products are specified, all build products associated with a subproject will be added.");\r
+ props.add (new TextPropertyComponent (extraFrameworksValue, "Extra Frameworks", 2048, false),\r
+ "A comma-separated list of extra frameworks that should be added to the build. "\r
+ "(Don't include the .framework extension in the name)");\r
\r
props.add (new TextPropertyComponent (prebuildCommandValue, "Pre-Build Shell Script", 32768, true),\r
"Some shell-script that will be run before a build starts.");\r
//==============================================================================\r
void initialiseDependencyPathValues() override\r
{\r
- vstLegacyPathValueWrapper.init ({ settings, Ids::vstLegacyFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::vstLegacyPath, TargetOS::osx), TargetOS::osx);\r
-\r
- vst3PathValueWrapper.init ({ settings, Ids::vst3Folder, nullptr },\r
- getAppSettings().getStoredPath (Ids::vst3Path, TargetOS::osx), TargetOS::osx);\r
-\r
- aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::osx), TargetOS::osx);\r
-\r
- rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr },\r
- getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::osx), TargetOS::osx);\r
+ vst3Path.referTo (Value (new DependencyPathValueSource (getSetting (Ids::vst3Folder), Ids::vst3Path, TargetOS::osx)));\r
+ aaxPath. referTo (Value (new DependencyPathValueSource (getSetting (Ids::aaxFolder), Ids::aaxPath, TargetOS::osx)));\r
+ rtasPath.referTo (Value (new DependencyPathValueSource (getSetting (Ids::rtasFolder), Ids::rtasPath, TargetOS::osx)));\r
}\r
\r
protected:\r
vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST3/"),\r
auBinaryLocation (config, Ids::auBinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/Components/"),\r
rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager(), "/Library/Application Support/Digidesign/Plug-Ins/"),\r
- aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/"),\r
- unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager())\r
+ aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/")\r
{\r
updateOldPluginBinaryLocations();\r
updateOldSDKDefaults();\r
props.add (new ChoicePropertyComponent (iosDeploymentTarget, "iOS Deployment Target",\r
{ "7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4",\r
"9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3",\r
- "11.0", "12.0" },\r
+ "11.0" },\r
{ "7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "8.4",\r
"9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3",\r
- "11.0", "12.0" }),\r
+ "11.0" }),\r
"The minimum version of iOS that the target binary will run on.");\r
}\r
else\r
String getAUBinaryLocationString() const { return auBinaryLocation.get(); }\r
String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();}\r
String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();}\r
- String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); }\r
\r
private:\r
//==========================================================================\r
ValueWithDefault osxSDKVersion, osxDeploymentTarget, iosDeploymentTarget, osxArchitecture,\r
customXcodeFlags, plistPreprocessorDefinitions, codeSignIdentity,\r
fastMathEnabled, stripLocalSymbolsEnabled, pluginBinaryCopyStepEnabled,\r
- vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation,\r
- aaxBinaryLocation, unityPluginBinaryLocation;\r
+ vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation, aaxBinaryLocation;\r
\r
//==========================================================================\r
void addXcodePluginInstallPathProperties (PropertyListBuilder& props)\r
{\r
auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAU()\r
- || project.shouldBuildRTAS() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin());\r
+ || project.shouldBuildRTAS() || project.shouldBuildAAX());\r
\r
if (isBuildingAnyPlugins)\r
props.add (new ChoicePropertyComponent (pluginBinaryCopyStepEnabled, "Enable Plugin Copy Step"),\r
"Enable this to copy plugin binaries to the specified folder after building.");\r
\r
+ if (project.shouldBuildVST())\r
+ props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepEnabled, "VST Binary Location",\r
+ 1024, false),\r
+ "The folder in which the compiled VST binary should be placed.");\r
+\r
if (project.shouldBuildVST3())\r
props.add (new TextPropertyComponentWithEnablement (vst3BinaryLocation, pluginBinaryCopyStepEnabled, "VST3 Binary Location",\r
1024, false),\r
props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepEnabled, "AAX Binary Location",\r
1024, false),\r
"The folder in which the compiled AAX binary should be placed.");\r
-\r
- if (project.shouldBuildUnityPlugin())\r
- props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepEnabled, "Unity Binary Location",\r
- 1024, false),\r
- "The folder in which the compiled Unity plugin binary and associated C# GUI script should be placed.");\r
-\r
- if (project.shouldBuildVST())\r
- props.add (new TextPropertyComponentWithEnablement (vstBinaryLocation, pluginBinaryCopyStepEnabled, "VST Binary Location",\r
- 1024, false),\r
- "The folder in which the compiled legacy VST binary should be placed.");\r
}\r
\r
void updateOldPluginBinaryLocations()\r
\r
BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override\r
{\r
- return *new XcodeBuildConfiguration (project, v, iOS, *this);\r
+ return new XcodeBuildConfiguration (project, v, iOS, *this);\r
}\r
\r
public:\r
xcodeCopyToProductInstallPathAfterBuild = true;\r
break;\r
\r
- case UnityPlugIn:\r
- xcodePackageType = "BNDL";\r
- xcodeBundleSignature = "????";\r
- xcodeFileType = "wrapper.cfbundle";\r
- xcodeBundleExtension = ".bundle";\r
- xcodeProductType = "com.apple.product-type.bundle";\r
- xcodeCopyToProductInstallPathAfterBuild = true;\r
- break;\r
-\r
case SharedCodeTarget:\r
xcodeFileType = "archive.ar";\r
xcodeBundleExtension = ".a";\r
\r
if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration(0))\r
{\r
- auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn));\r
+ auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString());\r
\r
if (xcodeFileType == "archive.ar")\r
productName = getStaticLibbedFilename (productName);\r
return s;\r
}\r
\r
- s.set ("PRODUCT_NAME", owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted());\r
s.set ("PRODUCT_BUNDLE_IDENTIFIER", getBundleIdentifier());\r
\r
auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? osxArch_64Bit\r
else if (arch == osxArch_64BitUniversal) s.set ("ARCHS", "\"$(ARCHS_STANDARD_32_64_BIT)\"");\r
else if (arch == osxArch_64Bit) s.set ("ARCHS", "\"$(ARCHS_STANDARD_64_BIT)\"");\r
\r
- StringArray headerPaths (getHeaderSearchPaths (config));\r
- headerPaths.add ("\"$(inherited)\"");\r
- s.set ("HEADER_SEARCH_PATHS", indentParenthesisedList (headerPaths, 1));\r
+ s.set ("HEADER_SEARCH_PATHS", String ("(") + getHeaderSearchPaths (config).joinIntoString (", ") + ", \"$(inherited)\")");\r
s.set ("USE_HEADERMAP", String (static_cast<bool> (config.exporter.settings.getProperty ("useHeaderMap")) ? "YES" : "NO"));\r
\r
- auto frameworkSearchPaths = getFrameworkSearchPaths (config);\r
-\r
- if (! frameworkSearchPaths.isEmpty())\r
- s.set ("FRAMEWORK_SEARCH_PATHS", String ("(") + frameworkSearchPaths.joinIntoString (", ") + ", \"$(inherited)\")");\r
-\r
s.set ("GCC_OPTIMIZATION_LEVEL", config.getGCCOptimisationFlag());\r
\r
if (shouldCreatePList())\r
}\r
\r
if (defsList.size() > 0)\r
- s.set ("INFOPLIST_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList, 1));\r
+ s.set ("INFOPLIST_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList));\r
}\r
\r
if (config.isLinkTimeOptimisationEnabled())\r
{\r
s.set ("INSTALL_PATH", installPath.quoted());\r
\r
- if (type == Target::SharedCodeTarget)\r
- s.set ("SKIP_INSTALL", "YES");\r
-\r
- if (! owner.embeddedFrameworkIDs.isEmpty())\r
- s.set ("LD_RUNPATH_SEARCH_PATHS", "\"$(inherited) @executable_path/Frameworks @executable_path/../Frameworks\"");\r
-\r
if (xcodeCopyToProductInstallPathAfterBuild)\r
{\r
s.set ("DEPLOYMENT_LOCATION", "YES");\r
\r
if (sdkRoot.isNotEmpty())\r
s.set ("SDKROOT", sdkRoot);\r
+\r
+ s.set ("MACOSX_DEPLOYMENT_TARGET_ppc", "10.4");\r
+ s.set ("SDKROOT_ppc", "macosx10.5");\r
}\r
\r
s.set ("GCC_VERSION", gccVersion);\r
\r
if (librarySearchPaths.size() > 0)\r
{\r
- StringArray libPaths;\r
- libPaths.add ("\"$(inherited)\"");\r
+ String libPaths ("(\"$(inherited)\"");\r
\r
for (auto& p : librarySearchPaths)\r
- libPaths.add ("\"\\\"" + p + "\\\"\"");\r
-\r
- s.set ("LIBRARY_SEARCH_PATHS", indentParenthesisedList (libPaths, 1));\r
+ libPaths += ", \"\\\"" + p + "\\\"\"";\r
\r
+ s.set ("LIBRARY_SEARCH_PATHS", libPaths + ")");\r
}\r
}\r
\r
defsList.add ("\"" + def + "\"");\r
}\r
\r
- s.set ("GCC_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList, 1));\r
+ s.set ("GCC_PREPROCESSOR_DEFINITIONS", indentParenthesisedList (defsList));\r
\r
StringArray customFlags;\r
customFlags.addTokens (config.getCustomXcodeFlagsString(), ",", "\"'");\r
case AudioUnitPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAUBinaryLocationString() : String();\r
case RTASPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getRTASBinaryLocationString() : String();\r
case AAXPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAAXBinaryLocationString() : String();\r
- case UnityPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getUnityPluginBinaryLocationString() : String();\r
case SharedCodeTarget: return owner.isiOS() ? "@executable_path/Frameworks" : "@executable_path/../Frameworks";\r
default: return {};\r
}\r
if (! shouldCreatePList())\r
return;\r
\r
- auto plist = parseXML (owner.getPListToMergeString());\r
+ std::unique_ptr<XmlElement> plist (XmlDocument::parse (owner.getPListToMergeString()));\r
\r
if (plist == nullptr || ! plist->hasTagName ("plist"))\r
plist.reset (new XmlElement ("plist"));\r
if (dict == nullptr)\r
dict = plist->createNewChildElement ("dict");\r
\r
- if (owner.isMicrophonePermissionEnabled())\r
- addPlistDictionaryKey (dict, "NSMicrophoneUsageDescription", owner.getMicrophonePermissionsTextString());\r
-\r
- if (owner.isCameraPermissionEnabled())\r
- addPlistDictionaryKey (dict, "NSCameraUsageDescription", owner.getCameraPermissionTextString());\r
-\r
if (owner.iOS)\r
{\r
addPlistDictionaryKeyBool (dict, "LSRequiresIPhoneOS", true);\r
\r
+ if (owner.isMicrophonePermissionEnabled())\r
+ addPlistDictionaryKey (dict, "NSMicrophoneUsageDescription", owner.getMicrophonePermissionsTextString());\r
+\r
+ if (owner.isCameraPermissionEnabled())\r
+ addPlistDictionaryKey (dict, "NSCameraUsageDescription", owner.getCameraPermissionTextString());\r
+\r
if (type != AudioUnitv3PlugIn)\r
addPlistDictionaryKeyBool (dict, "UIViewControllerBasedStatusBarAppearance", false);\r
}\r
}\r
\r
//==============================================================================\r
- void sanitiseAndEscapeSearchPaths (const BuildConfiguration& config, StringArray& paths) const\r
- {\r
- paths = getCleanedStringArray (paths);\r
-\r
- for (auto& path : paths)\r
- {\r
- // Xcode 10 can't deal with search paths starting with "~" so we need to replace them here...\r
- path = owner.replacePreprocessorTokens (config, sanitisePath (path));\r
-\r
- if (path.containsChar (' '))\r
- path = "\"\\\"" + path + "\\\"\""; // crazy double quotes required when there are spaces..\r
- else\r
- path = "\"" + path + "\"";\r
- }\r
- }\r
-\r
StringArray getHeaderSearchPaths (const BuildConfiguration& config) const\r
{\r
StringArray paths (owner.extraSearchPaths);\r
paths.addArray (config.getHeaderSearchPaths());\r
paths.addArray (getTargetExtraHeaderSearchPaths());\r
\r
- if (owner.project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client"))\r
+ if (owner.project.getModules().isModuleEnabled ("juce_audio_plugin_client"))\r
{\r
// Needed to compile .r files\r
paths.add (owner.getModuleFolderRelativeToProject ("juce_audio_plugin_client")\r
.toUnixStyle());\r
}\r
\r
- sanitiseAndEscapeSearchPaths (config, paths);\r
- return paths;\r
- }\r
+ paths = getCleanedStringArray (paths);\r
+\r
+ for (auto& s : paths)\r
+ {\r
+ s = owner.replacePreprocessorTokens (config, s);\r
+\r
+ if (s.containsChar (' '))\r
+ s = "\"\\\"" + s + "\\\"\""; // crazy double quotes required when there are spaces..\r
+ else\r
+ s = "\"" + s + "\"";\r
+ }\r
\r
- StringArray getFrameworkSearchPaths (const BuildConfiguration& config) const\r
- {\r
- auto paths = getSearchPathsFromString (owner.getFrameworkSearchPathsString());\r
- sanitiseAndEscapeSearchPaths (config, paths);\r
return paths;\r
}\r
\r
addPlistDictionaryKey (dict, "subtype", pluginSubType);\r
addPlistDictionaryKeyInt (dict, "version", owner.project.getVersionAsHexInteger());\r
\r
- if (owner.project.isAUSandBoxSafe())\r
- {\r
- addPlistDictionaryKeyBool (dict, "sandboxSafe", true);\r
- }\r
- else\r
- {\r
- dict->createNewChildElement ("key")->addTextElement ("resourceUsage");\r
- auto* resourceUsageDict = dict->createNewChildElement ("dict");\r
-\r
- addPlistDictionaryKeyBool (resourceUsageDict, "network.client", true);\r
- addPlistDictionaryKeyBool (resourceUsageDict, "temporary-exception.files.all.read-write", true);\r
- }\r
-\r
xcodeExtraPListEntries.add (plistKey);\r
xcodeExtraPListEntries.add (plistEntry);\r
}\r
{\r
if (type == AAXPlugIn)\r
{\r
- auto aaxLibsFolder = RelativePath (owner.getAAXPathString(), RelativePath::projectFolder).getChildFile ("Libs");\r
+ auto aaxLibsFolder\r
+ = RelativePath (owner.getAAXPathValue().toString(), RelativePath::projectFolder)\r
+ .getChildFile ("Libs");\r
\r
String libraryPath (config.isDebug() ? "Debug" : "Release");\r
libraryPath += "/libAAXLibrary_libcpp.a";\r
}\r
else if (type == RTASPlugIn)\r
{\r
- RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+ RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder);\r
\r
extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a"));\r
extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a"));\r
\r
if (type == RTASPlugIn)\r
{\r
- RelativePath rtasFolder (owner.getRTASPathString(), RelativePath::projectFolder);\r
+ RelativePath rtasFolder (owner.getRTASPathValue().toString(), RelativePath::projectFolder);\r
\r
targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon");\r
targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon");\r
\r
mutable OwnedArray<ValueTree> pbxBuildFiles, pbxFileReferences, pbxGroups, misc, projectConfigs, targetConfigs;\r
mutable StringArray resourceIDs, sourceIDs, targetIDs;\r
- mutable StringArray frameworkFileIDs, embeddedFrameworkIDs, rezFileIDs, resourceFileRefs, subprojectFileIDs;\r
- mutable Array<std::pair<String, String>> subprojectReferences;\r
+ mutable StringArray frameworkFileIDs, rezFileIDs, resourceFileRefs;\r
mutable File menuNibFile, iconFile;\r
mutable StringArray buildProducts;\r
\r
const bool iOS;\r
\r
- ValueWithDefault customPListValue, pListPrefixHeaderValue, pListPreprocessValue,\r
- subprojectsValue,\r
- extraFrameworksValue, frameworkSearchPathsValue, extraCustomFrameworksValue, embeddedFrameworksValue,\r
- postbuildCommandValue, prebuildCommandValue,\r
- duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue,\r
+ ValueWithDefault customPListValue, pListPrefixHeaderValue, pListPreprocessValue, extraFrameworksValue, postbuildCommandValue,\r
+ prebuildCommandValue, duplicateAppExResourcesFolderValue, iosDeviceFamilyValue, iPhoneScreenOrientationValue,\r
iPadScreenOrientationValue, customXcodeResourceFoldersValue, customXcassetsFolderValue,\r
microphonePermissionNeededValue, microphonePermissionsTextValue, cameraPermissionNeededValue, cameraPermissionTextValue,\r
uiFileSharingEnabledValue, uiSupportsDocumentBrowserValue, uiStatusBarHiddenValue, documentExtensionsValue, iosInAppPurchasesValue,\r
{\r
prepareTargets();\r
\r
- // Must be called before adding embedded frameworks, as we want to\r
- // embed any frameworks found in subprojects.\r
- addSubprojects();\r
-\r
addFrameworks();\r
- addCustomFrameworks();\r
- addEmbeddedFrameworks();\r
-\r
addCustomResourceFolders();\r
addPlistFileReferences();\r
\r
\r
void addExtraGroupsToProject (StringArray& topLevelGroupIDs) const\r
{\r
- {\r
+ { // Add 'resources' group\r
auto resourcesGroupID = createID ("__resources");\r
addGroup (resourcesGroupID, "Resources", resourceFileRefs);\r
topLevelGroupIDs.add (resourcesGroupID);\r
}\r
\r
- {\r
+ { // Add 'frameworks' group\r
auto frameworksGroupID = createID ("__frameworks");\r
addGroup (frameworksGroupID, "Frameworks", frameworkFileIDs);\r
topLevelGroupIDs.add (frameworksGroupID);\r
}\r
\r
- {\r
+ { // Add 'products' group\r
auto productsGroupID = createID ("__products");\r
addGroup (productsGroupID, "Products", buildProducts);\r
topLevelGroupIDs.add (productsGroupID);\r
}\r
-\r
- if (! subprojectFileIDs.isEmpty())\r
- {\r
- auto subprojectLibrariesGroupID = createID ("__subprojects");\r
- addGroup (subprojectLibrariesGroupID, "Subprojects", subprojectFileIDs);\r
- topLevelGroupIDs.add (subprojectLibrariesGroupID);\r
- }\r
}\r
\r
void addBuildPhases() const\r
&& project.shouldBuildStandalonePlugin() && target->type == XcodeTarget::StandalonePlugIn)\r
embedAppExtension();\r
\r
- if (project.getProjectType().isAudioPlugin() && project.shouldBuildUnityPlugin()\r
- && target->type == XcodeTarget::UnityPlugIn)\r
- embedUnityScript();\r
-\r
addTargetObject (*target);\r
}\r
}\r
}\r
}\r
\r
- void embedUnityScript() const\r
- {\r
- if (auto* unityTarget = getTargetOfType (XcodeTarget::UnityPlugIn))\r
- {\r
- RelativePath scriptPath (getProject().getGeneratedCodeFolder().getChildFile (getProject().getUnityScriptName()),\r
- getTargetFolder(),\r
- RelativePath::buildTargetFolder);\r
-\r
- auto path = scriptPath.toUnixStyle();\r
- auto refID = addFileReference (path);\r
- auto fileID = addBuildFile (path, refID, false, false);\r
-\r
- resourceIDs.add (fileID);\r
- resourceFileRefs.add (refID);\r
-\r
- unityTarget->addCopyFilesPhase ("Embed Unity Script", fileID, kWrapperFolder);\r
- }\r
- }\r
-\r
static Image fixMacIconImageSize (Drawable& image)\r
{\r
- const int validSizes[] = { 16, 32, 64, 128, 256, 512, 1024 };\r
+ const int validSizes[] = { 16, 32, 48, 128, 256, 512, 1024 };\r
\r
auto w = image.getWidth();\r
auto h = image.getHeight();\r
\r
v->setProperty ("dependencies", indentParenthesisedList (getTargetDependencies (target)), nullptr);\r
v->setProperty (Ids::name, target.getXcodeSchemeName(), nullptr);\r
-\r
v->setProperty ("productName", projectName, nullptr);\r
\r
if (target.type != XcodeTarget::AggregateTarget)\r
return dependencies;\r
}\r
\r
- static void writeIconData (MemoryOutputStream& out, const Image& image, const char* type)\r
+ static void writeOldIconFormat (MemoryOutputStream& out, const Image& image, const char* type, const char* maskType)\r
+ {\r
+ auto w = image.getWidth();\r
+ auto h = image.getHeight();\r
+\r
+ out.write (type, 4);\r
+ out.writeIntBigEndian (8 + 4 * w * h);\r
+\r
+ Image::BitmapData bitmap (image, Image::BitmapData::readOnly);\r
+\r
+ for (int y = 0; y < h; ++y)\r
+ {\r
+ for (int x = 0; x < w; ++x)\r
+ {\r
+ auto pixel = bitmap.getPixelColour (x, y);\r
+ out.writeByte ((char) pixel.getAlpha());\r
+ out.writeByte ((char) pixel.getRed());\r
+ out.writeByte ((char) pixel.getGreen());\r
+ out.writeByte ((char) pixel.getBlue());\r
+ }\r
+ }\r
+\r
+ out.write (maskType, 4);\r
+ out.writeIntBigEndian (8 + w * h);\r
+\r
+ for (int y = 0; y < h; ++y)\r
+ {\r
+ for (int x = 0; x < w; ++x)\r
+ {\r
+ auto pixel = bitmap.getPixelColour (x, y);\r
+ out.writeByte ((char) pixel.getAlpha());\r
+ }\r
+ }\r
+ }\r
+\r
+ static void writeNewIconFormat (MemoryOutputStream& out, const Image& image, const char* type)\r
{\r
MemoryOutputStream pngData;\r
PNGImageFormat pngFormat;\r
void writeIcnsFile (const OwnedArray<Drawable>& images, OutputStream& out) const\r
{\r
MemoryOutputStream data;\r
- auto smallest = std::numeric_limits<int>::max();\r
+ int smallest = 0x7fffffff;\r
Drawable* smallestImage = nullptr;\r
\r
for (int i = 0; i < images.size(); ++i)\r
{\r
- auto image = fixMacIconImageSize (*images.getUnchecked (i));\r
+ auto image = fixMacIconImageSize (*images.getUnchecked(i));\r
jassert (image.getWidth() == image.getHeight());\r
\r
if (image.getWidth() < smallest)\r
\r
switch (image.getWidth())\r
{\r
- case 16: writeIconData (data, image, "icp4"); break;\r
- case 32: writeIconData (data, image, "icp5"); break;\r
- case 64: writeIconData (data, image, "icp6"); break;\r
- case 128: writeIconData (data, image, "ic07"); break;\r
- case 256: writeIconData (data, image, "ic08"); break;\r
- case 512: writeIconData (data, image, "ic09"); break;\r
- case 1024: writeIconData (data, image, "ic10"); break;\r
+ case 16: writeOldIconFormat (data, image, "is32", "s8mk"); break;\r
+ case 32: writeOldIconFormat (data, image, "il32", "l8mk"); break;\r
+ case 48: writeOldIconFormat (data, image, "ih32", "h8mk"); break;\r
+ case 128: writeOldIconFormat (data, image, "it32", "t8mk"); break;\r
+ case 256: writeNewIconFormat (data, image, "ic08"); break;\r
+ case 512: writeNewIconFormat (data, image, "ic09"); break;\r
+ case 1024: writeNewIconFormat (data, image, "ic10"); break;\r
default: break;\r
}\r
}\r
// If you only supply a 1024 image, the file doesn't work on 10.8, so we need\r
// to force a smaller one in there too..\r
if (smallest > 512 && smallestImage != nullptr)\r
- writeIconData (data, rescaleImageForIcon (*smallestImage, 512), "ic09");\r
+ writeNewIconFormat (data, rescaleImageForIcon (*smallestImage, 512), "ic09");\r
\r
out.write ("icns", 4);\r
out.writeIntBigEndian ((int) data.getDataSize() + 8);\r
s.set ("GCC_WARN_UNDECLARED_SELECTOR", "YES");\r
s.set ("GCC_WARN_UNINITIALIZED_AUTOS", "YES");\r
s.set ("GCC_WARN_UNUSED_FUNCTION", "YES");\r
- s.set ("CLANG_ENABLE_OBJC_WEAK", "YES");\r
s.set ("CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING", "YES");\r
s.set ("CLANG_WARN_BOOL_CONVERSION", "YES");\r
s.set ("CLANG_WARN_COMMA", "YES");\r
s.set ("CLANG_WARN_CONSTANT_CONVERSION", "YES");\r
- s.set ("CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS", "YES");\r
s.set ("CLANG_WARN_EMPTY_BODY", "YES");\r
s.set ("CLANG_WARN_ENUM_CONVERSION", "YES");\r
s.set ("CLANG_WARN_INFINITE_RECURSION", "YES");\r
s.set ("CLANG_WARN_INT_CONVERSION", "YES");\r
s.set ("CLANG_WARN_NON_LITERAL_NULL_CONVERSION", "YES");\r
- s.set ("CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF", "YES");\r
s.set ("CLANG_WARN_OBJC_LITERAL_CONVERSION", "YES");\r
s.set ("CLANG_WARN_RANGE_LOOP_ANALYSIS", "YES");\r
s.set ("CLANG_WARN_STRICT_PROTOTYPES", "YES");\r
}\r
}\r
\r
- void addCustomFrameworks() const\r
- {\r
- StringArray customFrameworks;\r
- customFrameworks.addTokens (getExtraCustomFrameworksString(), true);\r
- customFrameworks.trim();\r
-\r
- for (auto& framework : customFrameworks)\r
- {\r
- auto frameworkID = addCustomFramework (framework);\r
-\r
- for (auto& target : targets)\r
- {\r
- target->frameworkIDs.add (frameworkID);\r
- target->frameworkNames.add (framework);\r
- }\r
- }\r
- }\r
-\r
- void addEmbeddedFrameworks() const\r
- {\r
- StringArray frameworks;\r
- frameworks.addTokens (getEmbeddedFrameworksString(), true);\r
- frameworks.trim();\r
-\r
- for (auto& framework : frameworks)\r
- {\r
- auto frameworkID = addEmbeddedFramework (framework);\r
- embeddedFrameworkIDs.add (frameworkID);\r
-\r
- for (auto& target : targets)\r
- {\r
- target->frameworkIDs.add (frameworkID);\r
- target->frameworkNames.add (framework);\r
- }\r
- }\r
-\r
- if (! embeddedFrameworkIDs.isEmpty())\r
- for (auto& target : targets)\r
- target->addCopyFilesPhase ("Embed Frameworks", embeddedFrameworkIDs, kFrameworksFolder);\r
- }\r
-\r
void addCustomResourceFolders() const\r
{\r
StringArray folders;\r
\r
folders.addTokens (getCustomResourceFoldersString(), ":", "");\r
folders.trim();\r
- folders.removeEmptyStrings();\r
\r
for (auto& crf : folders)\r
addCustomResourceFolder (crf);\r
}\r
\r
- void addSubprojects() const\r
- {\r
- auto subprojectLines = StringArray::fromLines (getSubprojectsString());\r
- subprojectLines.removeEmptyStrings (true);\r
-\r
- Array<std::pair<String, StringArray>> subprojects;\r
-\r
- for (auto& line : subprojectLines)\r
- {\r
- String subprojectName (line.upToFirstOccurrenceOf (":", false, false));\r
- StringArray requestedBuildProducts (StringArray::fromTokens (line.fromFirstOccurrenceOf (":", false, false), ",;|", "\"'"));\r
- requestedBuildProducts.trim();\r
- subprojects.add ({ subprojectName, requestedBuildProducts });\r
- }\r
-\r
- for (const auto& subprojectInfo : subprojects)\r
- {\r
- String subprojectPath (subprojectInfo.first);\r
-\r
- if (! subprojectPath.endsWith (".xcodeproj"))\r
- subprojectPath += ".xcodeproj";\r
-\r
- File subprojectFile;\r
-\r
- if (File::isAbsolutePath (subprojectPath))\r
- {\r
- subprojectFile = subprojectPath;\r
- }\r
- else\r
- {\r
- subprojectFile = getProject().getProjectFolder().getChildFile (subprojectPath);\r
-\r
- RelativePath p (subprojectPath, RelativePath::projectFolder);\r
- subprojectPath = p.rebased (getProject().getProjectFolder(), getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle();\r
- }\r
-\r
- if (! subprojectFile.isDirectory())\r
- continue;\r
-\r
- auto availableBuildProducts = XcodeProjectParser::parseBuildProducts (subprojectFile);\r
-\r
- // If no build products have been specified then we'll take everything\r
- if (! subprojectInfo.second.isEmpty())\r
- {\r
- auto newEnd = std::remove_if (availableBuildProducts.begin(), availableBuildProducts.end(),\r
- [&subprojectInfo](const std::pair<String, String> &item)\r
- {\r
- return ! subprojectInfo.second.contains (item.first);\r
- });\r
- availableBuildProducts.erase (newEnd, availableBuildProducts.end());\r
- }\r
-\r
- if (availableBuildProducts.empty())\r
- continue;\r
-\r
- auto subprojectFileType = getFileType (RelativePath (subprojectPath, RelativePath::projectFolder));\r
- auto subprojectFileID = addFileOrFolderReference (subprojectPath, "<group>", subprojectFileType);\r
- subprojectFileIDs.add (subprojectFileID);\r
-\r
- StringArray proxyIDs;\r
-\r
- for (auto& buildProduct : availableBuildProducts)\r
- {\r
- auto buildProductFileType = getFileType (RelativePath (buildProduct.second, RelativePath::projectFolder));\r
-\r
- auto containerID = addContainerItemProxy (subprojectFileID, buildProduct.first);\r
- auto proxyID = addReferenceProxy (containerID, buildProduct.second, buildProductFileType);\r
- proxyIDs.add (proxyID);\r
-\r
- if (buildProductFileType == "archive.ar" || buildProductFileType == "wrapper.framework")\r
- {\r
- auto buildFileID = addBuildFile (buildProduct.second, proxyID, false, true);\r
-\r
- for (auto& target : targets)\r
- target->frameworkIDs.add (buildFileID);\r
-\r
- if (buildProductFileType == "wrapper.framework")\r
- {\r
- auto fileID = createID (buildProduct.second + "buildref");\r
-\r
- auto* v = new ValueTree (fileID);\r
- v->setProperty ("isa", "PBXBuildFile", nullptr);\r
- v->setProperty ("fileRef", proxyID, nullptr);\r
- v->setProperty ("settings", "{ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }", nullptr);\r
- pbxBuildFiles.add (v);\r
-\r
- embeddedFrameworkIDs.add (fileID);\r
- }\r
- }\r
- }\r
-\r
- auto productGroupID = createFileRefID (subprojectPath + "_products");\r
- addGroup (productGroupID, "Products", proxyIDs);\r
-\r
- subprojectReferences.add ({ productGroupID, subprojectFileID });\r
- }\r
- }\r
-\r
void addXcassets() const\r
{\r
auto customXcassetsPath = getCustomXcassetsFolderString();\r
"\tarchiveVersion = 1;\n"\r
"\tclasses = {\n\t};\n"\r
"\tobjectVersion = 46;\n"\r
- "\tobjects = {\n";\r
+ "\tobjects = {\n\n";\r
\r
Array<ValueTree*> objects;\r
objects.addArray (pbxBuildFiles);\r
\r
for (auto* o : objects)\r
{\r
- output << "\t\t" << o->getType().toString() << " = {\n";\r
+ output << "\t\t" << o->getType().toString() << " = {";\r
\r
for (int j = 0; j < o->getNumProperties(); ++j)\r
{\r
|| val.trimStart().startsWithChar ('{'))))\r
val = "\"" + val + "\"";\r
\r
- output << "\t\t\t" << propertyName.toString() << " = " << val << ";\n";\r
+ output << propertyName.toString() << " = " << val << "; ";\r
}\r
\r
- output << "\t\t};\n";\r
+ output << "};\n";\r
}\r
\r
output << "\t};\n\trootObject = " << createID ("__root") << ";\n}\n";\r
v->setProperty ("fileRef", fileRefID, nullptr);\r
\r
if (inhibitWarnings)\r
- v->setProperty ("settings", "{ COMPILER_FLAGS = \"-w\"; }", nullptr);\r
+ v->setProperty ("settings", "{COMPILER_FLAGS = \"-w\"; }", nullptr);\r
\r
pbxBuildFiles.add (v);\r
return fileID;\r
return addFileOrFolderReference (pathString, sourceTree, fileType);\r
}\r
\r
- void checkAndAddFileReference (std::unique_ptr<ValueTree> v) const\r
+ String addFileOrFolderReference (String pathString, String sourceTree, String fileType) const\r
{\r
+ auto fileRefID = createFileRefID (pathString);\r
+\r
+ std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
+ v->setProperty ("isa", "PBXFileReference", nullptr);\r
+ v->setProperty ("lastKnownFileType", fileType, nullptr);\r
+ v->setProperty (Ids::name, pathString.fromLastOccurrenceOf ("/", false, false), nullptr);\r
+ v->setProperty ("path", pathString, nullptr);\r
+ v->setProperty ("sourceTree", sourceTree, nullptr);\r
+\r
auto existing = pbxFileReferences.indexOfSorted (*this, v.get());\r
\r
if (existing >= 0)\r
{\r
pbxFileReferences.addSorted (*this, v.release());\r
}\r
- }\r
-\r
- String addFileOrFolderReference (const String& pathString, String sourceTree, String fileType) const\r
- {\r
- auto fileRefID = createFileRefID (pathString);\r
-\r
- std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
- v->setProperty ("isa", "PBXFileReference", nullptr);\r
- v->setProperty ("lastKnownFileType", fileType, nullptr);\r
- v->setProperty (Ids::name, pathString.fromLastOccurrenceOf ("/", false, false), nullptr);\r
- v->setProperty ("path", pathString, nullptr);\r
- v->setProperty ("sourceTree", sourceTree, nullptr);\r
-\r
- checkAndAddFileReference (std::move (v));\r
-\r
- return fileRefID;\r
- }\r
-\r
- String addContainerItemProxy (const String& subprojectID, const String& itemName) const\r
- {\r
- auto uniqueString = subprojectID + "_" + itemName;\r
- auto fileRefID = createFileRefID (uniqueString);\r
-\r
- std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
- v->setProperty ("isa", "PBXContainerItemProxy", nullptr);\r
- v->setProperty ("containerPortal", subprojectID, nullptr);\r
- v->setProperty ("proxyType", 2, nullptr);\r
- v->setProperty ("remoteGlobalIDString", createFileRefID (uniqueString + "_global"), nullptr);\r
- v->setProperty ("remoteInfo", itemName, nullptr);\r
-\r
- checkAndAddFileReference (std::move (v));\r
-\r
- return fileRefID;\r
- }\r
-\r
- String addReferenceProxy (const String& containerItemID, const String& proxyPath, const String& fileType) const\r
- {\r
- auto fileRefID = createFileRefID (containerItemID + "_" + proxyPath);\r
-\r
- std::unique_ptr<ValueTree> v (new ValueTree (fileRefID));\r
- v->setProperty ("isa", "PBXReferenceProxy", nullptr);\r
- v->setProperty ("fileType", fileType, nullptr);\r
- v->setProperty ("path", proxyPath, nullptr);\r
- v->setProperty ("remoteRef", containerItemID, nullptr);\r
- v->setProperty ("sourceTree", "BUILT_PRODUCTS_DIR", nullptr);\r
-\r
- checkAndAddFileReference (std::move (v));\r
\r
return fileRefID;\r
}\r
return addBuildFile (path, fileRefID, false, false);\r
}\r
\r
- String addCustomFramework (String frameworkPath) const\r
- {\r
- if (! frameworkPath.endsWithIgnoreCase (".framework"))\r
- frameworkPath << ".framework";\r
-\r
- auto fileRefID = createFileRefID (frameworkPath);\r
-\r
- auto fileType = getFileType (RelativePath (frameworkPath, RelativePath::projectFolder));\r
- addFileOrFolderReference (frameworkPath, "<group>", fileType);\r
-\r
- frameworkFileIDs.add (fileRefID);\r
-\r
- return addBuildFile (frameworkPath, fileRefID, false, false);\r
- }\r
-\r
- String addEmbeddedFramework (const String& path) const\r
- {\r
- auto fileRefID = createFileRefID (path);\r
-\r
- auto fileType = getFileType (RelativePath (path, RelativePath::projectFolder));\r
- addFileOrFolderReference (path, "<group>", fileType);\r
-\r
- auto fileID = createID (path + "buildref");\r
-\r
- auto* v = new ValueTree (fileID);\r
- v->setProperty ("isa", "PBXBuildFile", nullptr);\r
- v->setProperty ("fileRef", fileRefID, nullptr);\r
- v->setProperty ("settings", "{ ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }", nullptr);\r
- pbxBuildFiles.add (v);\r
-\r
- frameworkFileIDs.add (fileRefID);\r
-\r
- return fileID;\r
- }\r
-\r
void addGroup (const String& groupID, const String& groupName, const StringArray& childIDs) const\r
{\r
auto* v = new ValueTree (groupID);\r
v->setProperty ("hasScannedForEncodings", (int) 0, nullptr);\r
v->setProperty ("mainGroup", createID ("__mainsourcegroup"), nullptr);\r
v->setProperty ("projectDirPath", "\"\"", nullptr);\r
-\r
- if (! subprojectReferences.isEmpty())\r
- {\r
- StringArray projectReferences;\r
-\r
- for (auto& reference : subprojectReferences)\r
- projectReferences.add (indentBracedList ({ "ProductGroup = " + reference.first, "ProjectRef = " + reference.second }, 1));\r
-\r
- v->setProperty ("projectReferences", indentParenthesisedList (projectReferences), nullptr);\r
- }\r
-\r
v->setProperty ("projectRoot", "\"\"", nullptr);\r
\r
auto targetString = "(" + targetIDs.joinIntoString (", ") + ")";\r
\r
bool xcschemeManagementPlistMatchesTargets (const File& plist) const\r
{\r
- if (auto xml = parseXML (plist))\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (plist));\r
+\r
+ if (xml != nullptr)\r
if (auto* dict = xml->getChildByName ("dict"))\r
return parseNamesOfTargetsFromPlist (*dict) == getNamesOfTargets();\r
\r
\r
for (auto& type : getiOSAppIconTypes())\r
{\r
- DynamicObject::Ptr d (new DynamicObject());\r
+ DynamicObject::Ptr d = new DynamicObject();\r
d->setProperty ("idiom", type.idiom);\r
d->setProperty ("size", type.sizeString);\r
d->setProperty ("filename", type.filename);\r
\r
for (auto& type : getiOSLaunchImageTypes())\r
{\r
- DynamicObject::Ptr d (new DynamicObject());\r
+ DynamicObject::Ptr d = new DynamicObject();\r
d->setProperty ("orientation", type.orientation);\r
d->setProperty ("idiom", type.idiom);\r
d->setProperty ("extent", type.extent);\r
}\r
\r
//==============================================================================\r
- static String indentBracedList (const StringArray& list, int depth = 0) { return indentList (list, '{', '}', ";", depth, true); }\r
- static String indentParenthesisedList (const StringArray& list, int depth = 0) { return indentList (list, '(', ')', ",", depth, false); }\r
+ static String indentBracedList (const StringArray& list) { return "{" + indentList (list, ";", 0, true) + " }"; }\r
+ static String indentParenthesisedList (const StringArray& list) { return "(" + indentList (list, ",", 1, false) + " )"; }\r
\r
- static String indentList (StringArray list, char openBracket, char closeBracket, const String& separator, int extraTabs, bool shouldSort)\r
+ static String indentList (const StringArray& list, const String& separator, int extraTabs, bool shouldSort)\r
{\r
if (list.size() == 0)\r
- return openBracket + String (" ") + closeBracket;\r
+ return " ";\r
\r
auto tabs = "\n" + String::repeatedString ("\t", extraTabs + 4);\r
\r
if (shouldSort)\r
- list.sort (true);\r
+ {\r
+ auto sorted = list;\r
+ sorted.sort (true);\r
+\r
+ return tabs + sorted.joinIntoString (separator + tabs) + separator;\r
+ }\r
\r
- return openBracket + tabs + list.joinIntoString (separator + tabs) + separator\r
- + "\n" + String::repeatedString ("\t", extraTabs + 3) + closeBracket;\r
+ return tabs + list.joinIntoString (separator + tabs) + separator;\r
}\r
\r
String createID (String rootString) const\r
\r
#include "jucer_ProjectExport_CLion.h"\r
\r
-#include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h"\r
-\r
//==============================================================================\r
static void addType (Array<ProjectExporter::ExporterTypeInfo>& list,\r
const char* name, const void* iconData, int iconDataSize)\r
"The location of the folder in which the " + name + " project will be created. "\r
"This path can be absolute, but it's much more sensible to make it relative to the jucer project directory.");\r
\r
- if (shouldBuildTargetType (ProjectType::Target::VSTPlugIn) && project.shouldBuildVST())\r
- {\r
- props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.wrappedValue, "VST (Legacy) SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
- "If you're building a VST plug-in, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. "\r
- "This can be an absolute path, or a path relative to the Projucer project file.");\r
- }\r
-\r
- if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) && project.shouldBuildVST3())\r
- {\r
- props.add (new FilePathPropertyComponent (vst3PathValueWrapper.wrappedValue, "VST3 SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
- "If you're building a VST3 plug-in, you can use this field to override the global VST3 SDK path with a project-specific path. "\r
- "This can be an absolute path, or a path relative to the Projucer project file.");\r
- }\r
-\r
- if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX())\r
- {\r
- props.add (new FilePathPropertyComponent (aaxPathValueWrapper.wrappedValue, "AAX SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
- "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
- }\r
-\r
- if (shouldBuildTargetType (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS())\r
- {\r
- props.add (new FilePathPropertyComponent (rtasPathValueWrapper.wrappedValue, "RTAS SDK Folder", true, getTargetOSForExporter() == TargetOS::getThisOS()),\r
- "If you're building an RTAS plug-in, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
- }\r
+ createDependencyPathProperties (props);\r
\r
props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true),\r
"Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, "\r
"Extra comments: This field is not used for code or project generation, it's just a space where you can express your thoughts.");\r
}\r
\r
+void ProjectExporter::createDependencyPathProperties (PropertyListBuilder& props)\r
+{\r
+ if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost())\r
+ {\r
+ if (dynamic_cast<DependencyPathValueSource*> (&getVST3PathValue().getValueSource()) != nullptr)\r
+ props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getVST3PathValue(), "VST3 SDK Folder"),\r
+ "If you're building a VST3 plugin or host, this must be the folder containing the VST3 SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+ }\r
+\r
+ if (shouldBuildTargetType (ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX())\r
+ {\r
+ if (dynamic_cast<DependencyPathValueSource*> (&getAAXPathValue().getValueSource()) != nullptr)\r
+ props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getAAXPathValue(), "AAX SDK Folder"),\r
+ "If you're building an AAX plugin, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+ }\r
+\r
+ if (shouldBuildTargetType (ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS())\r
+ {\r
+ if (dynamic_cast<DependencyPathValueSource*> (&getRTASPathValue().getValueSource()) != nullptr)\r
+ props.add (new DependencyPathPropertyComponent (project.getFile().getParentDirectory(), getRTASPathValue(), "RTAS SDK Folder"),\r
+ "If you're building an RTAS, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file.");\r
+ }\r
+}\r
+\r
void ProjectExporter::createIconProperties (PropertyListBuilder& props)\r
{\r
OwnedArray<Project::Item> images;\r
\r
void ProjectExporter::addVSTPathsIfPluginOrHost()\r
{\r
- if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost()\r
- || shouldBuildTargetType (ProjectType::Target::VSTPlugIn) || project.isVSTPluginHost())\r
- {\r
- addLegacyVSTFolderToPathIfSpecified();\r
+ if (shouldBuildTargetType (ProjectType::Target::VST3PlugIn) || project.isVST3PluginHost())\r
addVST3FolderToPath();\r
- }\r
}\r
\r
void ProjectExporter::addCommonAudioPluginSettings()\r
// Note: RTAS paths are platform-dependent, impl -> addPlatformSpecificSettingsForProjectType\r
}\r
\r
-void ProjectExporter::addLegacyVSTFolderToPathIfSpecified()\r
-{\r
- auto vstFolder = getVSTLegacyPathString();\r
-\r
- if (vstFolder.isNotEmpty())\r
- addToExtraSearchPaths (RelativePath (vstFolder, RelativePath::projectFolder), 0);\r
-}\r
-\r
-RelativePath ProjectExporter::getInternalVST3SDKPath()\r
-{\r
- return getModuleFolderRelativeToProject ("juce_audio_processors")\r
- .getChildFile ("format_types")\r
- .getChildFile ("VST3_SDK");\r
-}\r
-\r
void ProjectExporter::addVST3FolderToPath()\r
{\r
- auto vst3Folder = getVST3PathString();\r
+ auto vst3Folder = getVST3PathValue().toString();\r
\r
if (vst3Folder.isNotEmpty())\r
addToExtraSearchPaths (RelativePath (vst3Folder, RelativePath::projectFolder), 0);\r
- else\r
- addToExtraSearchPaths (getInternalVST3SDKPath(), 0);\r
}\r
\r
void ProjectExporter::addAAXFoldersToPath()\r
{\r
- auto aaxFolder = getAAXPathString();\r
+ auto aaxFolder = getAAXPathValue().toString();\r
\r
if (aaxFolder.isNotEmpty())\r
{\r
- RelativePath aaxFolderPath (aaxFolder, RelativePath::projectFolder);\r
+ RelativePath aaxFolderPath (getAAXPathValue().toString(), RelativePath::projectFolder);\r
\r
addToExtraSearchPaths (aaxFolderPath);\r
addToExtraSearchPaths (aaxFolderPath.getChildFile ("Interfaces"));\r
{"JucePlugin_Build_AUv3", ProjectType::Target::AudioUnitv3PlugIn},\r
{"JucePlugin_Build_RTAS", ProjectType::Target::RTASPlugIn},\r
{"JucePlugin_Build_AAX", ProjectType::Target::AAXPlugIn},\r
- {"JucePlugin_Build_Standalone", ProjectType::Target::StandalonePlugIn},\r
- {"JucePlugin_Build_Unity", ProjectType::Target::UnityPlugIn}\r
+ {"JucePlugin_Build_Standalone", ProjectType::Target::StandalonePlugIn}\r
};\r
\r
if (targetType == ProjectType::Target::SharedCodeTarget)\r
addProjectPathToBuildPathList (extraSearchPaths, pathFromProjectFolder, index);\r
}\r
\r
-static var getStoredPathForModule (const String& id, const ProjectExporter& exp)\r
-{\r
- return getAppSettings().getStoredPath (isJUCEModule (id) ? Ids::defaultJuceModulePath : Ids::defaultUserModulePath,\r
- exp.getTargetOSForExporter()).get();\r
-}\r
-\r
-ValueWithDefault ProjectExporter::getPathForModuleValue (const String& moduleID)\r
+Value ProjectExporter::getPathForModuleValue (const String& moduleID)\r
{\r
auto* um = getUndoManager();\r
\r
paths.appendChild (m, um);\r
}\r
\r
- return { m, Ids::path, um, getStoredPathForModule (moduleID, *this) };\r
+ return m.getPropertyAsValue (Ids::path, um);\r
}\r
\r
String ProjectExporter::getPathForModuleString (const String& moduleID) const\r
auto exporterPath = settings.getChildWithName (Ids::MODULEPATHS)\r
.getChildWithProperty (Ids::ID, moduleID) [Ids::path].toString();\r
\r
- if (exporterPath.isEmpty() || project.getEnabledModules().shouldUseGlobalPath (moduleID))\r
- return getStoredPathForModule (moduleID, *this);\r
+ if (exporterPath.isEmpty() || project.getModules().shouldUseGlobalPath (moduleID))\r
+ {\r
+ auto id = isJUCEModule (moduleID) ? Ids::defaultJuceModulePath\r
+ : Ids::defaultUserModulePath;\r
+\r
+ if (TargetOS::getThisOS() != getTargetOSForExporter())\r
+ return getAppSettings().getFallbackPathForOS (id, getTargetOSForExporter()).toString();\r
+\r
+ if (id == Ids::defaultJuceModulePath)\r
+ return getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString();\r
+\r
+ return getAppSettings().getStoredPath (Ids::defaultUserModulePath).toString();\r
+ }\r
\r
return exporterPath;\r
}\r
{\r
auto targetOS = TargetOS::unknown;\r
\r
- if (isWindows()) targetOS = TargetOS::windows;\r
- else if (isOSX() || isiOS()) targetOS = TargetOS::osx;\r
- else if (isLinux()) targetOS = TargetOS::linux;\r
- else if (isAndroid() || isCLion()) targetOS = TargetOS::getThisOS();\r
+ if (isWindows()) targetOS = TargetOS::windows;\r
+ else if (isOSX() || isiOS()) targetOS = TargetOS::osx;\r
+ else if (isLinux()) targetOS = TargetOS::linux;\r
+ else if (isAndroid()) targetOS = TargetOS::getThisOS();\r
\r
return targetOS;\r
}\r
\r
RelativePath ProjectExporter::getModuleFolderRelativeToProject (const String& moduleID) const\r
{\r
- if (project.getEnabledModules().shouldCopyModuleFilesLocally (moduleID).getValue())\r
+ if (project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue())\r
return RelativePath (project.getRelativePathForFile (project.getLocalModuleFolder (moduleID)),\r
RelativePath::projectFolder);\r
\r
\r
RelativePath ProjectExporter::getLegacyModulePath (const String& moduleID) const\r
{\r
- if (project.getEnabledModules().state.getChildWithProperty (Ids::ID, moduleID) ["useLocalCopy"])\r
+ if (project.getModules().state.getChildWithProperty (Ids::ID, moduleID) ["useLocalCopy"])\r
return RelativePath (project.getRelativePathForFile (project.getGeneratedCodeFolder()\r
.getChildFile ("modules")\r
.getChildFile (moduleID)), RelativePath::projectFolder);\r
\r
if (oldPath.isNotEmpty())\r
{\r
- for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+ for (int i = project.getModules().getNumModules(); --i >= 0;)\r
{\r
- auto modID = project.getEnabledModules().getModuleID (i);\r
+ auto modID = project.getModules().getModuleID(i);\r
getPathForModuleValue (modID) = getLegacyModulePath (modID).getParentDirectory().toUnixStyle();\r
}\r
\r
{\r
if (areCompatibleExporters (*this, *exporter))\r
{\r
- for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+ for (int i = project.getModules().getNumModules(); --i >= 0;)\r
{\r
- auto modID = project.getEnabledModules().getModuleID (i);\r
- getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID);\r
+ auto modID = project.getModules().getModuleID (i);\r
+ getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID).getValue();\r
}\r
\r
return;\r
{\r
if (exporter->canLaunchProject())\r
{\r
- for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+ for (int i = project.getModules().getNumModules(); --i >= 0;)\r
{\r
- auto modID = project.getEnabledModules().getModuleID (i);\r
- getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID);\r
+ auto modID = project.getModules().getModuleID (i);\r
+ getPathForModuleValue (modID) = exporter->getPathForModuleValue (modID).getValue();\r
}\r
\r
return;\r
}\r
}\r
\r
- for (int i = project.getEnabledModules().getNumModules(); --i >= 0;)\r
+ for (int i = project.getModules().getNumModules(); --i >= 0;)\r
{\r
- auto modID = project.getEnabledModules().getModuleID (i);\r
+ auto modID = project.getModules().getModuleID (i);\r
getPathForModuleValue (modID) = "../../juce";\r
}\r
}\r
ValueTree newConfig (Ids::CONFIGURATION);\r
newConfig = configToCopy.config.createCopy();\r
\r
- newConfig.setProperty (Ids::name, configToCopy.getName(), nullptr);\r
+ newConfig.setProperty (Ids::name, configToCopy.getName(), 0);\r
\r
configs.appendChild (newConfig, project.getUndoManagerFor (configs));\r
}\r
{\r
auto im = SoftwareImageType().convert (drawableImage->getImage());\r
\r
- if (im.getWidth() == size && im.getHeight() == size)\r
+ if (size == im.getWidth() && size == im.getHeight())\r
return im;\r
\r
// (scale it down in stages for better resampling)\r
#pragma once\r
\r
#include "../Project/jucer_Project.h"\r
+#include "../Utility/UI/PropertyComponents/jucer_DependencyPathPropertyComponent.h"\r
#include "../Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h"\r
\r
class ProjectSaver;\r
\r
String getExternalLibrariesString() const { return getSearchPathsFromString (externalLibrariesValue.get().toString()).joinIntoString (";"); }\r
\r
- bool shouldUseGNUExtensions() const { return gnuExtensionsValue.get(); }\r
+ bool shouldUseGNUExtensions() const { return gnuExtensionsValue.get();}\r
\r
- String getVSTLegacyPathString() const { return vstLegacyPathValueWrapper.wrappedValue.get(); }\r
- String getVST3PathString() const { return vst3PathValueWrapper.wrappedValue.get(); }\r
- String getAAXPathString() const { return aaxPathValueWrapper.wrappedValue.get(); }\r
- String getRTASPathString() const { return rtasPathValueWrapper.wrappedValue.get(); }\r
+ Value getVST3PathValue() const { return vst3Path; }\r
+ Value getRTASPathValue() const { return rtasPath; }\r
+ Value getAAXPathValue() const { return aaxPath; }\r
\r
// NB: this is the path to the parent "modules" folder that contains the named module, not the\r
// module folder itself.\r
- ValueWithDefault getPathForModuleValue (const String& moduleID);\r
+ Value getPathForModuleValue (const String& moduleID);\r
String getPathForModuleString (const String& moduleID) const;\r
void removePathForModule (const String& moduleID);\r
\r
String getName() const { return configNameValue.get(); }\r
bool isDebug() const { return isDebugValue.get(); }\r
\r
+ String getTargetBinaryNameString() const { return targetNameValue.get(); }\r
String getTargetBinaryRelativePathString() const { return targetBinaryPathValue.get(); }\r
- String getTargetBinaryNameString (bool isUnityPlugin = false) const\r
- {\r
- return (isUnityPlugin ? Project::addUnityPluginPrefixIfNecessary (targetNameValue.get().toString())\r
- : targetNameValue.get().toString());\r
- }\r
\r
int getOptimisationLevelInt() const { return optimisationLevelValue.get(); }\r
String getGCCOptimisationFlag() const;\r
bool next();\r
\r
BuildConfiguration& operator*() const { return *config; }\r
- BuildConfiguration* operator->() const { return config.get(); }\r
+ BuildConfiguration* operator->() const { return config; }\r
\r
BuildConfiguration::Ptr config;\r
int index;\r
bool next();\r
\r
const BuildConfiguration& operator*() const { return *config; }\r
- const BuildConfiguration* operator->() const { return config.get(); }\r
+ const BuildConfiguration* operator->() const { return config; }\r
\r
BuildConfiguration::Ptr config;\r
int index;\r
const ProjectType& projectType;\r
const String projectName;\r
const File projectFolder;\r
-\r
- //==============================================================================\r
- // Wraps a ValueWithDefault object that has a default which depends on a global value.\r
- // Used for the VST3, RTAS and AAX project-specific path options.\r
- struct ValueWithDefaultWrapper : public Value::Listener\r
- {\r
- void init (const ValueWithDefault& vwd, ValueWithDefault global, TargetOS::OS targetOS)\r
- {\r
- wrappedValue = vwd;\r
- globalValue = global.getPropertyAsValue();\r
- globalIdentifier = global.getPropertyID();\r
- os = targetOS;\r
-\r
- if (wrappedValue.get() == var())\r
- wrappedValue.resetToDefault();\r
-\r
- globalValue.addListener (this);\r
- valueChanged (globalValue);\r
- }\r
-\r
- void valueChanged (Value&) override\r
- {\r
- wrappedValue.setDefault (getAppSettings().getStoredPath (globalIdentifier, os).get());\r
- }\r
-\r
- ValueWithDefault wrappedValue;\r
- Value globalValue;\r
-\r
- Identifier globalIdentifier;\r
- TargetOS::OS os;\r
- };\r
-\r
- ValueWithDefaultWrapper vstLegacyPathValueWrapper, vst3PathValueWrapper, rtasPathValueWrapper, aaxPathValueWrapper;\r
+ Value vst3Path, rtasPath, aaxPath; // these must be initialised in the specific exporter c'tors!\r
\r
ValueWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue,\r
userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue;\r
void createIconProperties (PropertyListBuilder&);\r
void addVSTPathsIfPluginOrHost();\r
void addCommonAudioPluginSettings();\r
- void addLegacyVSTFolderToPathIfSpecified();\r
- RelativePath getInternalVST3SDKPath();\r
void addVST3FolderToPath();\r
void addAAXFoldersToPath();\r
\r
flags.set ("JucePlugin_Build_RTAS", boolToString (project.shouldBuildRTAS()));\r
flags.set ("JucePlugin_Build_AAX", boolToString (project.shouldBuildAAX()));\r
flags.set ("JucePlugin_Build_Standalone", boolToString (project.shouldBuildStandalonePlugin()));\r
- flags.set ("JucePlugin_Build_Unity", boolToString (project.shouldBuildUnityPlugin()));\r
flags.set ("JucePlugin_Enable_IAA", boolToString (project.shouldEnableIAA()));\r
flags.set ("JucePlugin_Name", toStringLiteral (project.getPluginNameString()));\r
flags.set ("JucePlugin_Desc", toStringLiteral (project.getPluginDescriptionString()));\r
project.setFile (projectFile);\r
\r
OwnedArray<LibraryModule> modules;\r
- project.getEnabledModules().createRequiredModules (modules);\r
+ project.getModules().createRequiredModules (modules);\r
\r
checkModuleValidity (modules);\r
\r
auto projectRootHash = project.getProjectRoot().toXmlString().hashCode();\r
\r
if (project.getProjectType().isAudioPlugin())\r
- {\r
writePluginCharacteristicsFile();\r
\r
- if (project.shouldBuildUnityPlugin())\r
- writeUnityScriptFile();\r
- }\r
-\r
writeAppConfigFile (modules, appConfigUserContent);\r
writeBinaryDataFiles();\r
writeAppHeader (modules);\r
}\r
\r
if (generatedCodeFolder.exists())\r
- {\r
writeReadmeFile();\r
- deleteUnwantedFilesIn (generatedCodeFolder);\r
- }\r
+ }\r
\r
- if (errors.size() == 0)\r
- {\r
- // Workaround for a bug where Xcode thinks the project is invalid if opened immedietely\r
- // after writing\r
- if (waitAfterSaving)\r
- Thread::sleep (2000);\r
+ if (generatedCodeFolder.exists())\r
+ deleteUnwantedFilesIn (generatedCodeFolder);\r
\r
- return Result::ok();\r
- }\r
+ if (errors.size() > 0)\r
+ {\r
+ project.setFile (oldFile);\r
+ return Result::fail (errors[0]);\r
}\r
\r
- project.setFile (oldFile);\r
- return Result::fail (errors[0]);\r
+ // Workaround for a bug where Xcode thinks the project is invalid if opened immedietely\r
+ // after writing\r
+ if (waitAfterSaving)\r
+ Thread::sleep (2000);\r
+\r
+ return Result::ok();\r
}\r
\r
Result saveResourcesOnly()\r
Result saveContentNeededForLiveBuild()\r
{\r
OwnedArray<LibraryModule> modules;\r
- project.getEnabledModules().createRequiredModules (modules);\r
+ project.getModules().createRequiredModules (modules);\r
\r
checkModuleValidity (modules);\r
\r
return;\r
}\r
\r
- if (project.getEnabledModules().getExtraDependenciesNeeded (module->getID()).size() > 0)\r
+ if (project.getModules().getExtraDependenciesNeeded (module->getID()).size() > 0)\r
{\r
addError ("At least one of your modules has missing dependencies!\n"\r
"Please go to the settings page of the highlighted modules and add the required dependencies.");\r
}\r
}\r
\r
- if (extraAppConfigContent.isNotEmpty())\r
- out << newLine << extraAppConfigContent.trimEnd() << newLine;\r
-\r
{\r
+ int isStandaloneApplication = 1;\r
auto& type = project.getProjectType();\r
\r
- auto isStandaloneApplication = (! type.isAudioPlugin() && ! type.isDynamicLibrary());\r
+ if (type.isAudioPlugin() || type.isDynamicLibrary())\r
+ isStandaloneApplication = 0;\r
\r
- out << newLine\r
- << "//==============================================================================" << newLine\r
+ out << "//==============================================================================" << newLine\r
<< "#ifndef JUCE_STANDALONE_APPLICATION" << newLine\r
<< " #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)" << newLine\r
<< " #define JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone" << newLine\r
<< " #else" << newLine\r
- << " #define JUCE_STANDALONE_APPLICATION " << (isStandaloneApplication ? "1" : "0") << newLine\r
+ << " #define JUCE_STANDALONE_APPLICATION " << isStandaloneApplication << newLine\r
<< " #endif" << newLine\r
<< "#endif" << newLine;\r
}\r
+\r
+ if (extraAppConfigContent.isNotEmpty())\r
+ out << newLine << extraAppConfigContent.trimEnd() << newLine;\r
}\r
\r
void writeAppConfigFile (const OwnedArray<LibraryModule>& modules, const String& userContent)\r
<< "namespace ProjectInfo" << newLine\r
<< "{" << newLine\r
<< " const char* const projectName = " << CppTokeniserFunctions::addEscapeChars (project.getProjectNameString()).quoted() << ";" << newLine\r
- << " const char* const companyName = " << CppTokeniserFunctions::addEscapeChars (project.getCompanyNameString()).quoted() << ";" << newLine\r
<< " const char* const versionString = " << CppTokeniserFunctions::addEscapeChars (project.getVersionString()).quoted() << ";" << newLine\r
<< " const int versionNumber = " << project.getVersionAsHex() << ";" << newLine\r
<< "}" << newLine\r
\r
void writePluginCharacteristicsFile();\r
\r
- void writeUnityScriptFile()\r
- {\r
- String unityScriptContents (BinaryData::jucer_UnityPluginGUIScript_cs);\r
-\r
- auto projectName = Project::addUnityPluginPrefixIfNecessary (project.getProjectNameString());\r
-\r
- unityScriptContents = unityScriptContents.replace ("%%plugin_class_name%%", projectName.replace (" ", "_"))\r
- .replace ("%%plugin_name%%", projectName)\r
- .replace ("%%plugin_vendor%%", project.getPluginManufacturerString())\r
- .replace ("%%plugin_description%%", project.getPluginDescriptionString());\r
-\r
- auto f = getGeneratedCodeFolder().getChildFile (project.getUnityScriptName());\r
-\r
- MemoryOutputStream out;\r
- out << unityScriptContents;\r
-\r
- replaceFileIfDifferent (f, out);\r
- }\r
-\r
void writeProjects (const OwnedArray<LibraryModule>&, const String&, bool);\r
\r
void saveExporter (ProjectExporter* exporter, const OwnedArray<LibraryModule>& modules)\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-#include <regex>\r
-\r
-//==============================================================================\r
-class XcodeProjectParser\r
-{\r
-public:\r
- //==============================================================================\r
- static std::unique_ptr<HashMap<std::string, std::string>> parseObjects (const File& projectFile)\r
- {\r
- auto pbxprojs = projectFile.findChildFiles (File::TypesOfFileToFind::findFiles, false, "*.pbxproj");\r
-\r
- if (pbxprojs.isEmpty())\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
-\r
- auto content = pbxprojs[0].loadFileAsString().toStdString();\r
-\r
- std::regex comments ("/\\*.*?\\*/");\r
- content = (std::regex_replace (content, comments, ""));\r
-\r
- std::regex whitespace ("\\s+");\r
- content = (std::regex_replace (content, whitespace, " "));\r
-\r
- auto objects = std::make_unique<HashMap<std::string, std::string>>();\r
- std::smatch objectsStartMatch;\r
-\r
- if (! std::regex_search (content, objectsStartMatch, std::regex ("[ ;{]+objects *= *\\{")))\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
-\r
- auto strPtr = content.begin() + objectsStartMatch.position() + objectsStartMatch.length();\r
-\r
- while (strPtr++ != content.end())\r
- {\r
- if (*strPtr == ' ' || *strPtr == ';')\r
- continue;\r
-\r
- if (*strPtr == '}')\r
- break;\r
-\r
- auto groupReference = parseObjectID (content, strPtr);\r
-\r
- if (groupReference.empty())\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
-\r
- while (*strPtr == ' ' || *strPtr == '=')\r
- {\r
- if (++strPtr == content.end())\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
- }\r
-\r
- auto bracedContent = parseBracedContent (content, strPtr);\r
-\r
- if (bracedContent.empty())\r
- return nullptr;\r
-\r
- objects->set (groupReference, bracedContent);\r
- }\r
-\r
- jassert (strPtr <= content.end());\r
-\r
- return objects;\r
- }\r
-\r
- static std::pair<std::string, std::string> findObjectMatching (const HashMap<std::string, std::string>& objects,\r
- const std::regex& rgx)\r
- {\r
- HashMap<std::string, std::string>::Iterator it (objects);\r
- std::smatch match;\r
-\r
- while (it.next())\r
- {\r
- auto key = it.getValue();\r
-\r
- if (std::regex_search (key, match, rgx))\r
- return { it.getKey(), it.getValue() };\r
- }\r
-\r
- return {};\r
- }\r
-\r
- //==============================================================================\r
- static std::vector<std::pair<String, String>> parseBuildProducts (const File& projectFile)\r
- {\r
- auto objects = parseObjects (projectFile);\r
-\r
- if (objects == nullptr)\r
- return {};\r
-\r
- auto mainObject = findObjectMatching (*objects, std::regex ("[ ;{]+isa *= *PBXProject[ ;}]+"));\r
- jassert (! mainObject.first.empty());\r
-\r
- auto targetRefs = parseObjectItemList (mainObject.second, "targets");\r
- jassert (! targetRefs.isEmpty());\r
-\r
- std::vector<std::pair<String, String>> results;\r
-\r
- for (auto& t : targetRefs)\r
- {\r
- auto targetRef = t.toStdString();\r
-\r
- if (! objects->contains (targetRef))\r
- {\r
- jassertfalse;\r
- continue;\r
- }\r
-\r
- auto name = parseObjectItemValue (objects->getReference (targetRef), "name");\r
-\r
- if (name.empty())\r
- continue;\r
-\r
- auto productRef = parseObjectItemValue (objects->getReference (targetRef), "productReference");\r
-\r
- if (productRef.empty())\r
- continue;\r
-\r
- if (! objects->contains (productRef))\r
- {\r
- jassertfalse;\r
- continue;\r
- }\r
-\r
- auto path = parseObjectItemValue (objects->getReference (productRef), "path");\r
-\r
- if (path.empty())\r
- continue;\r
-\r
- results.push_back ({ String (name).unquoted(), String (path).unquoted() });\r
- }\r
-\r
- return results;\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- static std::string parseObjectID (std::string& content, std::string::iterator& ptr)\r
- {\r
- auto start = ptr;\r
-\r
- while (ptr != content.end() && *ptr != ' ' && *ptr != ';' && *ptr != '=')\r
- ++ptr;\r
-\r
- return ptr == content.end() ? std::string()\r
- : content.substr ((size_t) std::distance (content.begin(), start),\r
- (size_t) std::distance (start, ptr));\r
- }\r
-\r
- //==============================================================================\r
- static std::string parseBracedContent (std::string& content, std::string::iterator& ptr)\r
- {\r
- jassert (*ptr == '{');\r
- auto start = ++ptr;\r
- auto braceDepth = 1;\r
-\r
- while (ptr++ != content.end())\r
- {\r
- switch (*ptr)\r
- {\r
- case '{':\r
- ++braceDepth;\r
- break;\r
- case '}':\r
- if (--braceDepth == 0)\r
- return content.substr ((size_t) std::distance (content.begin(), start),\r
- (size_t) std::distance (start, ptr));\r
- }\r
- }\r
-\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- //==============================================================================\r
- static std::string parseObjectItemValue (const std::string& source, const std::string& key)\r
- {\r
- std::smatch match;\r
-\r
- if (! std::regex_search (source, match, std::regex ("[ ;{]+" + key + " *= *(.*?)[ ;]+")))\r
- {\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- return match[1];\r
- }\r
-\r
- //==============================================================================\r
- static StringArray parseObjectItemList (const std::string& source, const std::string& key)\r
- {\r
- std::smatch match;\r
-\r
- if (! std::regex_search (source, match, std::regex ("[ ;{]+" + key + " *= *\\((.*?)\\)")))\r
- {\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- auto result = StringArray::fromTokens (String (match[1]), ", ", "");\r
- result.removeEmptyStrings();\r
-\r
- return result;\r
- }\r
-};\r
\r
void AppearanceSettings::writeDefaultSchemeFile (const String& xmlString, const String& name)\r
{\r
- auto file = getSchemesFolder().getChildFile (name).withFileExtension (getSchemeFileSuffix());\r
+ const File file (getSchemesFolder().getChildFile (name).withFileExtension (getSchemeFileSuffix()));\r
\r
AppearanceSettings settings (false);\r
\r
- if (auto xml = parseXML (xmlString))\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (xmlString));\r
+\r
+ if (xml != nullptr)\r
settings.readFromXML (*xml);\r
\r
settings.writeToFile (file);\r
\r
bool AppearanceSettings::readFromFile (const File& file)\r
{\r
- if (auto xml = parseXML (file))\r
- return readFromXML (*xml);\r
-\r
- return false;\r
+ const std::unique_ptr<XmlElement> xml (XmlDocument::parse (file));\r
+ return xml != nullptr && readFromXML (*xml);\r
}\r
\r
bool AppearanceSettings::writeToFile (const File& file) const\r
fallbackPaths ("FALLBACK_PATHS")\r
{\r
updateOldProjectSettingsFiles();\r
-\r
reload();\r
- changed (true);\r
- flush();\r
-\r
checkJUCEPaths();\r
\r
projectDefaults.addListener (this);\r
auto newFileName = oldFileName.replace ("Introjucer", "Projucer");\r
\r
if (oldFileName.contains ("_Project"))\r
- {\r
f.moveFileTo (f.getSiblingFile (newProjectSettingsDir.getFileName()).getChildFile (newFileName));\r
- }\r
else\r
- {\r
- auto newFile = f.getSiblingFile (newFileName);\r
-\r
- // don't overwrite newer settings file\r
- if (! newFile.existsAsFile())\r
- f.moveFileTo (f.getSiblingFile (newFileName));\r
- }\r
+ f.moveFileTo (f.getSiblingFile (newFileName));\r
}\r
}\r
}\r
\r
+void StoredSettings::checkJUCEPaths()\r
+{\r
+ auto moduleFolder = projectDefaults.getProperty (Ids::defaultJuceModulePath).toString();\r
+ auto juceFolder = projectDefaults.getProperty (Ids::jucePath).toString();\r
+\r
+ auto validModuleFolder = moduleFolder.isNotEmpty() && isGlobalPathValid ({}, Ids::defaultJuceModulePath, moduleFolder);\r
+ auto validJuceFolder = juceFolder.isNotEmpty() && isGlobalPathValid ({}, Ids::jucePath, juceFolder);\r
+\r
+ if (validModuleFolder && ! validJuceFolder)\r
+ projectDefaults.getPropertyAsValue (Ids::jucePath, nullptr) = File (moduleFolder).getParentDirectory().getFullPathName();\r
+ else if (! validModuleFolder && validJuceFolder)\r
+ projectDefaults.getPropertyAsValue (Ids::defaultJuceModulePath, nullptr) = File (juceFolder).getChildFile ("modules").getFullPathName();\r
+}\r
+\r
+bool StoredSettings::shouldAskUserToSetJUCEPath() noexcept\r
+{\r
+ if (! isGlobalPathValid ({}, Ids::jucePath, projectDefaults.getProperty (Ids::jucePath).toString())\r
+ && getGlobalProperties().getValue ("dontAskAboutJUCEPath", {}).isEmpty())\r
+ return true;\r
+\r
+ return false;\r
+}\r
+\r
+void StoredSettings::setDontAskAboutJUCEPathAgain() noexcept\r
+{\r
+ getGlobalProperties().setValue ("dontAskAboutJUCEPath", 1);\r
+}\r
+\r
//==============================================================================\r
void StoredSettings::loadSwatchColours()\r
{\r
}\r
\r
//==============================================================================\r
-void StoredSettings::changed (bool isProjectDefaults)\r
+Value StoredSettings::getStoredPath (const Identifier& key)\r
{\r
- std::unique_ptr<XmlElement> data (isProjectDefaults ? projectDefaults.createXml()\r
- : fallbackPaths.createXml());\r
+ auto v = projectDefaults.getPropertyAsValue (key, nullptr);\r
+\r
+ if (v.toString().isEmpty())\r
+ v = getFallbackPathForOS (key, TargetOS::getThisOS()).toString();\r
\r
- propertyFiles.getUnchecked (0)->setValue (isProjectDefaults ? "PROJECT_DEFAULT_SETTINGS" : "FALLBACK_PATHS",\r
- data.get());\r
+ return v;\r
+}\r
+\r
+Value StoredSettings::getFallbackPathForOS (const Identifier& key, DependencyPathOS os)\r
+{\r
+ auto id = Identifier();\r
+\r
+ if (os == TargetOS::osx) id = Ids::osxFallback;\r
+ else if (os == TargetOS::windows) id = Ids::windowsFallback;\r
+ else if (os == TargetOS::linux) id = Ids::linuxFallback;\r
+\r
+ if (id == Identifier())\r
+ jassertfalse;\r
+\r
+ auto v = fallbackPaths.getOrCreateChildWithName (id, nullptr)\r
+ .getPropertyAsValue (key, nullptr);\r
+\r
+ if (v.toString().isEmpty())\r
+ {\r
+ if (key == Ids::jucePath)\r
+ {\r
+ v = (os == TargetOS::windows ? "C:\\JUCE"\r
+ : "~/JUCE");\r
+ }\r
+ else if (key == Ids::defaultJuceModulePath)\r
+ {\r
+ v = (os == TargetOS::windows ? "C:\\JUCE\\modules"\r
+ : "~/JUCE/modules");\r
+ }\r
+ else if (key == Ids::defaultUserModulePath)\r
+ {\r
+ v = (os == TargetOS::windows ? "C:\\modules"\r
+ : "~/modules");\r
+ }\r
+ else if (key == Ids::vst3Path)\r
+ {\r
+ v = (os == TargetOS::windows ? "C:\\SDKs\\VST_SDK\\VST3_SDK"\r
+ : "~/SDKs/VST_SDK/VST3_SDK");\r
+ }\r
+ else if (key == Ids::rtasPath)\r
+ {\r
+ if (os == TargetOS::windows) v = "C:\\SDKs\\PT_90_SDK";\r
+ else if (os == TargetOS::osx) v = "~/SDKs/PT_90_SDK";\r
+ else jassertfalse; // no RTAS on this OS!\r
+ }\r
+ else if (key == Ids::aaxPath)\r
+ {\r
+ if (os == TargetOS::windows) v = "C:\\SDKs\\AAX";\r
+ else if (os == TargetOS::osx) v = "~/SDKs/AAX";\r
+ else jassertfalse; // no AAX on this OS!\r
+ }\r
+ else if (key == Ids::androidSDKPath)\r
+ {\r
+ v = "${user.home}/Library/Android/sdk";\r
+ }\r
+ else if (key == Ids::androidNDKPath)\r
+ {\r
+ v = "${user.home}/Library/Android/sdk/ndk-bundle";\r
+ }\r
+ else if (key == Ids::clionExePath)\r
+ {\r
+ if (os == TargetOS::windows)\r
+ {\r
+ #if JUCE_WINDOWS\r
+ auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {});\r
+ auto openCmd = StringArray::fromTokens (regValue, true);\r
+\r
+ if (! openCmd.isEmpty())\r
+ return Value (openCmd[0].unquoted());\r
+ #endif\r
+\r
+ v = "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe";\r
+ }\r
+ else if (os == TargetOS::osx)\r
+ {\r
+ v = "/Applications/CLion.app";\r
+ }\r
+ else\r
+ {\r
+ v = "${user.home}/clion/bin/clion.sh";\r
+ }\r
+ }\r
+ }\r
+\r
+ return v;\r
}\r
\r
-//==============================================================================\r
static bool doesSDKPathContainFile (const File& relativeTo, const String& path, const String& fileToCheckFor) noexcept\r
{\r
auto actualPath = path.replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
return relativeTo.getChildFile (actualPath + "/" + fileToCheckFor).exists();\r
}\r
\r
-static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path)\r
+bool StoredSettings::isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path) const noexcept\r
{\r
String fileToCheckFor;\r
\r
- if (key == Ids::vstLegacyPath)\r
- {\r
- fileToCheckFor = "pluginterfaces/vst2.x/aeffect.h";\r
- }\r
if (key == Ids::vst3Path)\r
{\r
fileToCheckFor = "base/source/baseiids.cpp";\r
fileToCheckFor = "../clion.sh";\r
#endif\r
}\r
- else if (key == Ids::androidStudioExePath)\r
- {\r
- #if JUCE_MAC\r
- fileToCheckFor = "Android Studio.app";\r
- #elif JUCE_WINDOWS\r
- fileToCheckFor = "studio64.exe";\r
- #endif\r
- }\r
else if (key == Ids::jucePath)\r
{\r
fileToCheckFor = "ChangeList.txt";\r
\r
return doesSDKPathContainFile (relativeTo, path, fileToCheckFor);\r
}\r
-\r
-void StoredSettings::checkJUCEPaths()\r
-{\r
- auto moduleFolder = getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString();\r
- auto juceFolder = getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
-\r
- auto validModuleFolder = isGlobalPathValid ({}, Ids::defaultJuceModulePath, moduleFolder);\r
- auto validJuceFolder = isGlobalPathValid ({}, Ids::jucePath, juceFolder);\r
-\r
- if (validModuleFolder && ! validJuceFolder)\r
- projectDefaults.getPropertyAsValue (Ids::jucePath, nullptr) = File (moduleFolder).getParentDirectory().getFullPathName();\r
- else if (! validModuleFolder && validJuceFolder)\r
- projectDefaults.getPropertyAsValue (Ids::defaultJuceModulePath, nullptr) = File (juceFolder).getChildFile ("modules").getFullPathName();\r
-}\r
-\r
-bool StoredSettings::shouldAskUserToSetJUCEPath() noexcept\r
-{\r
- if (! isGlobalPathValid ({}, Ids::jucePath, getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString())\r
- && getGlobalProperties().getValue ("dontAskAboutJUCEPath", {}).isEmpty())\r
- return true;\r
-\r
- return false;\r
-}\r
-\r
-void StoredSettings::setDontAskAboutJUCEPathAgain() noexcept\r
-{\r
- getGlobalProperties().setValue ("dontAskAboutJUCEPath", 1);\r
-}\r
-\r
-static String getFallbackPathForOS (const Identifier& key, DependencyPathOS os)\r
-{\r
- if (key == Ids::jucePath)\r
- {\r
- return (os == TargetOS::windows ? "C:\\JUCE" : "~/JUCE");\r
- }\r
- else if (key == Ids::defaultJuceModulePath)\r
- {\r
- return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "~/JUCE/modules");\r
- }\r
- else if (key == Ids::defaultUserModulePath)\r
- {\r
- return (os == TargetOS::windows ? "C:\\modules" : "~/modules");\r
- }\r
- else if (key == Ids::vstLegacyPath || key == Ids::vst3Path)\r
- {\r
- return {};\r
- }\r
- else if (key == Ids::rtasPath)\r
- {\r
- if (os == TargetOS::windows) return "C:\\SDKs\\PT_90_SDK";\r
- else if (os == TargetOS::osx) return "~/SDKs/PT_90_SDK";\r
- else return {}; // no RTAS on this OS!\r
- }\r
- else if (key == Ids::aaxPath)\r
- {\r
- if (os == TargetOS::windows) return "C:\\SDKs\\AAX";\r
- else if (os == TargetOS::osx) return "~/SDKs/AAX";\r
- else return {}; // no AAX on this OS!\r
- }\r
- else if (key == Ids::androidSDKPath)\r
- {\r
- return "${user.home}/Library/Android/sdk";\r
- }\r
- else if (key == Ids::androidNDKPath)\r
- {\r
- return "${user.home}/Library/Android/sdk/ndk-bundle";\r
- }\r
- else if (key == Ids::clionExePath)\r
- {\r
- if (os == TargetOS::windows)\r
- {\r
- #if JUCE_WINDOWS\r
- auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {});\r
- auto openCmd = StringArray::fromTokens (regValue, true);\r
-\r
- if (! openCmd.isEmpty())\r
- return openCmd[0].unquoted();\r
- #endif\r
-\r
- return "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe";\r
- }\r
- else if (os == TargetOS::osx)\r
- {\r
- return "/Applications/CLion.app";\r
- }\r
- else\r
- {\r
- return "${user.home}/clion/bin/clion.sh";\r
- }\r
- }\r
- else if (key == Ids::androidStudioExePath)\r
- {\r
- if (os == TargetOS::windows)\r
- {\r
- #if JUCE_WINDOWS\r
- auto path = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio\\Path", {}, {});\r
-\r
- if (! path.isEmpty())\r
- return path.unquoted() + "\\bin\\studio64.exe";\r
- #endif\r
-\r
- return "C:\\Program Files\\Android\\Android Studio\\bin\\studio64.exe";\r
- }\r
- else if (os == TargetOS::osx)\r
- {\r
- return "/Applications/Android Studio.app";\r
- }\r
- else\r
- {\r
- return {}; // no Android Studio on this OS!\r
- }\r
- }\r
-\r
- // unknown key!\r
- jassertfalse;\r
- return {};\r
-}\r
-\r
-static Identifier identifierForOS (DependencyPathOS os) noexcept\r
-{\r
- if (os == TargetOS::osx) return Ids::osxFallback;\r
- else if (os == TargetOS::windows) return Ids::windowsFallback;\r
- else if (os == TargetOS::linux) return Ids::linuxFallback;\r
-\r
- jassertfalse;\r
- return {};\r
-}\r
-\r
-ValueWithDefault StoredSettings::getStoredPath (const Identifier& key, DependencyPathOS os)\r
-{\r
- auto tree = (os == TargetOS::getThisOS() ? projectDefaults\r
- : fallbackPaths.getOrCreateChildWithName (identifierForOS (os), nullptr));\r
-\r
- return { tree, key, nullptr, getFallbackPathForOS (key, os) };\r
-}\r
void setSwatchColour (int index, const Colour& newColour) override;\r
};\r
\r
- //==============================================================================\r
- ValueWithDefault getStoredPath (const Identifier& key, DependencyPathOS os);\r
-\r
- bool shouldAskUserToSetJUCEPath() noexcept;\r
- void setDontAskAboutJUCEPathAgain() noexcept;\r
-\r
//==============================================================================\r
AppearanceSettings appearance;\r
StringArray monospacedFontNames;\r
File lastWizardFolder;\r
\r
-private:\r
//==============================================================================\r
+ Value getStoredPath (const Identifier& key);\r
+ Value getFallbackPathForOS (const Identifier& key, DependencyPathOS);\r
+\r
+ bool isGlobalPathValid (const File& relativeTo, const Identifier& key, const String& path) const noexcept;\r
+\r
+ //==============================================================================\r
+ bool shouldAskUserToSetJUCEPath() noexcept;\r
+ void setDontAskAboutJUCEPathAgain() noexcept;\r
+\r
+private:\r
+ OwnedArray<PropertiesFile> propertyFiles;\r
+ ValueTree projectDefaults;\r
+ ValueTree fallbackPaths;\r
+\r
+ void changed (bool isProjectDefaults)\r
+ {\r
+ std::unique_ptr<XmlElement> data (isProjectDefaults ? projectDefaults.createXml()\r
+ : fallbackPaths.createXml());\r
+\r
+ propertyFiles.getUnchecked (0)->setValue (isProjectDefaults ? "PROJECT_DEFAULT_SETTINGS"\r
+ : "FALLBACK_PATHS",\r
+ data.get());\r
+ }\r
+\r
void updateGlobalPreferences();\r
void updateRecentFiles();\r
void updateLastWizardFolder();\r
void checkJUCEPaths();\r
\r
//==============================================================================\r
- void changed (bool);\r
-\r
void valueTreePropertyChanged (ValueTree& vt, const Identifier&) override { changed (vt == projectDefaults); }\r
void valueTreeChildAdded (ValueTree& vt, ValueTree&) override { changed (vt == projectDefaults); }\r
void valueTreeChildRemoved (ValueTree& vt, ValueTree&, int) override { changed (vt == projectDefaults); }\r
void valueTreeChildOrderChanged (ValueTree& vt, int, int) override { changed (vt == projectDefaults); }\r
void valueTreeParentChanged (ValueTree& vt) override { changed (vt == projectDefaults); }\r
\r
- //==============================================================================\r
- OwnedArray<PropertiesFile> propertyFiles;\r
- ValueTree projectDefaults;\r
- ValueTree fallbackPaths;\r
-\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StoredSettings)\r
};\r
\r
words.addTokens (s.retainCharacters (allowedChars), false);\r
words.trim();\r
\r
- auto n = words[0];\r
+ String n (words[0]);\r
\r
if (capitalise)\r
n = n.toLowerCase();\r
{\r
for (int i = 0; i < lines.size(); ++i)\r
{\r
- auto& line = lines.getReference (i);\r
+ String& line = lines.getReference (i);\r
\r
if (line.length() > maxLineLength)\r
{\r
#define COL(col) #col,\r
#include "jucer_Colours.h"\r
#undef COL\r
- nullptr\r
+ 0\r
};\r
\r
for (int i = 0; i < numElementsInArray (colourNames) - 1; ++i)\r
{\r
const int maxCharsOnLine = 250;\r
\r
- auto data = (const unsigned char*) mb.getData();\r
+ const unsigned char* data = (const unsigned char*) mb.getData();\r
int charsOnLine = 0;\r
\r
bool canUseStringLiteral = mb.getSize() < 32768; // MS compilers can't handle big string literals..\r
\r
for (size_t i = 0; i < mb.getSize(); ++i)\r
{\r
- auto num = (unsigned int) data[i];\r
-\r
+ const unsigned int num = (unsigned int) data[i];\r
if (! ((num >= 32 && num < 127) || num == '\t' || num == '\r' || num == '\n'))\r
{\r
if (++numEscaped > mb.getSize() / 4)\r
\r
for (size_t i = 0; i < mb.getSize(); ++i)\r
{\r
- auto num = (int) (unsigned int) data[i];\r
+ const int num = (int) (unsigned int) data[i];\r
out << num << ',';\r
\r
charsOnLine += 2;\r
//==============================================================================\r
static unsigned int calculateHash (const String& s, const unsigned int hashMultiplier)\r
{\r
- auto t = s.toUTF8();\r
+ const char* t = s.toUTF8();\r
unsigned int hash = 0;\r
-\r
while (*t != 0)\r
hash = hashMultiplier * hash + (unsigned int) *t++;\r
\r
\r
for (;;)\r
{\r
- SortedSet<unsigned int> hashes;\r
+ SortedSet <unsigned int> hashes;\r
bool collision = false;\r
-\r
for (int i = strings.size(); --i >= 0;)\r
{\r
- auto hash = calculateHash (strings[i], v);\r
-\r
+ const unsigned int hash = calculateHash (strings[i], v);\r
if (hashes.contains (hash))\r
{\r
collision = true;\r
const StringArray& strings, const StringArray& codeToExecute, const int indentLevel)\r
{\r
jassert (strings.size() == codeToExecute.size());\r
- auto indent = String::repeatedString (" ", indentLevel);\r
- auto hashMultiplier = findBestHashMultiplier (strings);\r
+ const String indent (String::repeatedString (" ", indentLevel));\r
+ const unsigned int hashMultiplier = findBestHashMultiplier (strings);\r
\r
out << indent << "unsigned int hash = 0;" << newLine\r
- << newLine\r
- << indent << "if (" << utf8PointerVariable << " != nullptr)" << newLine\r
+ << indent << "if (" << utf8PointerVariable << " != 0)" << newLine\r
<< indent << " while (*" << utf8PointerVariable << " != 0)" << newLine\r
<< indent << " hash = " << (int) hashMultiplier << " * hash + (unsigned int) *" << utf8PointerVariable << "++;" << newLine\r
<< newLine\r
{\r
pos = pos.movedByLines (-1);\r
\r
- auto line = pos.getLineText();\r
- auto trimmedLine = line.trimStart();\r
+ const String line (pos.getLineText());\r
+ const String trimmedLine (line.trimStart());\r
\r
braceCount += getBraceCount (trimmedLine.getCharPointer());\r
\r
//==============================================================================\r
namespace FileHelpers\r
{\r
- static uint64 calculateMemoryHashCode (const void* data, size_t numBytes)\r
+ static int64 calculateMemoryHashCode (const void* data, const size_t numBytes)\r
{\r
- uint64 t = 0;\r
+ int64 t = 0;\r
\r
for (size_t i = 0; i < numBytes; ++i)\r
t = t * 65599 + static_cast<const uint8*> (data)[i];\r
return t;\r
}\r
\r
- uint64 calculateStreamHashCode (InputStream& in)\r
+ int64 calculateStreamHashCode (InputStream& in)\r
{\r
- uint64 t = 0;\r
+ int64 t = 0;\r
\r
const int bufferSize = 4096;\r
HeapBlock<uint8> buffer;\r
\r
for (;;)\r
{\r
- auto num = in.read (buffer, bufferSize);\r
+ const int num = in.read (buffer, bufferSize);\r
\r
if (num <= 0)\r
break;\r
return t;\r
}\r
\r
- uint64 calculateFileHashCode (const File& file)\r
+ int64 calculateFileHashCode (const File& file)\r
{\r
std::unique_ptr<FileInputStream> stream (file.createInputStream());\r
return stream != nullptr ? calculateStreamHashCode (*stream) : 0;\r
//==============================================================================\r
namespace FileHelpers\r
{\r
- uint64 calculateStreamHashCode (InputStream&);\r
- uint64 calculateFileHashCode (const File&);\r
+ int64 calculateStreamHashCode (InputStream& stream);\r
+ int64 calculateFileHashCode (const File& file);\r
\r
bool overwriteFileWithNewDataIfDifferent (const File& file, const void* data, size_t numBytes);\r
bool overwriteFileWithNewDataIfDifferent (const File& file, const MemoryOutputStream& newData);\r
private:\r
File file;\r
Time fileModificationTime;\r
- uint64 fileHashCode = 0;\r
- int64 fileSize = -1;\r
+ int64 fileHashCode, fileSize;\r
};\r
\r
return directory.getChildFile ("Assets").getChildFile ("juce_icon.png").existsAsFile();\r
}\r
-\r
-//==============================================================================\r
-static var parseJUCEHeaderMetadata (const StringArray& lines)\r
-{\r
- auto* o = new DynamicObject();\r
- var result (o);\r
-\r
- for (auto& line : lines)\r
- {\r
- line = trimCommentCharsFromStartOfLine (line);\r
-\r
- auto colon = line.indexOfChar (':');\r
-\r
- if (colon >= 0)\r
- {\r
- auto key = line.substring (0, colon).trim();\r
- auto value = line.substring (colon + 1).trim();\r
-\r
- o->setProperty (key, value);\r
- }\r
- }\r
-\r
- return result;\r
-}\r
-\r
-static String parseMetadataItem (const StringArray& lines, int& index)\r
-{\r
- String result = lines[index++];\r
-\r
- while (index < lines.size())\r
- {\r
- auto continuationLine = trimCommentCharsFromStartOfLine (lines[index]);\r
-\r
- if (continuationLine.isEmpty() || continuationLine.indexOfChar (':') != -1\r
- || continuationLine.startsWith ("END_JUCE_"))\r
- break;\r
-\r
- result += " " + continuationLine;\r
- ++index;\r
- }\r
-\r
- return result;\r
-}\r
-\r
-var parseJUCEHeaderMetadata (const File& file)\r
-{\r
- StringArray lines;\r
- file.readLines (lines);\r
-\r
- for (int i = 0; i < lines.size(); ++i)\r
- {\r
- auto trimmedLine = trimCommentCharsFromStartOfLine (lines[i]);\r
-\r
- if (trimmedLine.startsWith ("BEGIN_JUCE_"))\r
- {\r
- StringArray desc;\r
- auto j = i + 1;\r
-\r
- while (j < lines.size())\r
- {\r
- if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_"))\r
- return parseJUCEHeaderMetadata (desc);\r
-\r
- desc.add (parseMetadataItem (lines, j));\r
- }\r
- }\r
- }\r
-\r
- return {};\r
-}\r
const char* getPreferredLinefeed();\r
String joinLinesIntoSourceFile (StringArray& lines);\r
\r
-var parseJUCEHeaderMetadata (const File&);\r
-\r
String trimCommentCharsFromStartOfLine (const String& line);\r
\r
String hexString8Digits (int value);\r
DECLARE_ID (jucePath);\r
DECLARE_ID (defaultJuceModulePath);\r
DECLARE_ID (defaultUserModulePath);\r
- DECLARE_ID (vstLegacyFolder);\r
DECLARE_ID (vst3Folder);\r
DECLARE_ID (rtasFolder);\r
DECLARE_ID (auFolder);\r
- DECLARE_ID (vstLegacyPath);\r
DECLARE_ID (vst3Path);\r
DECLARE_ID (rtasPath);\r
DECLARE_ID (aaxPath);\r
DECLARE_ID (auBinaryLocation);\r
DECLARE_ID (rtasBinaryLocation);\r
DECLARE_ID (aaxBinaryLocation);\r
- DECLARE_ID (unityPluginBinaryLocation);\r
DECLARE_ID (enablePluginBinaryCopyStep);\r
DECLARE_ID (stripLocalSymbols);\r
DECLARE_ID (osxSDK);\r
DECLARE_ID (osxCompatibility);\r
DECLARE_ID (osxArchitecture);\r
DECLARE_ID (iosCompatibility);\r
- DECLARE_ID (xcodeSubprojects);\r
DECLARE_ID (extraFrameworks);\r
- DECLARE_ID (frameworkSearchPaths);\r
- DECLARE_ID (extraCustomFrameworks);\r
- DECLARE_ID (embeddedFrameworks);\r
DECLARE_ID (extraDLLs);\r
DECLARE_ID (winArchitecture);\r
DECLARE_ID (winWarningLevel);\r
DECLARE_ID (postbuildCommand);\r
DECLARE_ID (generateManifest);\r
DECLARE_ID (useRuntimeLibDLL);\r
- DECLARE_ID (multiProcessorCompilation);\r
DECLARE_ID (enableIncrementalLinking);\r
DECLARE_ID (bundleIdentifier);\r
DECLARE_ID (aaxIdentifier);\r
DECLARE_ID (androidSharedLibraries);\r
DECLARE_ID (androidScreenOrientation);\r
DECLARE_ID (androidExtraAssetsFolder);\r
- DECLARE_ID (androidStudioExePath);\r
DECLARE_ID (iosDeviceFamily);\r
const Identifier iPhoneScreenOrientation ("iosScreenOrientation"); // old name is confusing\r
DECLARE_ID (iPadScreenOrientation);\r
DECLARE_ID (buildRTAS);\r
DECLARE_ID (buildAAX);\r
DECLARE_ID (buildStandalone);\r
- DECLARE_ID (buildUnity);\r
DECLARE_ID (enableIAA);\r
DECLARE_ID (pluginName);\r
DECLARE_ID (pluginDesc);\r
DECLARE_ID (pluginVST3Category);\r
DECLARE_ID (pluginAUExportPrefix);\r
DECLARE_ID (pluginAUMainType);\r
- DECLARE_ID (pluginAUIsSandboxSafe);\r
DECLARE_ID (pluginRTASCategory);\r
DECLARE_ID (pluginRTASDisableBypass);\r
DECLARE_ID (pluginRTASDisableMultiMono);\r
scanFilesForTranslations (strings, project.getMainGroup());\r
\r
OwnedArray<LibraryModule> modules;\r
- project.getEnabledModules().createRequiredModules (modules);\r
+ project.getModules().createRequiredModules (modules);\r
\r
for (int j = 0; j < modules.size(); ++j)\r
{\r
#include "../../Application/jucer_Headers.h"\r
#include "../../ProjectSaving/jucer_ProjectExporter.h"\r
#include "jucer_PIPGenerator.h"\r
-#include "../../Project/jucer_Module.h"\r
\r
//==============================================================================\r
static String removeEnclosed (const String& input, const String& start, const String& end)\r
}\r
\r
//==============================================================================\r
-PIPGenerator::PIPGenerator (const File& pip, const File& output, const File& jucePath, const Array<File>& userPaths)\r
+PIPGenerator::PIPGenerator (const File& pip, const File& output)\r
: pipFile (pip),\r
- juceModulesPath (jucePath),\r
- userModulesPaths (userPaths),\r
- metadata (parseJUCEHeaderMetadata (pipFile))\r
+ metadata (parsePIPMetadata())\r
{\r
if (output != File())\r
{\r
\r
outputDirectory = outputDirectory.getChildFile (metadata[Ids::name].toString());\r
useLocalCopy = metadata[Ids::useLocalCopy].toString().isNotEmpty() || isClipboard;\r
-\r
- if (! userModulesPaths.isEmpty())\r
- {\r
- availableUserModules.reset (new AvailableModuleList());\r
- availableUserModules->scanPaths (userModulesPaths);\r
- }\r
}\r
\r
//==============================================================================\r
if (result != Result::ok())\r
return result;\r
\r
- addModules (root);\r
- addExporters (root);\r
- createFiles (root);\r
- setModuleFlags (root);\r
+ addModules (root);\r
+ addExporters (root);\r
+ createFiles (root);\r
+\r
+ if (! metadata[Ids::moduleFlags].toString().isEmpty())\r
+ setModuleFlags (root);\r
\r
auto outputFile = outputDirectory.getChildFile (metadata[Ids::name].toString() + ".jucer");\r
\r
\r
if (xml->writeToFile (outputFile, {}))\r
return Result::ok();\r
-\r
- return Result::fail ("Failed to create .jucer file in " + outputDirectory.getFullPathName());\r
+ else\r
+ return Result::fail ("Failed to create .jucer file in " + outputDirectory.getFullPathName()+ ".");\r
}\r
\r
-Result PIPGenerator::createMainCpp()\r
+bool PIPGenerator::createMainCpp()\r
{\r
auto outputFile = outputDirectory.getChildFile ("Source").getChildFile ("Main.cpp");\r
\r
if (! outputFile.existsAsFile() && (outputFile.create() != Result::ok()))\r
- return Result::fail ("Failed to create Main.cpp - " + outputFile.getFullPathName());\r
+ return false;\r
\r
outputFile.replaceWithText (getMainFileTextForType());\r
\r
- return Result::ok();\r
+ return true;\r
+}\r
+\r
+//==============================================================================\r
+var PIPGenerator::parsePIPMetadata (const StringArray& lines)\r
+{\r
+ auto* o = new DynamicObject();\r
+ var result (o);\r
+\r
+ for (auto& line : lines)\r
+ {\r
+ line = trimCommentCharsFromStartOfLine (line);\r
+\r
+ auto colon = line.indexOfChar (':');\r
+\r
+ if (colon >= 0)\r
+ {\r
+ auto key = line.substring (0, colon).trim();\r
+ auto value = line.substring (colon + 1).trim();\r
+\r
+ o->setProperty (key, value);\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+static String parseMetadataItem (const StringArray& lines, int& index)\r
+{\r
+ String result = lines[index++];\r
+\r
+ while (index < lines.size())\r
+ {\r
+ auto continuationLine = trimCommentCharsFromStartOfLine (lines[index]);\r
+\r
+ if (continuationLine.indexOfChar (':') != -1 || continuationLine.startsWith ("END_JUCE_PIP_METADATA"))\r
+ break;\r
+\r
+ result += continuationLine;\r
+ ++index;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+var PIPGenerator::parsePIPMetadata()\r
+{\r
+ StringArray lines;\r
+ pipFile.readLines (lines);\r
+\r
+ for (int i = 0; i < lines.size(); ++i)\r
+ {\r
+ auto trimmedLine = trimCommentCharsFromStartOfLine (lines[i]);\r
+\r
+ if (trimmedLine.startsWith ("BEGIN_JUCE_PIP_METADATA"))\r
+ {\r
+ StringArray desc;\r
+ auto j = i + 1;\r
+\r
+ while (j < lines.size())\r
+ {\r
+ if (trimCommentCharsFromStartOfLine (lines[j]).startsWith ("END_JUCE_PIP_METADATA"))\r
+ return parsePIPMetadata (desc);\r
+\r
+ desc.add (parseMetadataItem (lines, j));\r
+ }\r
+ }\r
+ }\r
+\r
+ return {};\r
}\r
\r
//==============================================================================\r
ValueTree modulePath (Ids::MODULEPATH);\r
\r
modulePath.setProperty (Ids::ID, moduleID, nullptr);\r
- modulePath.setProperty (Ids::path, getPathForModule (moduleID).getFullPathName(), nullptr);\r
+ modulePath.setProperty (Ids::path, {}, nullptr);\r
\r
return modulePath;\r
}\r
\r
if (isMobileExporter (exporterName) || (metadata[Ids::name] == "AUv3SynthPlugin" && exporterName == "XCODE_MAC"))\r
{\r
- auto juceDir = getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
+ auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
\r
- if (isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
+ if (juceDir.isNotEmpty() && isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
{\r
auto assetsDirectoryPath = File (juceDir).getChildFile ("examples").getChildFile ("Assets").getFullPathName();\r
\r
auto modules = StringArray::fromTokens (metadata[Ids::dependencies_].toString(), ",", {});\r
\r
for (auto m : modules)\r
- modulePaths.addChild (createModulePathChild (m.trim()), -1, nullptr);\r
+ {\r
+ m = m.trim();\r
+\r
+ if (isJUCEModule (m))\r
+ modulePaths.addChild (createModulePathChild (m), -1, nullptr);\r
+ }\r
\r
exporter.addChild (modulePaths, -1, nullptr);\r
}\r
module.setProperty (Ids::ID, moduleID, nullptr);\r
module.setProperty (Ids::showAllCode, 1, nullptr);\r
module.setProperty (Ids::useLocalCopy, 0, nullptr);\r
- module.setProperty (Ids::useGlobalPath, (getPathForModule (moduleID) == File() ? 1 : 0), nullptr);\r
+ module.setProperty (Ids::useGlobalPath, 1, nullptr);\r
\r
return module;\r
}\r
modules.mergeArray (getModulesRequiredForAudioProcessor());\r
\r
for (auto& m : modules)\r
- modulesTree.addChild (createModuleChild (m.trim()), -1, nullptr);\r
+ {\r
+ m = m.trim();\r
+\r
+ if (isJUCEModule (m))\r
+ modulesTree.addChild (createModuleChild (m), -1, nullptr);\r
+ }\r
\r
jucerTree.addChild (modulesTree, -1, nullptr);\r
}\r
\r
if (useLocalCopy && isJUCEExample (pipFile))\r
{\r
- auto juceDir = getAppSettings().getStoredPath (Ids::jucePath, TargetOS::getThisOS()).get().toString();\r
+ auto juceDir = getAppSettings().getStoredPath (Ids::jucePath).toString();\r
\r
- if (isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
+ if (juceDir.isNotEmpty() && isValidJUCEExamplesDirectory (File (juceDir).getChildFile ("examples")))\r
{\r
defines += ((defines.isEmpty() ? "" : " ") + String ("PIP_JUCE_EXAMPLES_DIRECTORY=")\r
+ Base64::toBase64 (File (juceDir).getChildFile ("examples").getFullPathName()));\r
{\r
jucerTree.setProperty (Ids::projectType, "audioplug", nullptr);\r
jucerTree.setProperty (Ids::pluginManufacturer, metadata[Ids::vendor], nullptr);\r
- jucerTree.setProperty (Ids::pluginAUIsSandboxSafe, "1", nullptr);\r
\r
- StringArray pluginFormatsToBuild (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString());\r
+ StringArray pluginFormatsToBuild (Ids::buildVST.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString());\r
pluginFormatsToBuild.addArray (getExtraPluginFormatsToBuild());\r
\r
jucerTree.setProperty (Ids::pluginFormats, pluginFormatsToBuild.joinIntoString (","), nullptr);\r
options.setProperty (name, (value == "1" ? 1 : 0), nullptr);\r
}\r
\r
- if (metadata[Ids::type].toString() == "AudioProcessor"\r
- && options.getPropertyPointer ("JUCE_VST3_CAN_REPLACE_VST2") == nullptr)\r
- options.setProperty ("JUCE_VST3_CAN_REPLACE_VST2", 0, nullptr);\r
-\r
jucerTree.addChild (options, -1, nullptr);\r
}\r
\r
\r
return {};\r
}\r
-\r
-File PIPGenerator::getPathForModule (const String& moduleID) const\r
-{\r
- if (isJUCEModule (moduleID))\r
- {\r
- if (juceModulesPath != File())\r
- return juceModulesPath;\r
- }\r
- else if (availableUserModules != nullptr)\r
- {\r
- return availableUserModules->getModuleWithID (moduleID).second.getParentDirectory();\r
- }\r
-\r
- return {};\r
-}\r
class PIPGenerator\r
{\r
public:\r
- PIPGenerator (const File& pipFile, const File& outputDirectory = {},\r
- const File& pathToJUCEModules = {}, const Array<File>& pathsToUserModules = {});\r
+ PIPGenerator (const File& pipFile, const File& outputDirectory = {});\r
\r
//==============================================================================\r
bool hasValidPIP() const noexcept { return ! metadata[Ids::name].toString().isEmpty(); }\r
\r
//==============================================================================\r
Result createJucerFile();\r
- Result createMainCpp();\r
+ bool createMainCpp();\r
\r
private:\r
+ //==============================================================================\r
+ var parsePIPMetadata (const StringArray& lines);\r
+ var parsePIPMetadata();\r
+\r
//==============================================================================\r
void addFileToTree (ValueTree& groupTree, const String& name, bool compile, const String& path);\r
void createFiles (ValueTree& jucerTree);\r
StringArray getExtraPluginFormatsToBuild() const;\r
StringArray getPluginCharacteristics() const;\r
\r
- File getPathForModule (const String&) const;\r
-\r
//==============================================================================\r
- File pipFile, outputDirectory, juceModulesPath;\r
-\r
- Array<File> userModulesPaths;\r
- std::unique_ptr<AvailableModuleList> availableUserModules;\r
-\r
+ File pipFile, outputDirectory;\r
var metadata;\r
\r
bool isTemp = false;\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2017 - ROLI Ltd.\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+ 27th April 2017).\r
+\r
+ End User License Agreement: www.juce.com/juce-5-licence\r
+ Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+#include "../../../Application/jucer_Headers.h"\r
+#include "jucer_DependencyPathPropertyComponent.h"\r
+\r
+//==============================================================================\r
+DependencyPathValueSource::DependencyPathValueSource (const Value& projectSettingsPath,\r
+ Identifier globalSettingsKey,\r
+ DependencyPathOS osThisSettingAppliesTo)\r
+ : projectSettingsValue (projectSettingsPath),\r
+ globalKey (globalSettingsKey),\r
+ os (osThisSettingAppliesTo),\r
+ globalSettingsValue (getAppSettings().getStoredPath (globalKey)),\r
+ fallbackValue (getAppSettings().getFallbackPathForOS (globalKey, os))\r
+{\r
+ globalSettingsValue.addListener (this);\r
+ fallbackValue.addListener (this);\r
+}\r
+\r
+bool DependencyPathValueSource::isValidPath (const File& relativeTo) const\r
+{\r
+ // if we are on another OS than the one which this path setting is for,\r
+ // we have no way of knowing whether the path is valid - so just assume it is:\r
+ if (! appliesToThisOS())\r
+ return true;\r
+\r
+ return getAppSettings().isGlobalPathValid (relativeTo, globalKey, getValue().toString());\r
+}\r
+\r
+bool DependencyPathValueSource::isValidPath() const\r
+{\r
+ return isValidPath (File::getCurrentWorkingDirectory());\r
+}\r
+\r
+//==============================================================================\r
+DependencyPathPropertyComponent::DependencyPathPropertyComponent (const File& pathRelativeToUse,\r
+ const Value& value,\r
+ const String& propertyName)\r
+try : TextPropertyComponent (propertyName, 1024, false),\r
+ pathRelativeTo (pathRelativeToUse),\r
+ pathValue (value),\r
+ pathValueSource (dynamic_cast<DependencyPathValueSource&> (pathValue.getValueSource()))\r
+{\r
+ bool initialValueIsEmpty = ! pathValueSource.isUsingProjectSettings();\r
+\r
+ getValue().referTo (pathValue);\r
+\r
+ // the following step is necessary because the above referTo() has internally called setValue(),\r
+ // which has set the project value to whatever is displayed in the label (this may be the\r
+ // global/fallback value). In this case we have to reset the project value to blank:\r
+ if (initialValueIsEmpty)\r
+ getValue().setValue (String());\r
+\r
+ getValue().addListener (this);\r
+\r
+ if (auto* label = dynamic_cast<Label*> (getChildComponent (0)))\r
+ label->onEditorShow = [this, label] { setEditorText (label); };\r
+ else\r
+ jassertfalse;\r
+\r
+ lookAndFeelChanged();\r
+}\r
+catch (const std::bad_cast&)\r
+{\r
+ // a DependencyPathPropertyComponent must be initialised with a Value\r
+ // that is referring to a DependencyPathValueSource!\r
+ jassertfalse;\r
+ throw;\r
+}\r
+\r
+void DependencyPathPropertyComponent::valueChanged (Value& value)\r
+{\r
+ // this callback handles the update of this setting in case\r
+ // the user changed the global preferences.\r
+ if (value.refersToSameSourceAs (pathValue) && pathValueSource.isUsingGlobalSettings())\r
+ textWasEdited();\r
+}\r
+\r
+void DependencyPathPropertyComponent::textWasEdited()\r
+{\r
+ setColour (textColourId, getTextColourToDisplay());\r
+ TextPropertyComponent::textWasEdited();\r
+}\r
+\r
+Colour DependencyPathPropertyComponent::getTextColourToDisplay() const\r
+{\r
+ if (! pathValueSource.isUsingProjectSettings())\r
+ return pathValueSource.isValidPath (pathRelativeTo) ? findColour (widgetTextColourId).withMultipliedAlpha (0.5f)\r
+ : Colours::red.withMultipliedAlpha (0.5f);\r
+\r
+ return pathValueSource.isValidPath (pathRelativeTo) ? findColour (widgetTextColourId)\r
+ : Colours::red;\r
+}\r
+\r
+void DependencyPathPropertyComponent::setEditorText (Label* label)\r
+{\r
+ if (! pathValueSource.isUsingProjectSettings())\r
+ if (auto editor = label->getCurrentTextEditor())\r
+ editor->setText (String(), dontSendNotification);\r
+}\r
+\r
+void DependencyPathPropertyComponent::lookAndFeelChanged()\r
+{\r
+ textWasEdited();\r
+}\r
+\r
+//==============================================================================\r
+DependencyFilePathPropertyComponent::DependencyFilePathPropertyComponent (Value& value,\r
+ const String& propertyDescription,\r
+ bool isDir,\r
+ const String& wc,\r
+ const File& rootToUseForRelativePaths)\r
+try : TextPropertyComponent (propertyDescription, 1024, false),\r
+ pathRelativeTo (rootToUseForRelativePaths),\r
+ pathValue (value),\r
+ pathValueSource (dynamic_cast<DependencyPathValueSource&> (pathValue.getValueSource())),\r
+ browseButton ("..."),\r
+ isDirectory (isDir),\r
+ wildcards (wc)\r
+{\r
+ auto initialValueIsEmpty = ! pathValueSource.isUsingProjectSettings();\r
+\r
+ getValue().referTo (pathValue);\r
+\r
+ if (initialValueIsEmpty)\r
+ getValue().setValue (String());\r
+\r
+ getValue().addListener (this);\r
+\r
+ if (auto* label = dynamic_cast<Label*> (getChildComponent (0)))\r
+ label->onEditorShow = [this, label] { setEditorText (label); };\r
+ else\r
+ jassertfalse;\r
+\r
+ setInterestedInFileDrag (false);\r
+\r
+ addAndMakeVisible (browseButton);\r
+ browseButton.onClick = [this] { browse(); };\r
+\r
+ lookAndFeelChanged();\r
+}\r
+catch (const std::bad_cast&)\r
+{\r
+ // a DependencyPathPropertyComponent must be initialised with a Value\r
+ // that is referring to a DependencyPathValueSource!\r
+ jassertfalse;\r
+ throw;\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::resized()\r
+{\r
+ auto bounds = getLookAndFeel().getPropertyComponentContentPosition (*this);\r
+\r
+ browseButton.setBounds (bounds.removeFromRight (30));\r
+ getChildComponent (0)->setBounds (bounds);\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::paintOverChildren (Graphics& g)\r
+{\r
+ if (highlightForDragAndDrop)\r
+ {\r
+ g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
+ g.fillRect (getChildComponent (0)->getBounds());\r
+ }\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::filesDropped (const StringArray& files, int, int)\r
+{\r
+ const File firstFile (files[0]);\r
+\r
+ if (isDirectory)\r
+ setTo (firstFile.isDirectory() ? firstFile\r
+ : firstFile.getParentDirectory());\r
+ else\r
+ setTo (firstFile);\r
+\r
+ highlightForDragAndDrop = false;\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::setTo (const File& f)\r
+{\r
+ pathValue = (pathRelativeTo == File()) ? f.getFullPathName()\r
+ : f.getRelativePathFrom (pathRelativeTo);\r
+\r
+ textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::enablementChanged()\r
+{\r
+ getValue().referTo (isEnabled() ? pathValue\r
+ : pathValueSource.appliesToThisOS() ? pathValueSource.getGlobalSettingsValue()\r
+ : pathValueSource.getFallbackSettingsValue());\r
+ textWasEdited();\r
+ repaint();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::textWasEdited()\r
+{\r
+ setColour (textColourId, getTextColourToDisplay());\r
+ TextPropertyComponent::textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::valueChanged (Value& value)\r
+{\r
+ if ((value.refersToSameSourceAs (pathValue) && pathValueSource.isUsingGlobalSettings())\r
+ || value.refersToSameSourceAs (pathValueSource.getGlobalSettingsValue()))\r
+ textWasEdited();\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::setEditorText (Label* label)\r
+{\r
+ if (! pathValueSource.isUsingProjectSettings())\r
+ if (auto editor = label->getCurrentTextEditor())\r
+ editor->setText (String(), dontSendNotification);\r
+}\r
+\r
+void DependencyFilePathPropertyComponent::browse()\r
+{\r
+ auto currentFile = pathRelativeTo.getChildFile (pathValue.toString());\r
+\r
+ if (isDirectory)\r
+ {\r
+ FileChooser chooser ("Select directory", currentFile);\r
+\r
+ if (chooser.browseForDirectory())\r
+ setTo (chooser.getResult());\r
+ }\r
+ else\r
+ {\r
+ FileChooser chooser ("Select file", currentFile, wildcards);\r
+\r
+ if (chooser.browseForFileToOpen())\r
+ setTo (chooser.getResult());\r
+ }\r
+}\r
+\r
+Colour DependencyFilePathPropertyComponent::getTextColourToDisplay() const\r
+{\r
+ auto alpha = 1.0f;\r
+ auto key = pathValueSource.getKey();\r
+ const auto& globalSettingsValue = pathValueSource.getGlobalSettingsValue();\r
+\r
+ if (! pathValueSource.isUsingProjectSettings() && isEnabled())\r
+ alpha = 0.5f;\r
+\r
+ if ((key == Ids::defaultUserModulePath && getValue().toString().contains (";")) || ! pathValueSource.appliesToThisOS())\r
+ return findColour (widgetTextColourId).withMultipliedAlpha (alpha);\r
+\r
+ auto usingGlobalPath = (getValue().refersToSameSourceAs (globalSettingsValue));\r
+\r
+ auto isValidPath = getAppSettings().isGlobalPathValid (pathRelativeTo, key,\r
+ (usingGlobalPath ? globalSettingsValue : pathValue).toString());\r
+\r
+ return isValidPath ? findColour (widgetTextColourId).withMultipliedAlpha (alpha)\r
+ : Colours::red.withMultipliedAlpha (alpha);\r
+}\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2017 - ROLI Ltd.\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+ 27th April 2017).\r
+\r
+ End User License Agreement: www.juce.com/juce-5-licence\r
+ Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+#pragma once\r
+\r
+\r
+//==============================================================================\r
+/** This ValueSource type implements the fallback logic required for dependency\r
+ path settings: use the project exporter value; if this is empty, fall back to\r
+ the global preference value; if the exporter is supposed to run on another\r
+ OS and we don't know what the global preferences on that other machine are,\r
+ fall back to a generic OS-specific fallback value.\r
+*/\r
+class DependencyPathValueSource : public Value::ValueSource,\r
+ private Value::Listener\r
+{\r
+public:\r
+ DependencyPathValueSource (const Value& projectSettingsPath,\r
+ Identifier globalSettingsKey,\r
+ DependencyPathOS osThisSettingAppliesTo);\r
+\r
+ /** This gets the currently used value, which may be either\r
+ the project setting, the global setting, or the fallback value. */\r
+ var getValue() const override\r
+ {\r
+ if (isUsingProjectSettings())\r
+ return projectSettingsValue.getValue();\r
+\r
+ if (isUsingGlobalSettings())\r
+ return globalSettingsValue.getValue();\r
+\r
+ return fallbackValue.getValue();\r
+ }\r
+\r
+ void setValue (const var& newValue) override\r
+ {\r
+ projectSettingsValue = newValue;\r
+\r
+ if (isUsingProjectSettings())\r
+ sendChangeMessage (false);\r
+ }\r
+\r
+ bool isUsingProjectSettings() const\r
+ {\r
+ return projectSettingsValueIsValid();\r
+ }\r
+\r
+ bool isUsingGlobalSettings() const\r
+ {\r
+ return ! projectSettingsValueIsValid() && globalSettingsValueIsValid();\r
+ }\r
+\r
+ bool isUsingFallbackValue() const\r
+ {\r
+ return ! projectSettingsValueIsValid() && ! globalSettingsValueIsValid();\r
+ }\r
+\r
+ bool appliesToThisOS() const\r
+ {\r
+ return os == TargetOS::getThisOS();\r
+ }\r
+\r
+ bool isValidPath (const File& relativeTo) const;\r
+\r
+ bool isValidPath() const;\r
+\r
+ Identifier getKey() { return globalKey; }\r
+\r
+ Value getGlobalSettingsValue() { return globalSettingsValue; }\r
+ Value getFallbackSettingsValue() { return fallbackValue; }\r
+\r
+private:\r
+ void valueChanged (Value& value) override\r
+ {\r
+ if ((value.refersToSameSourceAs (globalSettingsValue) && isUsingGlobalSettings())\r
+ || (value.refersToSameSourceAs (fallbackValue) && isUsingFallbackValue()))\r
+ {\r
+ sendChangeMessage (true);\r
+ setValue (String()); // make sure that the project-specific value is still blank\r
+ }\r
+ }\r
+\r
+ /** This defines when to use the project setting, and when to\r
+ consider it invalid and to fall back to the global setting or\r
+ the fallback value. */\r
+ bool projectSettingsValueIsValid() const\r
+ {\r
+ return ! projectSettingsValue.toString().isEmpty();\r
+ }\r
+\r
+ /** This defines when to use the global setting - given the project setting\r
+ is invalid, and when to fall back to the fallback value instead. */\r
+ bool globalSettingsValueIsValid() const\r
+ {\r
+ // only use the global settings if they are set on the same OS\r
+ // that this setting is for!\r
+ DependencyPathOS thisOS = TargetOS::getThisOS();\r
+\r
+ return thisOS == TargetOS::unknown ? false : os == thisOS;\r
+ }\r
+\r
+ /** the dependency path setting as set in this Projucer project. */\r
+ Value projectSettingsValue;\r
+\r
+ /** the global key used in the application settings for the global setting value.\r
+ needed for checking whether the path is valid. */\r
+ Identifier globalKey;\r
+\r
+ /** on what operating system should this dependency path be used?\r
+ note that this is *not* the os that is targeted by the project,\r
+ but rather the os on which the project will be compiled\r
+ (= on which the path settings need to be set correctly). */\r
+ DependencyPathOS os;\r
+\r
+ /** the dependency path global setting on this machine.\r
+ used when there value set for this project is invalid. */\r
+ Value globalSettingsValue;\r
+\r
+ /** the dependency path fallback setting. used instead of the global setting\r
+ whenever the latter doesn't apply, e.g. the setting is for another\r
+ OS than the ome this machine is running. */\r
+ Value fallbackValue;\r
+};\r
+\r
+\r
+//==============================================================================\r
+class DependencyPathPropertyComponent : public TextPropertyComponent,\r
+ private Value::Listener\r
+{\r
+public:\r
+ DependencyPathPropertyComponent (const File& pathRelativeToUse,\r
+ const Value& value,\r
+ const String& propertyName);\r
+\r
+\r
+private:\r
+ /** This function defines what colour the label text should assume\r
+ depending on the current state of the value the component tracks. */\r
+ Colour getTextColourToDisplay() const;\r
+\r
+ /** This function handles path changes because of user input. */\r
+ void textWasEdited() override;\r
+\r
+ /** This function handles path changes because the global path changed. */\r
+ void valueChanged (Value& value) override;\r
+\r
+ /** If the dependency path is relative, relative to which directory should\r
+ we check if an object is available. */\r
+ File pathRelativeTo;\r
+\r
+ /** the value that represents this dependency path setting. */\r
+ Value pathValue;\r
+\r
+ /** a reference to the value source that this value refers to. */\r
+ DependencyPathValueSource& pathValueSource;\r
+\r
+ void setEditorText (Label* label);\r
+\r
+ void lookAndFeelChanged() override;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DependencyPathPropertyComponent)\r
+};\r
+\r
+//==============================================================================\r
+class DependencyFilePathPropertyComponent : public TextPropertyComponent,\r
+ public FileDragAndDropTarget,\r
+ private Value::Listener\r
+{\r
+public:\r
+ DependencyFilePathPropertyComponent (Value& value,\r
+ const String& propertyDescription,\r
+ bool isDirectory,\r
+ const String& wildcards = "*",\r
+ const File& rootToUseForRelativePaths = File());\r
+\r
+ void resized() override;\r
+ void paintOverChildren (Graphics& g) override;\r
+\r
+ bool isInterestedInFileDrag (const StringArray&) override { return isEnabled(); }\r
+ void fileDragEnter (const StringArray&, int, int) override { highlightForDragAndDrop = true; repaint(); }\r
+ void fileDragExit (const StringArray&) override { highlightForDragAndDrop = false; repaint(); }\r
+ void filesDropped (const StringArray&, int, int) override;\r
+\r
+ void setTo (const File& f);\r
+\r
+ void enablementChanged() override;\r
+\r
+private:\r
+ void textWasEdited() override;\r
+\r
+ void valueChanged (Value&) override;\r
+\r
+ void setEditorText (Label* label);\r
+\r
+ void lookAndFeelChanged() override\r
+ {\r
+ browseButton.setColour (TextButton::buttonColourId,\r
+ findColour (secondaryButtonBackgroundColourId));\r
+ textWasEdited();\r
+ }\r
+\r
+ void browse();\r
+ Colour getTextColourToDisplay() const;\r
+\r
+ //==========================================================================\r
+ File pathRelativeTo;\r
+ Value pathValue;\r
+ DependencyPathValueSource& pathValueSource;\r
+\r
+ TextButton browseButton;\r
+ bool isDirectory, highlightForDragAndDrop = false;\r
+ String wildcards;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DependencyFilePathPropertyComponent)\r
+};\r
\r
\r
//==============================================================================\r
-/** A PropertyComponent for selecting files or folders.\r
-\r
- The user may drag files over the property box, enter the path manually and/or click\r
- the '...' button to open a file selection dialog box.\r
-*/\r
-class FilePathPropertyComponent : public PropertyComponent,\r
- public FileDragAndDropTarget,\r
- private Value::Listener\r
+class FilePathPropertyComponent : public PropertyComponent\r
{\r
public:\r
- FilePathPropertyComponent (Value valueToControl, const String& propertyName, bool isDir, bool thisOS = true,\r
- const String& wildcardsToUse = "*", const File& relativeRoot = File(), bool multiPath = false)\r
- : PropertyComponent (propertyName),\r
- text (valueToControl, propertyName, 1024, false),\r
- isDirectory (isDir), isThisOS (thisOS), supportsMultiplePaths (multiPath), wildcards (wildcardsToUse), root (relativeRoot)\r
+ /** A Property Component for selecting files or folders.\r
+\r
+ The user may drag files over the property box, enter the path\r
+ manually and/or click the '...' button to open a file selection\r
+ dialog box\r
+ */\r
+ FilePathPropertyComponent (Value valueToControl,\r
+ const String& propertyDescription,\r
+ bool isDirectory,\r
+ const String& wildcards = "*",\r
+ const File& rootToUseForRelativePaths = File(),\r
+ const bool supportsMultiplePaths = false)\r
+ : PropertyComponent (propertyDescription),\r
+ innerComp (valueToControl, isDirectory, wildcards, rootToUseForRelativePaths, supportsMultiplePaths)\r
{\r
- textValue.referTo (valueToControl);\r
-\r
- init();\r
- }\r
-\r
- /** Displays a default value when no value is specified by the user. */\r
- FilePathPropertyComponent (ValueWithDefault& valueToControl, const String& propertyName, bool isDir, bool thisOS = true,\r
- const String& wildcardsToUse = "*", const File& relativeRoot = File(), bool multiPath = false)\r
- : PropertyComponent (propertyName),\r
- text (valueToControl, propertyName, 1024, false),\r
- isDirectory (isDir), isThisOS (thisOS), supportsMultiplePaths (multiPath), wildcards (wildcardsToUse), root (relativeRoot)\r
- {\r
- textValue = valueToControl.getPropertyAsValue();\r
-\r
- init();\r
+ addAndMakeVisible (innerComp);\r
}\r
\r
- //==============================================================================\r
- void refresh() override {}\r
+ void refresh() override {} // N/A\r
\r
- void resized() override\r
- {\r
- auto bounds = getLocalBounds();\r
-\r
- text.setBounds (bounds.removeFromLeft (jmax (400, bounds.getWidth() - 55)));\r
- bounds.removeFromLeft (5);\r
- browseButton.setBounds (bounds);\r
- }\r
-\r
- void paintOverChildren (Graphics& g) override\r
+private:\r
+ struct InnerComponent : public Component,\r
+ public FileDragAndDropTarget\r
{\r
- if (highlightForDragAndDrop)\r
+ InnerComponent (Value v, bool isDir, const String& wc, const File& rt, const bool multiplePaths)\r
+ : value (v),\r
+ isDirectory (isDir),\r
+ highlightForDragAndDrop (false),\r
+ wildcards (wc),\r
+ root (rt),\r
+ button ("..."),\r
+ supportsMultiplePaths (multiplePaths)\r
{\r
- g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
- g.fillRect (getLookAndFeel().getPropertyComponentContentPosition (text));\r
- }\r
- }\r
+ addAndMakeVisible (textbox);\r
+ textbox.getTextValue().referTo (value);\r
+ textbox.onReturnKey = [this] { updateEditorColour (textbox); };\r
+ textbox.onFocusLost = [this] { updateEditorColour (textbox); };\r
\r
- //==============================================================================\r
- bool isInterestedInFileDrag (const StringArray&) override { return true; }\r
- void fileDragEnter (const StringArray&, int, int) override { highlightForDragAndDrop = true; repaint(); }\r
- void fileDragExit (const StringArray&) override { highlightForDragAndDrop = false; repaint(); }\r
+ addAndMakeVisible (button);\r
+ button.onClick = [this] { browse(); };\r
\r
- void filesDropped (const StringArray& selectedFiles, int, int) override\r
- {\r
- if (supportsMultiplePaths)\r
- {\r
- for (auto& f : selectedFiles)\r
- setTo (f);\r
+ lookAndFeelChanged();\r
}\r
- else\r
+\r
+ void paintOverChildren (Graphics& g) override\r
{\r
- setTo (selectedFiles[0]);\r
+ if (highlightForDragAndDrop)\r
+ {\r
+ g.setColour (findColour (defaultHighlightColourId).withAlpha (0.5f));\r
+ g.fillRect (textbox.getBounds());\r
+ }\r
}\r
\r
- highlightForDragAndDrop = false;\r
- repaint();\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- void init()\r
- {\r
- textValue.addListener (this);\r
-\r
- text.setInterestedInFileDrag (false);\r
- addAndMakeVisible (text);\r
-\r
- browseButton.onClick = [this] { browse(); };\r
- addAndMakeVisible (browseButton);\r
-\r
- lookAndFeelChanged();\r
- }\r
-\r
- void setTo (File f)\r
- {\r
- if (isDirectory && ! f.isDirectory())\r
- f = f.getParentDirectory();\r
+ void resized() override\r
+ {\r
+ juce::Rectangle<int> r (getLocalBounds());\r
\r
- auto pathName = (root == File()) ? f.getFullPathName()\r
- : f.getRelativePathFrom (root);\r
+ button.setBounds (r.removeFromRight (30));\r
+ textbox.setBounds (r);\r
+ }\r
\r
- auto currentPath = text.getText();\r
+ bool isInterestedInFileDrag (const StringArray&) override { return true; }\r
+ void fileDragEnter (const StringArray&, int, int) override { highlightForDragAndDrop = true; repaint(); }\r
+ void fileDragExit (const StringArray&) override { highlightForDragAndDrop = false; repaint(); }\r
\r
- if (supportsMultiplePaths && currentPath.isNotEmpty())\r
- pathName = currentPath.trimCharactersAtEnd (" ;") + "; " + pathName;\r
+ void filesDropped (const StringArray& files, int, int) override\r
+ {\r
+ const File firstFile (files[0]);\r
\r
- text.setText (pathName);\r
- updateEditorColour();\r
- }\r
+ if (isDirectory)\r
+ setTo (firstFile.isDirectory() ? firstFile\r
+ : firstFile.getParentDirectory());\r
+ else\r
+ setTo (firstFile);\r
\r
- void browse()\r
- {\r
- File currentFile = {};\r
-\r
- if (text.getText().isNotEmpty())\r
- currentFile = root.getChildFile (text.getText());\r
+ highlightForDragAndDrop = false;\r
+ repaint();\r
+ }\r
\r
- if (isDirectory)\r
+ void browse()\r
{\r
- FileChooser chooser ("Select directory", currentFile);\r
-\r
- if (chooser.browseForDirectory())\r
- setTo (chooser.getResult());\r
+ auto currentFile = root.getChildFile (value.toString());\r
+\r
+ if (isDirectory)\r
+ {\r
+ FileChooser chooser ("Select directory", currentFile);\r
+\r
+ if (chooser.browseForDirectory())\r
+ setTo (chooser.getResult());\r
+ }\r
+ else\r
+ {\r
+ FileChooser chooser ("Select file", currentFile, wildcards);\r
+\r
+ if (chooser.browseForFileToOpen())\r
+ setTo (chooser.getResult());\r
+ }\r
}\r
- else\r
- {\r
- FileChooser chooser ("Select file", currentFile, wildcards);\r
\r
- if (chooser.browseForFileToOpen())\r
- setTo (chooser.getResult());\r
+ void updateEditorColour (TextEditor& editor)\r
+ {\r
+ if (supportsMultiplePaths)\r
+ {\r
+ auto paths = StringArray::fromTokens (editor.getTextValue().toString(), ";", {});\r
+\r
+ editor.clear();\r
+\r
+ AttributedString str;\r
+ for (auto p : paths)\r
+ {\r
+ if (root.getChildFile (p.trim()).exists()) editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+ else editor.setColour (TextEditor::textColourId, Colours::red);\r
+\r
+ editor.insertTextAtCaret (p);\r
+\r
+ if (paths.indexOf (p) < paths.size() - 1)\r
+ {\r
+ editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+ editor.insertTextAtCaret (";");\r
+ }\r
+ }\r
+\r
+ editor.setColour (TextEditor::textColourId, findColour (widgetTextColourId));\r
+ }\r
+ else\r
+ {\r
+ auto pathToCheck = editor.getTextValue().toString();\r
+\r
+ //android SDK/NDK paths\r
+ if (pathToCheck.contains ("${user.home}"))\r
+ pathToCheck = pathToCheck.replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
+\r
+ #if JUCE_WINDOWS\r
+ if (pathToCheck.startsWith ("~"))\r
+ pathToCheck = pathToCheck.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
+ #endif\r
+\r
+ const auto currentFile = root.getChildFile (pathToCheck);\r
+\r
+ if (currentFile.exists())\r
+ editor.applyColourToAllText (findColour (widgetTextColourId));\r
+ else\r
+ editor.applyColourToAllText (Colours::red);\r
+ }\r
}\r
- }\r
\r
- void updateEditorColour()\r
- {\r
- if (supportsMultiplePaths || ! isThisOS)\r
- return;\r
-\r
- text.setColour (TextPropertyComponent::textColourId, findColour (widgetTextColourId));\r
-\r
- auto pathToCheck = text.getText();\r
-\r
- if (pathToCheck.isNotEmpty())\r
+ void setTo (const File& f)\r
{\r
- pathToCheck.replace ("${user.home}", "~");\r
+ auto pathName = (root == File()) ? f.getFullPathName()\r
+ : f.getRelativePathFrom (root);\r
\r
- #if JUCE_WINDOWS\r
- if (pathToCheck.startsWith ("~"))\r
- pathToCheck = pathToCheck.replace ("~", File::getSpecialLocation (File::userHomeDirectory).getFullPathName());\r
- #endif\r
+ if (supportsMultiplePaths && value.toString().isNotEmpty())\r
+ value = value.toString().trimCharactersAtEnd (" ;") + "; " + pathName;\r
+ else\r
+ value = pathName;\r
\r
- if (! root.getChildFile (pathToCheck).exists())\r
- text.setColour (TextPropertyComponent::textColourId, Colours::red);\r
+ updateEditorColour (textbox);\r
}\r
- }\r
-\r
- void valueChanged (Value&) override\r
- {\r
- updateEditorColour();\r
- }\r
\r
- void lookAndFeelChanged() override\r
- {\r
- browseButton.setColour (TextButton::buttonColourId, findColour (secondaryButtonBackgroundColourId));\r
- browseButton.setColour (TextButton::textColourOffId, Colours::white);\r
+ void lookAndFeelChanged() override\r
+ {\r
+ textbox.setColour (TextEditor::backgroundColourId, findColour (widgetBackgroundColourId));\r
+ textbox.setColour (TextEditor::outlineColourId, Colours::transparentBlack);\r
+ updateEditorColour (textbox);\r
\r
- updateEditorColour();\r
- }\r
+ button.setColour (TextButton::buttonColourId, findColour (secondaryButtonBackgroundColourId));\r
+ button.setColour (TextButton::textColourOffId, Colours::white);\r
+ }\r
\r
- //==============================================================================\r
- Value textValue;\r
+ Value value;\r
+ bool isDirectory, highlightForDragAndDrop;\r
+ String wildcards;\r
+ File root;\r
+ TextEditor textbox;\r
+ TextButton button;\r
+ bool supportsMultiplePaths;\r
\r
- TextPropertyComponent text;\r
- TextButton browseButton { "..." };\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerComponent)\r
+ };\r
\r
- bool isDirectory, isThisOS, supportsMultiplePaths, highlightForDragAndDrop = false;\r
- String wildcards;\r
- File root;\r
+ InnerComponent innerComp; // Used so that the PropertyComponent auto first-child positioning works\r
\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilePathPropertyComponent)\r
};\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-\r
-//==============================================================================\r
-class LabelPropertyComponent : public PropertyComponent\r
-{\r
-public:\r
- LabelPropertyComponent (const String& labelText, int propertyHeight = 25,\r
- Font labelFont = Font (16.0f, Font::bold),\r
- Justification labelJustification = Justification::centred)\r
- : PropertyComponent (labelText),\r
- labelToDisplay ({}, labelText)\r
- {\r
- setPreferredHeight (propertyHeight);\r
-\r
- labelToDisplay.setJustificationType (labelJustification);\r
- labelToDisplay.setFont (labelFont);\r
-\r
- addAndMakeVisible (labelToDisplay);\r
- setLookAndFeel (&lf);\r
- }\r
-\r
- ~LabelPropertyComponent() { setLookAndFeel (nullptr); }\r
-\r
- //==============================================================================\r
- void refresh() override {}\r
-\r
- void resized() override\r
- {\r
- labelToDisplay.setBounds (getLocalBounds());\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- struct LabelLookAndFeel : public ProjucerLookAndFeel\r
- {\r
- void drawPropertyComponentLabel (Graphics&, int, int, PropertyComponent&) {}\r
- };\r
-\r
- void lookAndFeelChanged() override\r
- {\r
- labelToDisplay.setColour (Label::textColourId, ProjucerApplication::getApp().lookAndFeel.findColour (defaultTextColourId));\r
- }\r
-\r
- //==============================================================================\r
- LabelLookAndFeel lf;\r
- Label labelToDisplay;\r
-};\r
const auto area = button.getActiveArea();\r
auto backgroundColour = findColour (button.isFrontTab() ? secondaryBackgroundColourId\r
: inactiveTabBackgroundColourId);\r
+ auto iconColour = findColour (button.isFrontTab() ? activeTabIconColourId\r
+ : inactiveTabIconColourId);\r
\r
g.setColour (backgroundColour);\r
g.fillRect (area);\r
const auto alpha = button.isEnabled() ? ((isMouseOver || isMouseDown) ? 1.0f : 0.8f) : 0.3f;\r
\r
#ifndef BUILDING_JUCE_COMPILEENGINE\r
- auto iconColour = findColour (button.isFrontTab() ? activeTabIconColourId\r
- : inactiveTabIconColourId);\r
-\r
if (button.getName() == "Project")\r
{\r
auto icon = Icon (getIcons().closedFolder, iconColour.withMultipliedAlpha (alpha));\r
if (! initialiseProject (*project))\r
return nullptr;\r
\r
- project->getConfigFlag ("JUCE_STRICT_REFCOUNTEDPOINTER") = true;\r
-\r
addExporters (*project, wc);\r
addDefaultModules (*project, useGlobalPath);\r
\r
\r
void addDefaultModules (Project& project, bool useGlobalPath)\r
{\r
- auto defaultModules = getDefaultModules();\r
+ StringArray mods (getDefaultModules());\r
\r
- AvailableModuleList list;\r
- list.scanPaths ({ modulesFolder });\r
+ ModuleList list;\r
+ list.addAllModulesInFolder (modulesFolder);\r
\r
- for (auto& mod : list.getAllModules())\r
- if (defaultModules.contains (mod.first))\r
- project.getEnabledModules().addModule (mod.second, false, useGlobalPath, false);\r
+ for (int i = 0; i < mods.size(); ++i)\r
+ if (const ModuleDescription* info = list.getModuleWithID (mods[i]))\r
+ project.getModules().addModule (info->moduleFolder, false, useGlobalPath, false);\r
}\r
\r
void addExporters (Project& project, WizardComp& wizardComp)\r
class ModulesFolderPathBox : public Component\r
{\r
public:\r
- ModulesFolderPathBox (String initialFileOrDirectory)\r
+ ModulesFolderPathBox (File initialFileOrDirectory)\r
: currentPathBox ("currentPathBox"),\r
openFolderButton (TRANS("...")),\r
modulesLabel (String(), TRANS("Modules Folder") + ":"),\r
useGlobalPathsToggle ("Use global module path")\r
{\r
- if (initialFileOrDirectory.isEmpty())\r
- initialFileOrDirectory = getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString();\r
+ if (initialFileOrDirectory == File())\r
+ initialFileOrDirectory = EnabledModuleList::findGlobalModulesFolder();\r
\r
setModulesFolder (initialFileOrDirectory);\r
\r
for (;;)\r
{\r
FileChooser fc ("Select your JUCE modules folder...",\r
- { getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString() },\r
+ EnabledModuleList::findGlobalModulesFolder(),\r
"*");\r
\r
if (! fc.browseForDirectory())\r
}\r
\r
File modulesFolder;\r
- bool isUsingGlobalPaths = true;\r
+ bool isUsingGlobalPaths;\r
\r
private:\r
ComboBox currentPathBox;\r
WizardComp()\r
: platformTargets(),\r
projectName (TRANS("Project name")),\r
- modulesPathBox (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString())\r
+ modulesPathBox (EnabledModuleList::findGlobalModulesFolder())\r
{\r
setOpaque (false);\r
\r
}\r
\r
\r
- wizard->modulesFolder = modulesPathBox.isUsingGlobalPaths ? File (getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).get().toString())\r
+ wizard->modulesFolder = modulesPathBox.isUsingGlobalPaths ? File (getAppSettings().getStoredPath (Ids::defaultJuceModulePath).toString())\r
: modulesPathBox.modulesFolder;\r
\r
if (! isJUCEModulesFolder (wizard->modulesFolder))\r
return;\r
\r
if (modulesPathBox.isUsingGlobalPaths)\r
- getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()).setValue (wizard->modulesFolder.getFullPathName(), nullptr);\r
+ getAppSettings().getStoredPath (Ids::defaultJuceModulePath).setValue (wizard->modulesFolder.getFullPathName());\r
}\r
\r
auto projectDir = fileBrowser.getSelectedFile (0);\r
sourceGroup.addFileAtIndex (editorCppFile, -1, true);\r
sourceGroup.addFileAtIndex (editorHFile, -1, false);\r
\r
- project.getConfigFlag ("JUCE_VST3_CAN_REPLACE_VST2") = 0;\r
-\r
return true;\r
}\r
\r
: DrawableButton (buttonName, buttonStyle)\r
{\r
// svg for thumbnail icon\r
- auto svg = parseXML (thumbSvg);\r
+ std::unique_ptr<XmlElement> svg (XmlDocument::parse (thumbSvg));\r
jassert (svg != nullptr);\r
+\r
thumb.reset (Drawable::createFromSVG (*svg));\r
\r
// svg for thumbnail background highlight\r
- auto backSvg = parseXML (BinaryData::wizard_Highlight_svg);\r
+ std::unique_ptr<XmlElement> backSvg (XmlDocument::parse (BinaryData::wizard_Highlight_svg));\r
jassert (backSvg != nullptr);\r
+\r
hoverBackground.reset (Drawable::createFromSVG (*backSvg));\r
\r
name = buttonName;\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_CONSOLEAPP := UnitTestRunner\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
TARGET_ARCH := -march=native\r
endif\r
\r
- JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
- JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0 -DJucePlugin_Build_Unity=0
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)\r
+ JUCE_CPPFLAGS_CONSOLEAPP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
JUCE_TARGET_CONSOLEAPP := UnitTestRunner\r
\r
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)\r
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS)\r
- JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) -L/usr/X11R6/lib/ $(shell pkg-config --libs alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0) -fvisibility=hidden -lGL -ldl -lpthread -lrt $(LDFLAGS)\r
\r
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)\r
endif\r
$(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o \\r
$(JUCE_OBJDIR)/include_juce_video_be78589.o \\r
\r
-.PHONY: clean all strip\r
+.PHONY: clean all\r
\r
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP)\r
\r
-$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
- @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
- @pkg-config --print-errors alsa freetype2 x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0 libcurl\r
+$(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : check-pkg-config $(OBJECTS_CONSOLEAPP) $(RESOURCES)\r
@echo Linking "UnitTestRunner - ConsoleApp"\r
-$(V_AT)mkdir -p $(JUCE_BINDIR)\r
-$(V_AT)mkdir -p $(JUCE_LIBDIR)\r
@echo "Compiling include_juce_video.cpp"\r
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<"\r
\r
+check-pkg-config:\r
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }\r
+ @pkg-config --print-errors alsa freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0\r
+\r
clean:\r
@echo Cleaning UnitTestRunner\r
$(V_AT)$(CLEANCMD)\r
};
objectVersion = 46;
objects = {
- 9E15F32DCE5118835FF71511 = {
- isa = PBXBuildFile;
- fileRef = 080EAB9CF5AB2BD6B2BBB173;
- };
- A70F7F4891DB1CF67653BE74 = {
- isa = PBXBuildFile;
- fileRef = B38A1AC42B002115350C0268;
- };
- 96EFF7BA261F57DD829324D8 = {
- isa = PBXBuildFile;
- fileRef = 7898C73DCA6FA9D9CF669D32;
- };
- 6EB1A3B818863EF1787A9CCE = {
- isa = PBXBuildFile;
- fileRef = 4B427AF10E722F9A362CEB73;
- };
- D82BA4D40F5686DAFF5E11FB = {
- isa = PBXBuildFile;
- fileRef = 99527F36B4484133087435CD;
- };
- 59004CE43AE081B4A6CE9E17 = {
- isa = PBXBuildFile;
- fileRef = 1932D54A7FAE13BADBA3E9B5;
- };
- AA207299991F85938465BF65 = {
- isa = PBXBuildFile;
- fileRef = 2030A589A9355FE6A0F72428;
- };
- 66FC7F44EEC9044E5C4A21C3 = {
- isa = PBXBuildFile;
- fileRef = C0531453A002C480280C5F05;
- };
- 0C1B9B95BC99382C313BEABC = {
- isa = PBXBuildFile;
- fileRef = 8ED5AB2E4E106FB97C033C5B;
- };
- 8D51903C59161885903F60CC = {
- isa = PBXBuildFile;
- fileRef = 04C1B8BF62AA09E62B362913;
- };
- 32010EA67EEFE024B9CE1CB5 = {
- isa = PBXBuildFile;
- fileRef = B4202EE1243A8FCA29996D05;
- };
- 263250D6F359CE403B0566FF = {
- isa = PBXBuildFile;
- fileRef = 8C449538B266A891147103D6;
- };
- 17A09B4AF453B148CD7349F4 = {
- isa = PBXBuildFile;
- fileRef = FCB76958E12B2D7F8277CD59;
- };
- 1A038A2954FB9A4F208BE3F2 = {
- isa = PBXBuildFile;
- fileRef = F260758DB97CF0F5C85218C1;
- };
- 4BC57B0D2215621D90C8881C = {
- isa = PBXBuildFile;
- fileRef = D2EBC6292AE5AFC46EB10DAC;
- };
- 5FE50792EDC7638DE9A824B5 = {
- isa = PBXBuildFile;
- fileRef = 5C7BDD8DF72F2FC2D44D757A;
- };
- D17BAE3D36BB94FC2C8E2438 = {
- isa = PBXBuildFile;
- fileRef = 88AA2B9840A6792BBAD559EE;
- };
- 0DA13944CF8AD7F862DF03E3 = {
- isa = PBXBuildFile;
- fileRef = 324682B2C8B9B4ACD9711A7A;
- };
- BFED026CA071070CEB87CFB5 = {
- isa = PBXBuildFile;
- fileRef = 4BD792956FE7C22CB8FB691D;
- };
- 33D24B475EA928745A87EDDB = {
- isa = PBXBuildFile;
- fileRef = 00CDB93410EA5AECBA5ADA95;
- };
- FDDF955477BE7FEBC364E19B = {
- isa = PBXBuildFile;
- fileRef = A76DD7182C290A9020C96CA7;
- };
- 74EC8AEC296DB2721EB438BF = {
- isa = PBXBuildFile;
- fileRef = 3A26A3568F2C301EEED25288;
- };
- 3822F598DA7044E5DB7633A9 = {
- isa = PBXBuildFile;
- fileRef = 846E187EC2E797B982861CA4;
- };
- 1DD34A677AE8AE533BF6DE53 = {
- isa = PBXBuildFile;
- fileRef = AFF0739E38CAEA8CA14FE733;
- };
- 9B48039CDFD679AD944BAC70 = {
- isa = PBXBuildFile;
- fileRef = AB19DDC8458D2A420E6D8AC3;
- };
- FC139F56BD13A2C78D21076E = {
- isa = PBXBuildFile;
- fileRef = 08ED235CBE02E0FB4BE4653E;
- };
- 5CB3596030B0DD3763CAF85C = {
- isa = PBXBuildFile;
- fileRef = 302A999B2803C0D5C15D237C;
- };
- FD15EF066F019B57F0601D71 = {
- isa = PBXBuildFile;
- fileRef = 4CA19EC18C2BC536B3636842;
- };
- A4C15593F5B4E1BE338F4F63 = {
- isa = PBXBuildFile;
- fileRef = 3D169C5EFBF6304F5CE4C35E;
- };
- A1A39E64F9E03EFFA10B0A10 = {
- isa = PBXBuildFile;
- fileRef = EECBAA403D2D6AEEA8CB05EB;
- };
- D43289CF624A7B068237C192 = {
- isa = PBXBuildFile;
- fileRef = 583EA0E5C4B75A629AEF1157;
- };
- AF1FE82A4A20DCB8944B35C7 = {
- isa = PBXBuildFile;
- fileRef = 4195CB317C364D778AE2ADB1;
- };
- 1D06F1A254F84A7AE3E90DF2 = {
- isa = PBXBuildFile;
- fileRef = 1CA82C74AEC08421812BDCAC;
- };
- 7164274FE42C7EC423455E05 = {
- isa = PBXBuildFile;
- fileRef = A59D9064C3A2D7EC3DC45420;
- };
- 1B09834E81EAF5BCB87FAAF4 = {
- isa = PBXBuildFile;
- fileRef = B96EC82EC3D2813B50386198;
- };
- FD00BAFFDB552AA3EB03B893 = {
- isa = PBXBuildFile;
- fileRef = 1088318C19CEB1861C58B3BA;
- };
- 00CDB93410EA5AECBA5ADA95 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_devices.mm";
- path = "../../JuceLibraryCode/include_juce_audio_devices.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 04C1B8BF62AA09E62B362913 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMIDI.framework;
- path = System/Library/Frameworks/CoreMIDI.framework;
- sourceTree = SDKROOT;
- };
- 05501801BF6C4A47598C59E2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_cryptography";
- path = "../../../../modules/juce_cryptography";
- sourceTree = "SOURCE_ROOT";
- };
- 080EAB9CF5AB2BD6B2BBB173 = {
- isa = PBXFileReference;
- explicitFileType = "compiled.mach-o.executable";
- includeInIndex = 0;
- path = UnitTestRunner;
- sourceTree = "BUILT_PRODUCTS_DIR";
- };
- 08ED235CBE02E0FB4BE4653E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_cryptography.mm";
- path = "../../JuceLibraryCode/include_juce_cryptography.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 1088318C19CEB1861C58B3BA = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_video.mm";
- path = "../../JuceLibraryCode/include_juce_video.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 1932D54A7FAE13BADBA3E9B5 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Carbon.framework;
- path = System/Library/Frameworks/Carbon.framework;
- sourceTree = SDKROOT;
- };
- 1CA82C74AEC08421812BDCAC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_opengl.mm";
- path = "../../JuceLibraryCode/include_juce_opengl.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 1DC921E6494548F5E73E1056 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_graphics";
- path = "../../../../modules/juce_graphics";
- sourceTree = "SOURCE_ROOT";
- };
- 2030A589A9355FE6A0F72428 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Cocoa.framework;
- path = System/Library/Frameworks/Cocoa.framework;
- sourceTree = SDKROOT;
- };
- 2A163F48282EEE95B8A8BA7A = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_extra";
- path = "../../../../modules/juce_gui_extra";
- sourceTree = "SOURCE_ROOT";
- };
- 2A889138F8B9285E95BDEEE6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_utils";
- path = "../../../../modules/juce_audio_utils";
- sourceTree = "SOURCE_ROOT";
- };
- 2C4310E5B49051FC40238E11 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = JuceHeader.h;
- path = ../../JuceLibraryCode/JuceHeader.h;
- sourceTree = "SOURCE_ROOT";
- };
- 302A999B2803C0D5C15D237C = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_data_structures.mm";
- path = "../../JuceLibraryCode/include_juce_data_structures.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 31323D62C5754F4248607F0B = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_basics";
- path = "../../../../modules/juce_audio_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 324682B2C8B9B4ACD9711A7A = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_analytics.cpp";
- path = "../../JuceLibraryCode/include_juce_analytics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- 39F1D4C0BF563E43EA8A98B2 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_devices";
- path = "../../../../modules/juce_audio_devices";
- sourceTree = "SOURCE_ROOT";
- };
- 3A26A3568F2C301EEED25288 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_processors.mm";
- path = "../../JuceLibraryCode/include_juce_audio_processors.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 3D169C5EFBF6304F5CE4C35E = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_events.mm";
- path = "../../JuceLibraryCode/include_juce_events.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 4195CB317C364D778AE2ADB1 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_extra.mm";
- path = "../../JuceLibraryCode/include_juce_gui_extra.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 4B427AF10E722F9A362CEB73 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVFoundation.framework;
- path = System/Library/Frameworks/AVFoundation.framework;
- sourceTree = SDKROOT;
- };
- 4BD792956FE7C22CB8FB691D = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_basics.mm";
- path = "../../JuceLibraryCode/include_juce_audio_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 4CA19EC18C2BC536B3636842 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_dsp.mm";
- path = "../../JuceLibraryCode/include_juce_dsp.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 583EA0E5C4B75A629AEF1157 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_gui_basics.mm";
- path = "../../JuceLibraryCode/include_juce_gui_basics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 5C7BDD8DF72F2FC2D44D757A = {
- isa = PBXFileReference;
- lastKnownFileType = file.nib;
- name = RecentFilesMenuTemplate.nib;
- path = RecentFilesMenuTemplate.nib;
- sourceTree = "SOURCE_ROOT";
- };
- 748F996DD2778AD1442AECA6 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_product_unlocking";
- path = "../../../../modules/juce_product_unlocking";
- sourceTree = "SOURCE_ROOT";
- };
- 7898C73DCA6FA9D9CF669D32 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AudioToolbox.framework;
- path = System/Library/Frameworks/AudioToolbox.framework;
- sourceTree = SDKROOT;
- };
- 7C4E4601FFB642386AD27B07 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_events";
- path = "../../../../modules/juce_events";
- sourceTree = "SOURCE_ROOT";
- };
- 8165CEA1A009721D3D05D98F = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_core";
- path = "../../../../modules/juce_core";
- sourceTree = "SOURCE_ROOT";
- };
- 846E187EC2E797B982861CA4 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_utils.mm";
- path = "../../JuceLibraryCode/include_juce_audio_utils.mm";
- sourceTree = "SOURCE_ROOT";
- };
- 88AA2B9840A6792BBAD559EE = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = Main.cpp;
- path = ../../Source/Main.cpp;
- sourceTree = "SOURCE_ROOT";
- };
- 8C449538B266A891147103D6 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = IOKit.framework;
- path = System/Library/Frameworks/IOKit.framework;
- sourceTree = SDKROOT;
- };
- 8EBA9CF0874619A8FA0B4E74 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_osc";
- path = "../../../../modules/juce_osc";
- sourceTree = "SOURCE_ROOT";
- };
- 8ED5AB2E4E106FB97C033C5B = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreMedia.framework;
- path = System/Library/Frameworks/CoreMedia.framework;
- sourceTree = SDKROOT;
- };
- 9514F6D920549F8A44B2E332 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_blocks_basics";
- path = "../../../../modules/juce_blocks_basics";
- sourceTree = "SOURCE_ROOT";
- };
- 99527F36B4484133087435CD = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = AVKit.framework;
- path = System/Library/Frameworks/AVKit.framework;
- sourceTree = SDKROOT;
- };
- A40A2A0B2841A622C53047CD = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_processors";
- path = "../../../../modules/juce_audio_processors";
- sourceTree = "SOURCE_ROOT";
- };
- A59D9064C3A2D7EC3DC45420 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_osc.cpp";
- path = "../../JuceLibraryCode/include_juce_osc.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- A76DD7182C290A9020C96CA7 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_audio_formats.mm";
- path = "../../JuceLibraryCode/include_juce_audio_formats.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AB19DDC8458D2A420E6D8AC3 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_core.mm";
- path = "../../JuceLibraryCode/include_juce_core.mm";
- sourceTree = "SOURCE_ROOT";
- };
- AFF0739E38CAEA8CA14FE733 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.cpp;
- name = "include_juce_blocks_basics.cpp";
- path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp";
- sourceTree = "SOURCE_ROOT";
- };
- B38A1AC42B002115350C0268 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = Accelerate.framework;
- path = System/Library/Frameworks/Accelerate.framework;
- sourceTree = SDKROOT;
- };
- B4202EE1243A8FCA29996D05 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = DiscRecording.framework;
- path = System/Library/Frameworks/DiscRecording.framework;
- sourceTree = SDKROOT;
- };
- B72A2BF24B6FFD414CD3B1CA = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_video";
- path = "../../../../modules/juce_video";
- sourceTree = "SOURCE_ROOT";
- };
- B96EC82EC3D2813B50386198 = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_product_unlocking.mm";
- path = "../../JuceLibraryCode/include_juce_product_unlocking.mm";
- sourceTree = "SOURCE_ROOT";
- };
- BDE2CEC1C2F9C0EA2FDEDEEC = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.c.h;
- name = AppConfig.h;
- path = ../../JuceLibraryCode/AppConfig.h;
- sourceTree = "SOURCE_ROOT";
- };
- C0531453A002C480280C5F05 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = CoreAudio.framework;
- path = System/Library/Frameworks/CoreAudio.framework;
- sourceTree = SDKROOT;
- };
- CC27F53A76BFB2675D2683A1 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_opengl";
- path = "../../../../modules/juce_opengl";
- sourceTree = "SOURCE_ROOT";
- };
- D2EBC6292AE5AFC46EB10DAC = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = WebKit.framework;
- path = System/Library/Frameworks/WebKit.framework;
- sourceTree = SDKROOT;
- };
- D3BE73543708D756BDB8AEF7 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_dsp";
- path = "../../../../modules/juce_dsp";
- sourceTree = "SOURCE_ROOT";
- };
- D6F54293A21405C783852645 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_audio_formats";
- path = "../../../../modules/juce_audio_formats";
- sourceTree = "SOURCE_ROOT";
- };
- D782494D4E433C87913F162D = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_analytics";
- path = "../../../../modules/juce_analytics";
- sourceTree = "SOURCE_ROOT";
- };
- D785E7E0304F3CC1E42A3ADF = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_data_structures";
- path = "../../../../modules/juce_data_structures";
- sourceTree = "SOURCE_ROOT";
- };
- DD849A04E38279B842EDE213 = {
- isa = PBXFileReference;
- lastKnownFileType = file;
- name = "juce_gui_basics";
- path = "../../../../modules/juce_gui_basics";
- sourceTree = "SOURCE_ROOT";
- };
- EECBAA403D2D6AEEA8CB05EB = {
- isa = PBXFileReference;
- lastKnownFileType = sourcecode.cpp.objcpp;
- name = "include_juce_graphics.mm";
- path = "../../JuceLibraryCode/include_juce_graphics.mm";
- sourceTree = "SOURCE_ROOT";
- };
- F260758DB97CF0F5C85218C1 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = QuartzCore.framework;
- path = System/Library/Frameworks/QuartzCore.framework;
- sourceTree = SDKROOT;
- };
- FCB76958E12B2D7F8277CD59 = {
- isa = PBXFileReference;
- lastKnownFileType = wrapper.framework;
- name = OpenGL.framework;
- path = System/Library/Frameworks/OpenGL.framework;
- sourceTree = SDKROOT;
- };
- 9E7E99EBD6772DAF4725435D = {
- isa = PBXGroup;
- children = (
- 88AA2B9840A6792BBAD559EE,
- );
- name = Source;
- sourceTree = "<group>";
- };
- 88C22F995571E4A515721154 = {
- isa = PBXGroup;
- children = (
- 9E7E99EBD6772DAF4725435D,
- );
- name = UnitTestRunner;
- sourceTree = "<group>";
- };
- FE614235C8CE15EFCEB61487 = {
- isa = PBXGroup;
- children = (
- D782494D4E433C87913F162D,
- 31323D62C5754F4248607F0B,
- 39F1D4C0BF563E43EA8A98B2,
- D6F54293A21405C783852645,
- A40A2A0B2841A622C53047CD,
- 2A889138F8B9285E95BDEEE6,
- 9514F6D920549F8A44B2E332,
- 8165CEA1A009721D3D05D98F,
- 05501801BF6C4A47598C59E2,
- D785E7E0304F3CC1E42A3ADF,
- D3BE73543708D756BDB8AEF7,
- 7C4E4601FFB642386AD27B07,
- 1DC921E6494548F5E73E1056,
- DD849A04E38279B842EDE213,
- 2A163F48282EEE95B8A8BA7A,
- CC27F53A76BFB2675D2683A1,
- 8EBA9CF0874619A8FA0B4E74,
- 748F996DD2778AD1442AECA6,
- B72A2BF24B6FFD414CD3B1CA,
- );
- name = "JUCE Modules";
- sourceTree = "<group>";
- };
- 3F7D4D52FAA229344338F40C = {
- isa = PBXGroup;
- children = (
- BDE2CEC1C2F9C0EA2FDEDEEC,
- 324682B2C8B9B4ACD9711A7A,
- 4BD792956FE7C22CB8FB691D,
- 00CDB93410EA5AECBA5ADA95,
- A76DD7182C290A9020C96CA7,
- 3A26A3568F2C301EEED25288,
- 846E187EC2E797B982861CA4,
- AFF0739E38CAEA8CA14FE733,
- AB19DDC8458D2A420E6D8AC3,
- 08ED235CBE02E0FB4BE4653E,
- 302A999B2803C0D5C15D237C,
- 4CA19EC18C2BC536B3636842,
- 3D169C5EFBF6304F5CE4C35E,
- EECBAA403D2D6AEEA8CB05EB,
- 583EA0E5C4B75A629AEF1157,
- 4195CB317C364D778AE2ADB1,
- 1CA82C74AEC08421812BDCAC,
- A59D9064C3A2D7EC3DC45420,
- B96EC82EC3D2813B50386198,
- 1088318C19CEB1861C58B3BA,
- 2C4310E5B49051FC40238E11,
- );
- name = "JUCE Library Code";
- sourceTree = "<group>";
- };
- F31A71A7A7566E4D44B2844C = {
- isa = PBXGroup;
- children = (
- 5C7BDD8DF72F2FC2D44D757A,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 2055BAFF80DBBC11CF2907C0 = {
- isa = PBXGroup;
- children = (
- B38A1AC42B002115350C0268,
- 7898C73DCA6FA9D9CF669D32,
- 4B427AF10E722F9A362CEB73,
- 99527F36B4484133087435CD,
- 1932D54A7FAE13BADBA3E9B5,
- 2030A589A9355FE6A0F72428,
- C0531453A002C480280C5F05,
- 8ED5AB2E4E106FB97C033C5B,
- 04C1B8BF62AA09E62B362913,
- B4202EE1243A8FCA29996D05,
- 8C449538B266A891147103D6,
- FCB76958E12B2D7F8277CD59,
- F260758DB97CF0F5C85218C1,
- D2EBC6292AE5AFC46EB10DAC,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 6D697538ADDCFBB6C79AC6C6 = {
- isa = PBXGroup;
- children = (
- 080EAB9CF5AB2BD6B2BBB173,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 99F3717D3FEAFDCA3C22E868 = {
- isa = PBXGroup;
- children = (
- 88C22F995571E4A515721154,
- FE614235C8CE15EFCEB61487,
- 3F7D4D52FAA229344338F40C,
- F31A71A7A7566E4D44B2844C,
- 2055BAFF80DBBC11CF2907C0,
- 6D697538ADDCFBB6C79AC6C6,
- );
- name = Source;
- sourceTree = "<group>";
- };
- A81C9C5D3696F83D5E8CFE11 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+
+ 9E15F32DCE5118835FF71511 = {isa = PBXBuildFile; fileRef = 080EAB9CF5AB2BD6B2BBB173; };
+ A70F7F4891DB1CF67653BE74 = {isa = PBXBuildFile; fileRef = B38A1AC42B002115350C0268; };
+ 96EFF7BA261F57DD829324D8 = {isa = PBXBuildFile; fileRef = 7898C73DCA6FA9D9CF669D32; };
+ 6EB1A3B818863EF1787A9CCE = {isa = PBXBuildFile; fileRef = 4B427AF10E722F9A362CEB73; };
+ D82BA4D40F5686DAFF5E11FB = {isa = PBXBuildFile; fileRef = 99527F36B4484133087435CD; };
+ 59004CE43AE081B4A6CE9E17 = {isa = PBXBuildFile; fileRef = 1932D54A7FAE13BADBA3E9B5; };
+ AA207299991F85938465BF65 = {isa = PBXBuildFile; fileRef = 2030A589A9355FE6A0F72428; };
+ 66FC7F44EEC9044E5C4A21C3 = {isa = PBXBuildFile; fileRef = C0531453A002C480280C5F05; };
+ 0C1B9B95BC99382C313BEABC = {isa = PBXBuildFile; fileRef = 8ED5AB2E4E106FB97C033C5B; };
+ 8D51903C59161885903F60CC = {isa = PBXBuildFile; fileRef = 04C1B8BF62AA09E62B362913; };
+ 32010EA67EEFE024B9CE1CB5 = {isa = PBXBuildFile; fileRef = B4202EE1243A8FCA29996D05; };
+ 263250D6F359CE403B0566FF = {isa = PBXBuildFile; fileRef = 8C449538B266A891147103D6; };
+ 17A09B4AF453B148CD7349F4 = {isa = PBXBuildFile; fileRef = FCB76958E12B2D7F8277CD59; };
+ 1A038A2954FB9A4F208BE3F2 = {isa = PBXBuildFile; fileRef = F260758DB97CF0F5C85218C1; };
+ 4BC57B0D2215621D90C8881C = {isa = PBXBuildFile; fileRef = D2EBC6292AE5AFC46EB10DAC; };
+ 5FE50792EDC7638DE9A824B5 = {isa = PBXBuildFile; fileRef = 5C7BDD8DF72F2FC2D44D757A; };
+ D17BAE3D36BB94FC2C8E2438 = {isa = PBXBuildFile; fileRef = 88AA2B9840A6792BBAD559EE; };
+ 0DA13944CF8AD7F862DF03E3 = {isa = PBXBuildFile; fileRef = 324682B2C8B9B4ACD9711A7A; };
+ BFED026CA071070CEB87CFB5 = {isa = PBXBuildFile; fileRef = 4BD792956FE7C22CB8FB691D; };
+ 33D24B475EA928745A87EDDB = {isa = PBXBuildFile; fileRef = 00CDB93410EA5AECBA5ADA95; };
+ FDDF955477BE7FEBC364E19B = {isa = PBXBuildFile; fileRef = A76DD7182C290A9020C96CA7; };
+ 74EC8AEC296DB2721EB438BF = {isa = PBXBuildFile; fileRef = 3A26A3568F2C301EEED25288; };
+ 3822F598DA7044E5DB7633A9 = {isa = PBXBuildFile; fileRef = 846E187EC2E797B982861CA4; };
+ 1DD34A677AE8AE533BF6DE53 = {isa = PBXBuildFile; fileRef = AFF0739E38CAEA8CA14FE733; };
+ 9B48039CDFD679AD944BAC70 = {isa = PBXBuildFile; fileRef = AB19DDC8458D2A420E6D8AC3; };
+ FC139F56BD13A2C78D21076E = {isa = PBXBuildFile; fileRef = 08ED235CBE02E0FB4BE4653E; };
+ 5CB3596030B0DD3763CAF85C = {isa = PBXBuildFile; fileRef = 302A999B2803C0D5C15D237C; };
+ FD15EF066F019B57F0601D71 = {isa = PBXBuildFile; fileRef = 4CA19EC18C2BC536B3636842; };
+ A4C15593F5B4E1BE338F4F63 = {isa = PBXBuildFile; fileRef = 3D169C5EFBF6304F5CE4C35E; };
+ A1A39E64F9E03EFFA10B0A10 = {isa = PBXBuildFile; fileRef = EECBAA403D2D6AEEA8CB05EB; };
+ D43289CF624A7B068237C192 = {isa = PBXBuildFile; fileRef = 583EA0E5C4B75A629AEF1157; };
+ AF1FE82A4A20DCB8944B35C7 = {isa = PBXBuildFile; fileRef = 4195CB317C364D778AE2ADB1; };
+ 1D06F1A254F84A7AE3E90DF2 = {isa = PBXBuildFile; fileRef = 1CA82C74AEC08421812BDCAC; };
+ 7164274FE42C7EC423455E05 = {isa = PBXBuildFile; fileRef = A59D9064C3A2D7EC3DC45420; };
+ 1B09834E81EAF5BCB87FAAF4 = {isa = PBXBuildFile; fileRef = B96EC82EC3D2813B50386198; };
+ FD00BAFFDB552AA3EB03B893 = {isa = PBXBuildFile; fileRef = 1088318C19CEB1861C58B3BA; };
+ 00CDB93410EA5AECBA5ADA95 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_devices.mm"; path = "../../JuceLibraryCode/include_juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
+ 04C1B8BF62AA09E62B362913 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+ 05501801BF6C4A47598C59E2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_cryptography"; path = "../../../../modules/juce_cryptography"; sourceTree = "SOURCE_ROOT"; };
+ 080EAB9CF5AB2BD6B2BBB173 = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UnitTestRunner; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 08ED235CBE02E0FB4BE4653E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_cryptography.mm"; path = "../../JuceLibraryCode/include_juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; };
+ 1088318C19CEB1861C58B3BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_video.mm"; path = "../../JuceLibraryCode/include_juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
+ 1932D54A7FAE13BADBA3E9B5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ 1CA82C74AEC08421812BDCAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_opengl.mm"; path = "../../JuceLibraryCode/include_juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; };
+ 1DC921E6494548F5E73E1056 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 2030A589A9355FE6A0F72428 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ 2A163F48282EEE95B8A8BA7A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_extra"; path = "../../../../modules/juce_gui_extra"; sourceTree = "SOURCE_ROOT"; };
+ 2A889138F8B9285E95BDEEE6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_utils"; path = "../../../../modules/juce_audio_utils"; sourceTree = "SOURCE_ROOT"; };
+ 2C4310E5B49051FC40238E11 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 302A999B2803C0D5C15D237C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ 31323D62C5754F4248607F0B = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_basics"; path = "../../../../modules/juce_audio_basics"; sourceTree = "SOURCE_ROOT"; };
+ 324682B2C8B9B4ACD9711A7A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 39F1D4C0BF563E43EA8A98B2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_devices"; path = "../../../../modules/juce_audio_devices"; sourceTree = "SOURCE_ROOT"; };
+ 3A26A3568F2C301EEED25288 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_processors.mm"; path = "../../JuceLibraryCode/include_juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
+ 3D169C5EFBF6304F5CE4C35E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ 4195CB317C364D778AE2ADB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
+ 4B427AF10E722F9A362CEB73 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+ 4BD792956FE7C22CB8FB691D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_basics.mm"; path = "../../JuceLibraryCode/include_juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 4CA19EC18C2BC536B3636842 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_dsp.mm"; path = "../../JuceLibraryCode/include_juce_dsp.mm"; sourceTree = "SOURCE_ROOT"; };
+ 583EA0E5C4B75A629AEF1157 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 5C7BDD8DF72F2FC2D44D757A = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 748F996DD2778AD1442AECA6 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_product_unlocking"; path = "../../../../modules/juce_product_unlocking"; sourceTree = "SOURCE_ROOT"; };
+ 7898C73DCA6FA9D9CF669D32 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ 7C4E4601FFB642386AD27B07 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 8165CEA1A009721D3D05D98F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 846E187EC2E797B982861CA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_utils.mm"; path = "../../JuceLibraryCode/include_juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; };
+ 88AA2B9840A6792BBAD559EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 8C449538B266A891147103D6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 8EBA9CF0874619A8FA0B4E74 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_osc"; path = "../../../../modules/juce_osc"; sourceTree = "SOURCE_ROOT"; };
+ 8ED5AB2E4E106FB97C033C5B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+ 9514F6D920549F8A44B2E332 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_blocks_basics"; path = "../../../../modules/juce_blocks_basics"; sourceTree = "SOURCE_ROOT"; };
+ 99527F36B4484133087435CD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
+ A40A2A0B2841A622C53047CD = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
+ A59D9064C3A2D7EC3DC45420 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_osc.cpp"; path = "../../JuceLibraryCode/include_juce_osc.cpp"; sourceTree = "SOURCE_ROOT"; };
+ A76DD7182C290A9020C96CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_audio_formats.mm"; path = "../../JuceLibraryCode/include_juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
+ AB19DDC8458D2A420E6D8AC3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ AFF0739E38CAEA8CA14FE733 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_blocks_basics.cpp"; path = "../../JuceLibraryCode/include_juce_blocks_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ B38A1AC42B002115350C0268 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ B4202EE1243A8FCA29996D05 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
+ B72A2BF24B6FFD414CD3B1CA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_video"; path = "../../../../modules/juce_video"; sourceTree = "SOURCE_ROOT"; };
+ B96EC82EC3D2813B50386198 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_product_unlocking.mm"; path = "../../JuceLibraryCode/include_juce_product_unlocking.mm"; sourceTree = "SOURCE_ROOT"; };
+ BDE2CEC1C2F9C0EA2FDEDEEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ C0531453A002C480280C5F05 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
+ CC27F53A76BFB2675D2683A1 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_opengl"; path = "../../../../modules/juce_opengl"; sourceTree = "SOURCE_ROOT"; };
+ D2EBC6292AE5AFC46EB10DAC = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+ D3BE73543708D756BDB8AEF7 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_dsp"; path = "../../../../modules/juce_dsp"; sourceTree = "SOURCE_ROOT"; };
+ D6F54293A21405C783852645 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_formats"; path = "../../../../modules/juce_audio_formats"; sourceTree = "SOURCE_ROOT"; };
+ D782494D4E433C87913F162D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ D785E7E0304F3CC1E42A3ADF = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ DD849A04E38279B842EDE213 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ EECBAA403D2D6AEEA8CB05EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ F260758DB97CF0F5C85218C1 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ FCB76958E12B2D7F8277CD59 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+ 9E7E99EBD6772DAF4725435D = {isa = PBXGroup; children = (
+ 88AA2B9840A6792BBAD559EE, ); name = Source; sourceTree = "<group>"; };
+ 88C22F995571E4A515721154 = {isa = PBXGroup; children = (
+ 9E7E99EBD6772DAF4725435D, ); name = UnitTestRunner; sourceTree = "<group>"; };
+ FE614235C8CE15EFCEB61487 = {isa = PBXGroup; children = (
+ D782494D4E433C87913F162D,
+ 31323D62C5754F4248607F0B,
+ 39F1D4C0BF563E43EA8A98B2,
+ D6F54293A21405C783852645,
+ A40A2A0B2841A622C53047CD,
+ 2A889138F8B9285E95BDEEE6,
+ 9514F6D920549F8A44B2E332,
+ 8165CEA1A009721D3D05D98F,
+ 05501801BF6C4A47598C59E2,
+ D785E7E0304F3CC1E42A3ADF,
+ D3BE73543708D756BDB8AEF7,
+ 7C4E4601FFB642386AD27B07,
+ 1DC921E6494548F5E73E1056,
+ DD849A04E38279B842EDE213,
+ 2A163F48282EEE95B8A8BA7A,
+ CC27F53A76BFB2675D2683A1,
+ 8EBA9CF0874619A8FA0B4E74,
+ 748F996DD2778AD1442AECA6,
+ B72A2BF24B6FFD414CD3B1CA, ); name = "JUCE Modules"; sourceTree = "<group>"; };
+ 3F7D4D52FAA229344338F40C = {isa = PBXGroup; children = (
+ BDE2CEC1C2F9C0EA2FDEDEEC,
+ 324682B2C8B9B4ACD9711A7A,
+ 4BD792956FE7C22CB8FB691D,
+ 00CDB93410EA5AECBA5ADA95,
+ A76DD7182C290A9020C96CA7,
+ 3A26A3568F2C301EEED25288,
+ 846E187EC2E797B982861CA4,
+ AFF0739E38CAEA8CA14FE733,
+ AB19DDC8458D2A420E6D8AC3,
+ 08ED235CBE02E0FB4BE4653E,
+ 302A999B2803C0D5C15D237C,
+ 4CA19EC18C2BC536B3636842,
+ 3D169C5EFBF6304F5CE4C35E,
+ EECBAA403D2D6AEEA8CB05EB,
+ 583EA0E5C4B75A629AEF1157,
+ 4195CB317C364D778AE2ADB1,
+ 1CA82C74AEC08421812BDCAC,
+ A59D9064C3A2D7EC3DC45420,
+ B96EC82EC3D2813B50386198,
+ 1088318C19CEB1861C58B3BA,
+ 2C4310E5B49051FC40238E11, ); name = "JUCE Library Code"; sourceTree = "<group>"; };
+ F31A71A7A7566E4D44B2844C = {isa = PBXGroup; children = (
+ 5C7BDD8DF72F2FC2D44D757A, ); name = Resources; sourceTree = "<group>"; };
+ 2055BAFF80DBBC11CF2907C0 = {isa = PBXGroup; children = (
+ B38A1AC42B002115350C0268,
+ 7898C73DCA6FA9D9CF669D32,
+ 4B427AF10E722F9A362CEB73,
+ 99527F36B4484133087435CD,
+ 1932D54A7FAE13BADBA3E9B5,
+ 2030A589A9355FE6A0F72428,
+ C0531453A002C480280C5F05,
+ 8ED5AB2E4E106FB97C033C5B,
+ 04C1B8BF62AA09E62B362913,
+ B4202EE1243A8FCA29996D05,
+ 8C449538B266A891147103D6,
+ FCB76958E12B2D7F8277CD59,
+ F260758DB97CF0F5C85218C1,
+ D2EBC6292AE5AFC46EB10DAC, ); name = Frameworks; sourceTree = "<group>"; };
+ 6D697538ADDCFBB6C79AC6C6 = {isa = PBXGroup; children = (
+ 080EAB9CF5AB2BD6B2BBB173, ); name = Products; sourceTree = "<group>"; };
+ 99F3717D3FEAFDCA3C22E868 = {isa = PBXGroup; children = (
+ 88C22F995571E4A515721154,
+ FE614235C8CE15EFCEB61487,
+ 3F7D4D52FAA229344338F40C,
+ F31A71A7A7566E4D44B2844C,
+ 2055BAFF80DBBC11CF2907C0,
+ 6D697538ADDCFBB6C79AC6C6, ); name = Source; sourceTree = "<group>"; };
+ A81C9C5D3696F83D5E8CFE11 = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INSTALL_PATH = "/usr/bin";
MACOSX_DEPLOYMENT_TARGET = 10.10;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.roli.UnitTestRunner;
- PRODUCT_NAME = "UnitTestRunner";
- USE_HEADERMAP = NO;
- };
- name = Debug;
- };
- 962CC7E0A536C3F56DBE1F8F = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 962CC7E0A536C3F56DBE1F8F = {isa = XCBuildConfiguration; buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_LINK_OBJC_RUNTIME = NO;
"JucePlugin_Build_AUv3=0",
"JucePlugin_Build_RTAS=0",
"JucePlugin_Build_AAX=0",
- "JucePlugin_Build_Standalone=0",
- "JucePlugin_Build_Unity=0",
- );
+ "JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- HEADER_SEARCH_PATHS = (
- "../../JuceLibraryCode",
- "../../../../modules",
- "$(inherited)",
- );
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
INSTALL_PATH = "/usr/bin";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.10;
- OTHER_CPLUSPLUSFLAGS = "-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code";
PRODUCT_BUNDLE_IDENTIFIER = com.roli.UnitTestRunner;
- PRODUCT_NAME = "UnitTestRunner";
- USE_HEADERMAP = NO;
- };
- name = Release;
- };
- 53146F81C8222491DC6DF2A5 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ 53146F81C8222491DC6DF2A5 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "UnitTestRunner";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Debug;
- };
- A5040BB0AC85722F6D54A948 = {
- isa = XCBuildConfiguration;
- buildSettings = {
+ ZERO_LINK = NO; }; name = Debug; };
+ A5040BB0AC85722F6D54A948 = {isa = XCBuildConfiguration; buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PRODUCT_NAME = "UnitTestRunner";
WARNING_CFLAGS = -Wreorder;
- ZERO_LINK = NO;
- };
- name = Release;
- };
- E65171E718EA0C7E237860FA = {
- isa = PBXTargetDependency;
- target = B0D62ED1051EE9DFD49F6321;
- };
- 18FC121B1014F7999CD135D3 = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 53146F81C8222491DC6DF2A5,
- A5040BB0AC85722F6D54A948,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- FCC937D27051A7D36CD9198E = {
- isa = XCConfigurationList;
- buildConfigurations = (
- A81C9C5D3696F83D5E8CFE11,
- 962CC7E0A536C3F56DBE1F8F,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- DD4C62A6EA1FD3497B42CDB0 = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5FE50792EDC7638DE9A824B5,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E8585DDC9F9A0EE2FB82FA52 = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D17BAE3D36BB94FC2C8E2438,
- 0DA13944CF8AD7F862DF03E3,
- BFED026CA071070CEB87CFB5,
- 33D24B475EA928745A87EDDB,
- FDDF955477BE7FEBC364E19B,
- 74EC8AEC296DB2721EB438BF,
- 3822F598DA7044E5DB7633A9,
- 1DD34A677AE8AE533BF6DE53,
- 9B48039CDFD679AD944BAC70,
- FC139F56BD13A2C78D21076E,
- 5CB3596030B0DD3763CAF85C,
- FD15EF066F019B57F0601D71,
- A4C15593F5B4E1BE338F4F63,
- A1A39E64F9E03EFFA10B0A10,
- D43289CF624A7B068237C192,
- AF1FE82A4A20DCB8944B35C7,
- 1D06F1A254F84A7AE3E90DF2,
- 7164274FE42C7EC423455E05,
- 1B09834E81EAF5BCB87FAAF4,
- FD00BAFFDB552AA3EB03B893,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 136E27FD16209F9868093A6C = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A70F7F4891DB1CF67653BE74,
- 96EFF7BA261F57DD829324D8,
- 6EB1A3B818863EF1787A9CCE,
- D82BA4D40F5686DAFF5E11FB,
- 59004CE43AE081B4A6CE9E17,
- AA207299991F85938465BF65,
- 66FC7F44EEC9044E5C4A21C3,
- 0C1B9B95BC99382C313BEABC,
- 8D51903C59161885903F60CC,
- 32010EA67EEFE024B9CE1CB5,
- 263250D6F359CE403B0566FF,
- 17A09B4AF453B148CD7349F4,
- 1A038A2954FB9A4F208BE3F2,
- 4BC57B0D2215621D90C8881C,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B0D62ED1051EE9DFD49F6321 = {
- isa = PBXNativeTarget;
- buildConfigurationList = FCC937D27051A7D36CD9198E;
- buildPhases = (
- DD4C62A6EA1FD3497B42CDB0,
- E8585DDC9F9A0EE2FB82FA52,
- 136E27FD16209F9868093A6C,
- );
- buildRules = ( );
- dependencies = ( );
- name = "UnitTestRunner - ConsoleApp";
- productName = UnitTestRunner;
- productReference = 080EAB9CF5AB2BD6B2BBB173;
- productType = "com.apple.product-type.tool";
- };
- E1E93F2B4B2D17E011395520 = {
- isa = PBXProject;
- buildConfigurationList = 18FC121B1014F7999CD135D3;
- attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; };
- compatibilityVersion = "Xcode 3.2";
- hasScannedForEncodings = 0;
- mainGroup = 99F3717D3FEAFDCA3C22E868;
- projectDirPath = "";
- projectRoot = "";
- targets = (B0D62ED1051EE9DFD49F6321);
- };
+ ZERO_LINK = NO; }; name = Release; };
+ E65171E718EA0C7E237860FA = {isa = PBXTargetDependency; target = B0D62ED1051EE9DFD49F6321; };
+ 18FC121B1014F7999CD135D3 = {isa = XCConfigurationList; buildConfigurations = (
+ 53146F81C8222491DC6DF2A5,
+ A5040BB0AC85722F6D54A948, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ FCC937D27051A7D36CD9198E = {isa = XCConfigurationList; buildConfigurations = (
+ A81C9C5D3696F83D5E8CFE11,
+ 962CC7E0A536C3F56DBE1F8F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ DD4C62A6EA1FD3497B42CDB0 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 5FE50792EDC7638DE9A824B5, ); runOnlyForDeploymentPostprocessing = 0; };
+ E8585DDC9F9A0EE2FB82FA52 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ D17BAE3D36BB94FC2C8E2438,
+ 0DA13944CF8AD7F862DF03E3,
+ BFED026CA071070CEB87CFB5,
+ 33D24B475EA928745A87EDDB,
+ FDDF955477BE7FEBC364E19B,
+ 74EC8AEC296DB2721EB438BF,
+ 3822F598DA7044E5DB7633A9,
+ 1DD34A677AE8AE533BF6DE53,
+ 9B48039CDFD679AD944BAC70,
+ FC139F56BD13A2C78D21076E,
+ 5CB3596030B0DD3763CAF85C,
+ FD15EF066F019B57F0601D71,
+ A4C15593F5B4E1BE338F4F63,
+ A1A39E64F9E03EFFA10B0A10,
+ D43289CF624A7B068237C192,
+ AF1FE82A4A20DCB8944B35C7,
+ 1D06F1A254F84A7AE3E90DF2,
+ 7164274FE42C7EC423455E05,
+ 1B09834E81EAF5BCB87FAAF4,
+ FD00BAFFDB552AA3EB03B893, ); runOnlyForDeploymentPostprocessing = 0; };
+ 136E27FD16209F9868093A6C = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ A70F7F4891DB1CF67653BE74,
+ 96EFF7BA261F57DD829324D8,
+ 6EB1A3B818863EF1787A9CCE,
+ D82BA4D40F5686DAFF5E11FB,
+ 59004CE43AE081B4A6CE9E17,
+ AA207299991F85938465BF65,
+ 66FC7F44EEC9044E5C4A21C3,
+ 0C1B9B95BC99382C313BEABC,
+ 8D51903C59161885903F60CC,
+ 32010EA67EEFE024B9CE1CB5,
+ 263250D6F359CE403B0566FF,
+ 17A09B4AF453B148CD7349F4,
+ 1A038A2954FB9A4F208BE3F2,
+ 4BC57B0D2215621D90C8881C, ); runOnlyForDeploymentPostprocessing = 0; };
+ B0D62ED1051EE9DFD49F6321 = {isa = PBXNativeTarget; buildConfigurationList = FCC937D27051A7D36CD9198E; buildPhases = (
+ DD4C62A6EA1FD3497B42CDB0,
+ E8585DDC9F9A0EE2FB82FA52,
+ 136E27FD16209F9868093A6C, ); buildRules = ( ); dependencies = ( ); name = "UnitTestRunner - ConsoleApp"; productName = UnitTestRunner; productReference = 080EAB9CF5AB2BD6B2BBB173; productType = "com.apple.product-type.tool"; };
+ E1E93F2B4B2D17E011395520 = {isa = PBXProject; buildConfigurationList = 18FC121B1014F7999CD135D3; attributes = { LastUpgradeCheck = 0930; ORGANIZATIONNAME = "ROLI Ltd."; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 99F3717D3FEAFDCA3C22E868; projectDirPath = ""; projectRoot = ""; targets = (B0D62ED1051EE9DFD49F6321); };
};
rootObject = E1E93F2B4B2D17E011395520;
}
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{8059D6DB-7FA3-D129-4ADE-B3C1A560027C}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.exe</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\ConsoleApp\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">UnitTestRunner</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<WarningLevel>Level4</WarningLevel>\r
<SuppressStartupBanner>true</SuppressStartupBanner>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <AdditionalOptions>/w44265 /w45038 /w44062 %(AdditionalOptions)</AdditionalOptions>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<LanguageStandard>stdcpp14</LanguageStandard>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ItemGroup>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\protocol\Protocol Format.txt"/>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\README.txt"/>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_blocks_basics\littlefoot\LittleFoot Language README.txt">\r
<Filter>JUCE Modules\juce_blocks_basics\littlefoot</Filter>\r
</None>\r
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define JUCE_STRICT_REFCOUNTEDPOINTER 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_dsp flags:\r
\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_USE_CAMERA\r
//#define JUCE_USE_CAMERA 0\r
#endif\r
-\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
namespace ProjectInfo\r
{\r
const char* const projectName = "UnitTestRunner";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
}\r
};\r
\r
-\r
//==============================================================================\r
-int main (int argc, char **argv)\r
+int main()\r
{\r
ConsoleLogger logger;\r
Logger::setCurrentLogger (&logger);\r
\r
ConsoleUnitTestRunner runner;\r
-\r
- ArgumentList args (argc, argv);\r
-\r
- if (args.size() == 0)\r
- {\r
- runner.runAllTests();\r
- }\r
- else\r
- {\r
- if (args.containsOption ("--help|-h"))\r
- {\r
- std::cout << argv[0] << " [--help|-h] [--category category] [--list-categories]" << std::endl;\r
- return 0;\r
- }\r
-\r
- if (args.containsOption ("--list-categories"))\r
- {\r
- for (auto& category : UnitTest::getAllCategories())\r
- std::cout << category << std::endl;\r
-\r
- return 0;\r
- }\r
-\r
- if (args.containsOption ("--category"))\r
- runner.runTestsInCategory (args.getArgumentAfterOption ("--category").text);\r
- }\r
+ runner.runAllTests();\r
\r
Logger::setCurrentLogger (nullptr);\r
\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="Z2Xzcp" name="UnitTestRunner" projectType="consoleapp" bundleIdentifier="com.roli.UnitTestRunner"\r
- jucerVersion="5.4.1" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0"\r
+ jucerVersion="5.3.1" defines="JUCE_UNIT_TESTS=1" displaySplashScreen="0"\r
reportAppUsage="0" companyName="ROLI Ltd." companyCopyright="ROLI Ltd.">\r
<MAINGROUP id="GZdWCU" name="UnitTestRunner">\r
<GROUP id="{22894462-E1A9-036F-ED94-B51A50C87552}" name="Source">\r
</GROUP>\r
</MAINGROUP>\r
<EXPORTFORMATS>\r
- <XCODE_MAC targetFolder="Builds/MacOSX" extraCompilerFlags="-Wall -Wno-missing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
+ <XCODE_MAC targetFolder="Builds/MacOSX" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wno-ignored-qualifiers -Wunreachable-code"\r
extraDefs="">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" osxCompatibility="10.10 SDK" isDebug="1" targetName="UnitTestRunner"\r
<MODULEPATH id="juce_analytics" path="../../modules"/>\r
</MODULEPATHS>\r
</LINUX_MAKE>\r
- <VS2017 targetFolder="Builds/VisualStudio2017" extraCompilerFlags="/w44265 /w45038 /w44062">\r
+ <VS2017 targetFolder="Builds/VisualStudio2017">\r
<CONFIGURATIONS>\r
<CONFIGURATION name="Debug" isDebug="1" targetName="UnitTestRunner" warningsAreErrors="1"/>\r
<CONFIGURATION name="Release" isDebug="0" targetName="UnitTestRunner" debugInformationFormat="None"\r
useGlobalPath="0"/>\r
<MODULES id="juce_video" showAllCode="1" useLocalCopy="0"/>\r
</MODULES>\r
- <JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+ <JUCEOPTIONS/>\r
<LIVE_SETTINGS>\r
<OSX enableCxx11="1"/>\r
</LIVE_SETTINGS>\r
</ItemGroup>\r
<PropertyGroup Label="Globals">\r
<ProjectGuid>{B636B53B-C44B-1E04-8668-D61B3900BAA4}</ProjectGuid>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"\r
Label="Configuration">\r
<UseOfMfc>false</UseOfMfc>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<PlatformToolset>v141</PlatformToolset>\r
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>\r
<ImportGroup Label="ExtensionSettings"/>\r
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"\r
Label="LocalAppDataPlatform"/>\r
</ImportGroup>\r
+ <PropertyGroup Label="UserMacros">\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
<PropertyGroup>\r
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
<TargetExt>.lib</TargetExt>\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\Static Library\</IntDir>\r
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">juce_dll</TargetName>\r
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+ <PlatformToolset>v141</PlatformToolset>\r
+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>\r
</PropertyGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<Midl>\r
<Optimization>Disabled</Optimization>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile>\r
<Optimization>Full</Optimization>\r
<AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DLL_BUILD=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
<RuntimeTypeInfo>true</RuntimeTypeInfo>\r
<PrecompiledHeader/>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
- <ExcludedFromBuild>true</ExcludedFromBuild>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
<ExcludedFromBuild>true</ExcludedFromBuild>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\effects\juce_CatmullRomInterpolator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioParameterInt.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorParameterWithID.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDBurner.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_utils\audio_cd\juce_AudioCDReader.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_Array.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ElementComparator.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_HashMap.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ByteOrder.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Memory.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_SharedResourcePointer.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_Singleton.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_RuntimePermissions.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_StdFunctionCompat.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_BasicNativeHeaders.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_mac_ClangBugWorkaround.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_core\network\juce_IPAddress.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_CallbackMessage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_opengl\juce_opengl.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
<ItemGroup>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt"/>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>\r
</ItemGroup>\r
<Filter Include="JUCE Modules\juce_audio_processors\format">\r
<UniqueIdentifier>{86737735-F6BA-F64A-5EC7-5C9F36755F79}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source">\r
- <UniqueIdentifier>{4DC60E78-BBC0-B540-63A2-37E14ABBEF09}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include">\r
- <UniqueIdentifier>{80C72173-A1E1-C3C5-9288-B889CE2EAFEA}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source">\r
- <UniqueIdentifier>{4138B955-AA0B-FA86-DBF9-404CAFFFA866}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread">\r
- <UniqueIdentifier>{2B4166B8-F470-F07C-4F51-D2DAAAECBB18}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base">\r
- <UniqueIdentifier>{9C295115-C0CD-3129-1C4D-FB53299B23FB}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base">\r
- <UniqueIdentifier>{65526A8B-3447-9DF0-FD5D-00D111126027}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui">\r
- <UniqueIdentifier>{A54A1F5C-F32F-F97B-9E8A-69922B770A54}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst">\r
- <UniqueIdentifier>{B90A44F3-B62D-B5C0-81A2-683D2650AEE6}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces">\r
- <UniqueIdentifier>{DAF30656-5915-0E45-C4E4-54439617D525}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common">\r
- <UniqueIdentifier>{9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting">\r
- <UniqueIdentifier>{9C713CBA-A9E2-5F4E-F83C-2CAB8533913C}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst">\r
- <UniqueIdentifier>{63571A07-9AA3-5BB0-1103-0B42A2E6BC9E}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source">\r
- <UniqueIdentifier>{314F43F2-BC8F-B464-EAE7-86B9675454E9}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk">\r
- <UniqueIdentifier>{874C5D0C-6D29-68EE-38BB-26200B56BC89}</UniqueIdentifier>\r
- </Filter>\r
- <Filter Include="JUCE Modules\juce_audio_processors\format_types\VST3_SDK">\r
- <UniqueIdentifier>{86BAA7A7-DC50-35B6-910B-932AEAF257F2}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_audio_processors\format_types">\r
<UniqueIdentifier>{6B7BE34D-1BC1-C7B9-111F-C55CA8250943}</UniqueIdentifier>\r
</Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\components">\r
<UniqueIdentifier>{E4EA47E5-B41C-2A19-1783-7E9104096ECD}</UniqueIdentifier>\r
</Filter>\r
- <Filter Include="JUCE Modules\juce_gui_basics\desktop">\r
- <UniqueIdentifier>{B331BC33-9770-3DB5-73F2-BC2469ECCF7F}</UniqueIdentifier>\r
- </Filter>\r
<Filter Include="JUCE Modules\juce_gui_basics\drawables">\r
<UniqueIdentifier>{46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC}</UniqueIdentifier>\r
</Filter>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.cpp">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.cpp">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\baseiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source\flock.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\coreiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstinitiids.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.cpp">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_AbstractFifo.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_NamedValueSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_OwnedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_PropertySet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_ReferenceCountedArray.cpp">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\containers\juce_SparseSet.cpp">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\memory\juce_MemoryBlock.cpp">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.cpp">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_core\misc\juce_Result.cpp">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.cpp">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.cpp">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.cpp">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClCompile>\r
- <ClCompile Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.cpp">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClCompile Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.cpp">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClCompile>\r
<ClCompile Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.cpp">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioProcessLoadMeasurer.h">\r
- <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h">\r
<Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h">\r
<Filter>JUCE Modules\juce_audio_processors\format</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\classfactoryhelpers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fbuffer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fdebug.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fobject.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstreamer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\fstring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\source\updatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include\flock.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\conststringtable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpop.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\falignpush.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fplatform.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fstrdefs.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ftypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\funknown.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\futils.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\fvariant.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ibstream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\icloneable.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipersistent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ipluginbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\istringresult.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\iupdatehandler.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\smartpointer.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base\ustring.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui\iplugviewcontentscalesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstattributes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstaudioprocessor.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstautomationstate.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstchannelcontextinfo.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstcontextmenu.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstevents.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivsthostapplication.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstinterappaudio.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmessage.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstmidicontrollers.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstnoteexpression.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstparameterchanges.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstplugview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprefetchablesupport.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstprocesscontext.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstrepresentation.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\ivstunits.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstpshpack4.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vstspeaker.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst\vsttypes.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\memorystream.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common\pluginview.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\hostclasses.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstbus.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponent.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstcomponentbase.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vsteditcontroller.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstparameters.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\vstpresetfile.h">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTCommon.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
+ <ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTInterface.h">\r
+ <Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
+ </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h">\r
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.h">\r
- <Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h">\r
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_AudioProcessorValueTreeState.h">\r
<Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.h">\r
- <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.h">\r
<Filter>JUCE Modules\juce_audio_processors</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayAllocationBase.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_ArrayBase.h">\r
- <Filter>JUCE Modules\juce_core\containers</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\containers\juce_DynamicObject.h">\r
<Filter>JUCE Modules\juce_core\containers</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeapBlock.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_HeavyweightLeakedObjectDetector.h">\r
- <Filter>JUCE Modules\juce_core\memory</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_LeakedObjectDetector.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\memory\juce_WeakReference.h">\r
<Filter>JUCE Modules\juce_core\memory</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_ConsoleApplication.h">\r
- <Filter>JUCE Modules\juce_core\misc</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\misc\juce_Result.h">\r
<Filter>JUCE Modules\juce_core\misc</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_osx_ObjCHelpers.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_IPAddress.h">\r
- <Filter>JUCE Modules\juce_core\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_core\native\juce_posix_SharedCode.h">\r
<Filter>JUCE Modules\juce_core\native</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h">\r
<Filter>JUCE Modules\juce_events\interprocess</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_events\interprocess\juce_NetworkServiceDiscovery.h">\r
- <Filter>JUCE Modules\juce_events\interprocess</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_events\messages\juce_ApplicationBase.h">\r
<Filter>JUCE Modules\juce_events\messages</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h">\r
<Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Desktop.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
- </ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_basics\desktop\juce_Displays.h">\r
- <Filter>JUCE Modules\juce_gui_basics\desktop</Filter>\r
+ <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ModalComponentManager.h">\r
+ <Filter>JUCE Modules\juce_gui_basics\components</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\drawables\juce_Drawable.h">\r
<Filter>JUCE Modules\juce_gui_basics\drawables</Filter>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_ScopedDPIAwarenessDisabler.h">\r
- <Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">\r
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">\r
- <Filter>JUCE Modules\juce_video\native</Filter>\r
- </ClInclude>\r
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">\r
<Filter>JUCE Modules\juce_video\native</Filter>\r
</ClInclude>\r
<None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt">\r
<Filter>JUCE Modules\juce_audio_formats\codecs\oggvorbis</Filter>\r
</None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\base\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\LICENSE.txt">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
- <None Include="..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK\README.md">\r
- <Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK</Filter>\r
- </None>\r
<None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">\r
<Filter>JUCE Modules\juce_graphics\image_formats\jpglib</Filter>\r
</None>\r
//==============================================================================\r
// juce_audio_devices flags:\r
\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- //#define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
#ifndef JUCE_ASIO\r
//#define JUCE_ASIO 0\r
#endif\r
//#define JUCE_USE_ANDROID_OPENSLES 0\r
#endif\r
\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ //#define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
#ifndef JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
//#define JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS 0\r
#endif\r
//#define JUCE_USE_CURL 0\r
#endif\r
\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
-#endif\r
-\r
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS\r
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1\r
#endif\r
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- //#define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_events flags:\r
\r
//#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_basics flags:\r
\r
//#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
// juce_gui_extra flags:\r
\r
#ifndef JUCE_USE_CAMERA\r
//#define JUCE_USE_CAMERA 0\r
#endif\r
-\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
//==============================================================================\r
#ifndef JUCE_STANDALONE_APPLICATION\r
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)\r
namespace ProjectInfo\r
{\r
const char* const projectName = "WindowsDLL";\r
- const char* const companyName = "ROLI Ltd.";\r
const char* const versionString = "1.0.0";\r
const int versionNumber = 0x10000;\r
}\r
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT id="IvabE4" name="WindowsDLL" projectType="library" juceLinkage="none"\r
- bundleIdentifier="com.roli.jucedll" jucerVersion="5.4.1" defines="JUCE_DLL_BUILD=1"\r
+ bundleIdentifier="com.roli.jucedll" jucerVersion="5.3.1" defines="JUCE_DLL_BUILD=1"\r
displaySplashScreen="0" reportAppUsage="0" companyName="ROLI Ltd."\r
companyCopyright="ROLI Ltd.">\r
<EXPORTFORMATS>\r
saveUnloggedEvents (dispatcher.eventQueue);\r
}\r
\r
-ThreadedAnalyticsDestination::EventDispatcher::EventDispatcher (const String& dispatcherThreadName,\r
+ThreadedAnalyticsDestination::EventDispatcher::EventDispatcher (const String& threadName,\r
ThreadedAnalyticsDestination& destination)\r
- : Thread (dispatcherThreadName),\r
+ : Thread (threadName),\r
parent (destination)\r
{}\r
\r
\r
ID: juce_analytics\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE analytics classes\r
description: Classes to collect analytics and send to destinations\r
website: http://www.juce.com/juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() {}\r
-AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() {}\r
-\r
-void AudioProcessLoadMeasurer::reset()\r
-{\r
- reset (0, 0);\r
-}\r
-\r
-void AudioProcessLoadMeasurer::reset (double sampleRate, int blockSize)\r
-{\r
- cpuUsageMs = 0;\r
- xruns = 0;\r
-\r
- if (sampleRate > 0.0 && blockSize > 0)\r
- {\r
- msPerBlock = 1000.0 * blockSize / sampleRate;\r
- timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0;\r
- }\r
- else\r
- {\r
- msPerBlock = 0;\r
- timeToCpuScale = 0;\r
- }\r
-}\r
-\r
-void AudioProcessLoadMeasurer::registerBlockRenderTime (double milliseconds)\r
-{\r
- const double filterAmount = 0.2;\r
- cpuUsageMs += filterAmount * (milliseconds - cpuUsageMs);\r
-\r
- if (milliseconds > msPerBlock)\r
- ++xruns;\r
-}\r
-\r
-double AudioProcessLoadMeasurer::getLoadAsProportion() const { return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs); }\r
-double AudioProcessLoadMeasurer::getLoadAsPercentage() const { return 100.0 * getLoadAsProportion(); }\r
-\r
-int AudioProcessLoadMeasurer::getXRunCount() const { return xruns; }\r
-\r
-AudioProcessLoadMeasurer::ScopedTimer::ScopedTimer (AudioProcessLoadMeasurer& p)\r
- : owner (p), startTime (Time::getMillisecondCounterHiRes())\r
-{\r
-}\r
-\r
-AudioProcessLoadMeasurer::ScopedTimer::~ScopedTimer()\r
-{\r
- owner.registerBlockRenderTime (Time::getMillisecondCounterHiRes() - startTime);\r
-}\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- Maintains an ongoing measurement of the proportion of time which is being\r
- spent inside an audio callback.\r
-*/\r
-class JUCE_API AudioProcessLoadMeasurer\r
-{\r
-public:\r
- /** */\r
- AudioProcessLoadMeasurer();\r
-\r
- /** Destructor. */\r
- ~AudioProcessLoadMeasurer();\r
-\r
- //==============================================================================\r
- /** Resets the state. */\r
- void reset();\r
-\r
- /** Resets the counter, in preparation for use with the given sample rate and block size. */\r
- void reset (double sampleRate, int blockSize);\r
-\r
- /** Returns the current load as a proportion 0 to 1.0 */\r
- double getLoadAsProportion() const;\r
-\r
- /** Returns the current load as a percentage 0 to 100.0 */\r
- double getLoadAsPercentage() const;\r
-\r
- /** Returns the number of over- (or under-) runs recorded since the state was reset. */\r
- int getXRunCount() const;\r
-\r
- //==============================================================================\r
- /** This class measures the time between its construction and destruction and\r
- adds it to an AudioProcessLoadMeasurer.\r
-\r
- e.g.\r
- @code\r
- {\r
- AudioProcessLoadMeasurer::ScopedTimer timer (myProcessLoadMeasurer);\r
- myCallback->doTheCallback();\r
- }\r
- @endcode\r
- */\r
- struct JUCE_API ScopedTimer\r
- {\r
- ScopedTimer (AudioProcessLoadMeasurer&);\r
- ~ScopedTimer();\r
-\r
- private:\r
- AudioProcessLoadMeasurer& owner;\r
- double startTime;\r
-\r
- JUCE_DECLARE_NON_COPYABLE (ScopedTimer)\r
- };\r
-\r
- /** Can be called manually to add the time of a callback to the stats.\r
- Normally you probably would never call this - it's simpler and more robust to\r
- use a ScopedTimer to measure the time using an RAII pattern.\r
- */\r
- void registerBlockRenderTime (double millisecondsTaken);\r
-\r
-private:\r
- double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0;\r
- int xruns = 0;\r
-};\r
-\r
-\r
-} // namespace juce\r
}\r
\r
subSamplePos = pos;\r
-\r
- if (wrap == 0)\r
- return (int) (in - originalIn);\r
-\r
return ((int) (in - originalIn) + wrap) % wrap;\r
}\r
\r
}\r
\r
subSamplePos = pos;\r
-\r
- if (wrap == 0)\r
- return (int) (in - originalIn);\r
-\r
return ((int) (in - originalIn) + wrap) % wrap;\r
}\r
\r
{\r
if (buffer.getNumChannels() == 1)\r
{\r
- auto samples = buffer.getWritePointer(0);\r
+ FloatType* samples = buffer.getWritePointer(0);\r
\r
- for (int i = 0; i < numSamples; ++i)\r
+ for (int i = 0; i < numSamples; i++)\r
samples[i] *= getNextValue();\r
}\r
else\r
{\r
- for (int i = 0; i < numSamples; ++i)\r
+ for (int i = 0; i < numSamples; i++)\r
{\r
- auto gain = getNextValue();\r
+ const FloatType gain = getNextValue();\r
\r
for (int channel = 0; channel < buffer.getNumChannels(); channel++)\r
buffer.setSample (channel, i, buffer.getSample (channel, i) * gain);\r
\r
//==============================================================================\r
/** Skip the next numSamples samples.\r
- This is identical to calling getNextValue numSamples times. It returns\r
- the new current value.\r
+\r
+ This is identical to calling getNextValue numSamples times.\r
@see getNextValue\r
*/\r
- FloatType skip (int numSamples) noexcept\r
+ void skip (int numSamples) noexcept\r
{\r
if (numSamples >= countdown)\r
{\r
currentValue = target;\r
countdown = 0;\r
- return target;\r
}\r
-\r
- currentValue += (step * static_cast<FloatType> (numSamples));\r
- countdown -= numSamples;\r
- return currentValue;\r
+ else\r
+ {\r
+ currentValue += (step * static_cast<FloatType> (numSamples));\r
+ countdown -= numSamples;\r
+ }\r
}\r
\r
private:\r
#include "buffers/juce_AudioDataConverters.cpp"\r
#include "buffers/juce_FloatVectorOperations.cpp"\r
#include "buffers/juce_AudioChannelSet.cpp"\r
-#include "buffers/juce_AudioProcessLoadMeasurer.cpp"\r
#include "effects/juce_IIRFilter.cpp"\r
#include "effects/juce_LagrangeInterpolator.cpp"\r
#include "effects/juce_CatmullRomInterpolator.cpp"\r
\r
ID: juce_audio_basics\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE audio and MIDI data classes\r
description: Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
website: http://www.juce.com/juce\r
#include "buffers/juce_FloatVectorOperations.h"\r
#include "buffers/juce_AudioSampleBuffer.h"\r
#include "buffers/juce_AudioChannelSet.h"\r
-#include "buffers/juce_AudioProcessLoadMeasurer.h"\r
#include "effects/juce_Decibels.h"\r
#include "effects/juce_IIRFilter.h"\r
#include "effects/juce_LagrangeInterpolator.h"\r
}\r
else if (byte == 0xff)\r
{\r
- if (maxBytes == 1)\r
- {\r
- size = 1;\r
- }\r
- else\r
- {\r
- int n;\r
- const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n);\r
- size = jmin (maxBytes, n + 2 + bytesLeft);\r
- }\r
+ int n;\r
+ const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n);\r
+ size = jmin (maxBytes, n + 2 + bytesLeft);\r
}\r
else if (byte >= 0x80)\r
{\r
}\r
\r
//==============================================================================\r
-bool MidiFile::readFrom (InputStream& sourceStream, bool createMatchingNoteOffs)\r
+bool MidiFile::readFrom (InputStream& sourceStream)\r
{\r
clear();\r
MemoryBlock data;\r
break;\r
\r
if (chunkType == (int) ByteOrder::bigEndianInt ("MTrk"))\r
- readNextTrack (d, chunkSize, createMatchingNoteOffs);\r
+ readNextTrack (d, chunkSize);\r
\r
size -= (size_t) chunkSize + 8;\r
d += chunkSize;\r
return false;\r
}\r
\r
-void MidiFile::readNextTrack (const uint8* data, int size, bool createMatchingNoteOffs)\r
+void MidiFile::readNextTrack (const uint8* data, int size)\r
{\r
double time = 0;\r
uint8 lastStatusByte = 0;\r
});\r
\r
addTrack (result);\r
-\r
- if (createMatchingNoteOffs)\r
- tracks.getLast()->updateMatchedPairs();\r
+ tracks.getLast()->updateMatchedPairs();\r
}\r
\r
//==============================================================================\r
terms of midi ticks. To convert them to seconds, use the convertTimestampTicksToSeconds()\r
method.\r
\r
- @param sourceStream the source stream\r
- @param createMatchingNoteOffs if true, any missing note-offs for previous note-ons will\r
- be automatically added at the end of the file by calling\r
- MidiMessageSequence::updateMatchedPairs on each track.\r
-\r
@returns true if the stream was read successfully\r
*/\r
- bool readFrom (InputStream& sourceStream, bool createMatchingNoteOffs = true);\r
+ bool readFrom (InputStream& sourceStream);\r
\r
/** Writes the midi tracks as a standard midi file.\r
The midiFileType value is written as the file's format type, which can be 0, 1\r
or 2 - see the midi file spec for more info about that.\r
-\r
- @param destStream the destination stream\r
- @param midiFileType the type of midi file\r
-\r
@returns true if the operation succeeded.\r
*/\r
bool writeTo (OutputStream& destStream, int midiFileType = 1);\r
OwnedArray<MidiMessageSequence> tracks;\r
short timeFormat;\r
\r
- void readNextTrack (const uint8*, int, bool);\r
+ void readNextTrack (const uint8*, int size);\r
bool writeTrack (OutputStream&, const MidiMessageSequence&);\r
\r
JUCE_LEAK_DETECTOR (MidiFile)\r
}\r
else if (byte == 0xff)\r
{\r
- if (sz == 1)\r
- {\r
- size = 1;\r
- }\r
- else\r
- {\r
- int n;\r
- const int bytesLeft = readVariableLengthVal (src + 1, n);\r
- size = jmin (sz + 1, n + 2 + bytesLeft);\r
- }\r
+ int n;\r
+ const int bytesLeft = readVariableLengthVal (src + 1, n);\r
+ size = jmin (sz + 1, n + 2 + bytesLeft);\r
\r
auto dest = allocateSpace (size);\r
*dest = (uint8) byte;\r
complete message, and will return the number of bytes it used. This lets\r
you read a sequence of midi messages from a file or stream.\r
\r
- @param data the data to read from\r
- @param maxBytesToUse the maximum number of bytes it's allowed to read\r
- @param numBytesUsed returns the number of bytes that were actually needed\r
- @param lastStatusByte in a sequence of midi messages, the initial byte\r
- can be dropped from a message if it's the same as the\r
- first byte of the previous message, so this lets you\r
- supply the byte to use if the first byte of the message\r
- has in fact been dropped.\r
- @param timeStamp the time to give the midi message - this value doesn't\r
- use any particular units, so will be application-specific\r
+ @param data the data to read from\r
+ @param maxBytesToUse the maximum number of bytes it's allowed to read\r
+ @param numBytesUsed returns the number of bytes that were actually needed\r
+ @param lastStatusByte in a sequence of midi messages, the initial byte\r
+ can be dropped from a message if it's the same as the\r
+ first byte of the previous message, so this lets you\r
+ supply the byte to use if the first byte of the message\r
+ has in fact been dropped.\r
+ @param timeStamp the time to give the midi message - this value doesn't\r
+ use any particular units, so will be application-specific\r
@param sysexHasEmbeddedLength when reading sysexes, this flag indicates whether\r
- to expect the data to begin with a variable-length\r
- field indicating its size\r
+ to expect the data to begin with a variable-length field\r
+ indicating its size\r
*/\r
MidiMessage (const void* data, int maxBytesToUse,\r
int& numBytesUsed, uint8 lastStatusByte,\r
}\r
\r
//==============================================================================\r
-void MPEInstrument::addListener (Listener* listenerToAdd)\r
+void MPEInstrument::addListener (Listener* const listenerToAdd) noexcept\r
{\r
listeners.add (listenerToAdd);\r
}\r
\r
-void MPEInstrument::removeListener (Listener* listenerToRemove)\r
+void MPEInstrument::removeListener (Listener* const listenerToRemove) noexcept\r
{\r
listeners.remove (listenerToRemove);\r
}\r
//==============================================================================\r
void MPEInstrument::processMidiNoteOnMessage (const MidiMessage& message)\r
{\r
- // Note: If a note-on with velocity = 0 is used to convey a note-off,\r
+ // Note: if a note-on with velocity = 0 is used to convey a note-off,\r
// then the actual note-off velocity is not known. In this case,\r
// the MPE convention is to use note-off velocity = 64.\r
\r
MPE note's key state (whether the key is down and/or the note is\r
sustained) has changed.\r
\r
- Note: If the key state changes to MPENote::off, noteReleased is\r
+ Note: if the key state changes to MPENote::off, noteReleased is\r
called instead.\r
*/\r
virtual void noteKeyStateChanged (MPENote changedNote) = 0;\r
\r
//==============================================================================\r
/** Adds a listener. */\r
- void addListener (Listener* listenerToAdd);\r
+ void addListener (Listener* listenerToAdd) noexcept;\r
\r
/** Removes a listener. */\r
- void removeListener (Listener* listenerToRemove);\r
+ void removeListener (Listener* listenerToRemove) noexcept;\r
\r
//==============================================================================\r
/** Puts the instrument into legacy mode.\r
std::size_t pos = 0;\r
MidiBuffer::Iterator iter (midiBuffer);\r
MidiMessage midiMessage;\r
- int samplePosition; // Note: Not actually used, so no need to initialise.\r
+ int samplePosition; // Note: not actually used, so no need to initialise.\r
\r
while (iter.getNextEvent (midiMessage, samplePosition))\r
{\r
class instead. You just need to take care to send them to the appropriate\r
per-note MIDI channel.\r
\r
- Note: If you are working with an MPEZoneLayout object inside your app,\r
+ Note: if you are working with an MPEZoneLayout object inside your app,\r
you should not use the message sequences provided here. Instead, you should\r
change the zone layout programmatically with the member functions provided in the\r
MPEZoneLayout class itself. You should also make sure that the Expressive\r
*/\r
MPEValue pressure { MPEValue::centreValue() };\r
\r
- /** Initial value of timbre when the note was triggered.\r
+ /** Inital value of timbre when the note was triggered.\r
This should never change during the lifetime of an MPENote object.\r
*/\r
MPEValue initialTimbre { MPEValue::centreValue() };\r
void MPESynthesiser::startVoice (MPESynthesiserVoice* voice, MPENote noteToStart)\r
{\r
jassert (voice != nullptr);\r
-\r
voice->currentlyPlayingNote = noteToStart;\r
- voice->noteOnTime = lastNoteOnCounter++;\r
voice->noteStarted();\r
}\r
\r
void MPESynthesiser::stopVoice (MPESynthesiserVoice* voice, MPENote noteToStop, bool allowTailOff)\r
{\r
jassert (voice != nullptr);\r
-\r
voice->currentlyPlayingNote = noteToStop;\r
voice->noteStopped (allowTailOff);\r
}\r
// compilers generating code containing heap allocations..\r
struct Sorter\r
{\r
- bool operator() (const MPESynthesiserVoice* a, const MPESynthesiserVoice* b) const noexcept { return a->noteOnTime < b->noteOnTime; }\r
+ bool operator() (const MPESynthesiserVoice* a, const MPESynthesiserVoice* b) const noexcept { return a->wasStartedBefore (*b); }\r
};\r
\r
std::sort (usableVoices.begin(), usableVoices.end(), Sorter());\r
private:\r
//==============================================================================\r
bool shouldStealVoices = false;\r
- uint32 lastNoteOnCounter = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiser)\r
};\r
return isActive() && currentlyPlayingNote.keyState == MPENote::off;\r
}\r
\r
+bool MPESynthesiserVoice::wasStartedBefore (const MPESynthesiserVoice& other) const noexcept\r
+{\r
+ return noteStartTime < other.noteStartTime;\r
+}\r
+\r
void MPESynthesiserVoice::clearCurrentNote() noexcept\r
{\r
currentlyPlayingNote = MPENote();\r
*/\r
double getSampleRate() const noexcept { return currentSampleRate; }\r
\r
- /** This will be set to an incrementing counter value in MPESynthesiser::startVoice()\r
- and can be used to determine the order in which voices started.\r
- */\r
- uint32 noteOnTime = 0;\r
+ /** Returns true if this voice started playing its current note before the other voice did. */\r
+ bool wasStartedBefore (const MPESynthesiserVoice& other) const noexcept;\r
\r
protected:\r
//==============================================================================\r
private:\r
//==============================================================================\r
friend class MPESynthesiser;\r
+ uint32 noteStartTime = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiserVoice)\r
};\r
auto max = 0, pos = 0;\r
auto n = buffer.getNumSamples(), m = bufferToFill.numSamples;\r
\r
- int i;\r
- for (i = position; (i < n || isLooping) && (pos < m); i += max)\r
+ for (auto i = position; (i < n || isLooping) && (pos < m); i += max)\r
{\r
max = jmin (m - pos, n - (i % n));\r
\r
\r
if (pos < m)\r
dst.clear (bufferToFill.startSample + pos, m - pos);\r
-\r
- position = (i % n);\r
}\r
\r
} // namespace juce\r
voice->stopNote (velocity, allowTailOff);\r
\r
// the subclass MUST call clearCurrentNote() if it's not tailing off! RTFM for stopNote()!\r
- jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == nullptr));\r
+ jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == 0));\r
}\r
\r
void Synthesiser::noteOff (const int midiChannel,\r
if (voice->getCurrentlyPlayingNote() == midiNoteNumber\r
&& voice->isPlayingChannel (midiChannel))\r
{\r
- if (auto sound = voice->getCurrentlyPlayingSound())\r
+ if (SynthesiserSound* const sound = voice->getCurrentlyPlayingSound())\r
{\r
if (sound->appliesToNote (midiNoteNumber)\r
&& sound->appliesToChannel (midiChannel))\r
int getNumSounds() const noexcept { return sounds.size(); }\r
\r
/** Returns one of the sounds. */\r
- SynthesiserSound::Ptr getSound (int index) const noexcept { return sounds[index]; }\r
+ SynthesiserSound* getSound (int index) const noexcept { return sounds [index]; }\r
\r
/** Adds a new sound to the synthesiser.\r
\r
namespace juce\r
{\r
\r
+AudioDeviceManager::AudioDeviceSetup::AudioDeviceSetup()\r
+ : sampleRate (0),\r
+ bufferSize (0),\r
+ useDefaultInputChannels (true),\r
+ useDefaultOutputChannels (true)\r
+{\r
+}\r
+\r
bool AudioDeviceManager::AudioDeviceSetup::operator== (const AudioDeviceManager::AudioDeviceSetup& other) const\r
{\r
return outputDeviceName == other.outputDeviceName\r
return {};\r
}\r
\r
-AudioDeviceManager::AudioDeviceSetup AudioDeviceManager::getAudioDeviceSetup() const\r
-{\r
- return currentSetup;\r
-}\r
-\r
void AudioDeviceManager::getAudioDeviceSetup (AudioDeviceSetup& setup) const\r
{\r
setup = currentSetup;\r
{\r
stopDevice();\r
currentAudioDevice.reset();\r
- loadMeasurer.reset();\r
+ cpuUsageMs = 0;\r
}\r
\r
void AudioDeviceManager::restartLastAudioDevice()\r
\r
if (callbacks.size() > 0)\r
{\r
- AudioProcessLoadMeasurer::ScopedTimer timer (loadMeasurer);\r
+ auto callbackStartTime = Time::getMillisecondCounterHiRes();\r
\r
tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true);\r
\r
dst[j] += src[j];\r
}\r
}\r
+\r
+ auto msTaken = Time::getMillisecondCounterHiRes() - callbackStartTime;\r
+ const double filterAmount = 0.2;\r
+ cpuUsageMs += filterAmount * (msTaken - cpuUsageMs);\r
+\r
+ if (msTaken > msPerBlock)\r
+ ++xruns;\r
}\r
else\r
{\r
\r
void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device)\r
{\r
- loadMeasurer.reset (device->getCurrentSampleRate(),\r
- device->getCurrentBufferSizeSamples());\r
+ cpuUsageMs = 0;\r
+ xruns = 0;\r
+\r
+ auto sampleRate = device->getCurrentSampleRate();\r
+ auto blockSize = device->getCurrentBufferSizeSamples();\r
+\r
+ if (sampleRate > 0.0 && blockSize > 0)\r
+ {\r
+ msPerBlock = 1000.0 * blockSize / sampleRate;\r
+ timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0;\r
+ }\r
\r
{\r
const ScopedLock sl (audioCallbackLock);\r
\r
void AudioDeviceManager::audioDeviceStoppedInt()\r
{\r
+ cpuUsageMs = 0;\r
+ timeToCpuScale = 0;\r
+ xruns = 0;\r
sendChangeMessage();\r
\r
const ScopedLock sl (audioCallbackLock);\r
\r
- loadMeasurer.reset();\r
-\r
for (int i = callbacks.size(); --i >= 0;)\r
callbacks.getUnchecked(i)->audioDeviceStopped();\r
}\r
\r
double AudioDeviceManager::getCpuUsage() const\r
{\r
- return loadMeasurer.getLoadAsProportion();\r
+ return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs);\r
}\r
\r
//==============================================================================\r
\r
auto phasePerSample = MathConstants<double>::twoPi / (sampleRate / frequency);\r
\r
- std::unique_ptr<AudioBuffer<float>> newSound (new AudioBuffer<float> (1, soundLength));\r
+ auto* newSound = new AudioBuffer<float> (1, soundLength);\r
\r
for (int i = 0; i < soundLength; ++i)\r
newSound->setSample (0, i, amplitude * (float) std::sin (i * phasePerSample));\r
newSound->applyGainRamp (0, 0, soundLength / 10, 0.0f, 1.0f);\r
newSound->applyGainRamp (0, soundLength - soundLength / 4, soundLength / 4, 1.0f, 0.0f);\r
\r
- {\r
- const ScopedLock sl (audioCallbackLock);\r
- std::swap (testSound, newSound);\r
- }\r
+ const ScopedLock sl (audioCallbackLock);\r
+ testSound.reset (newSound);\r
}\r
}\r
\r
int AudioDeviceManager::getXRunCount() const noexcept\r
{\r
auto deviceXRuns = (currentAudioDevice != nullptr ? currentAudioDevice->getXRunCount() : -1);\r
- return jmax (0, deviceXRuns) + loadMeasurer.getXRunCount();\r
+ return jmax (0, deviceXRuns) + xruns;\r
}\r
\r
} // namespace juce\r
*/\r
struct JUCE_API AudioDeviceSetup\r
{\r
+ /** Creates an AudioDeviceSetup object.\r
+\r
+ The default constructor sets all the member variables to indicate default values.\r
+ You can then fill-in any values you want to before passing the object to\r
+ AudioDeviceManager::initialise().\r
+ */\r
+ AudioDeviceSetup();\r
+\r
+ bool operator== (const AudioDeviceSetup& other) const;\r
+ bool operator!= (const AudioDeviceSetup& other) const;\r
+\r
/** The name of the audio device used for output.\r
The name has to be one of the ones listed by the AudioDeviceManager's currently\r
selected device type.\r
A value of 0 indicates that you don't care what rate is used, and the\r
device will choose a sensible rate for you.\r
*/\r
- double sampleRate = 0;\r
+ double sampleRate;\r
\r
/** The buffer size, in samples.\r
This buffer size is used for both the input and output devices.\r
A value of 0 indicates the default buffer size.\r
*/\r
- int bufferSize = 0;\r
+ int bufferSize;\r
\r
/** The set of active input channels.\r
The bits that are set in this array indicate the channels of the\r
should be ignored, and instead, the device's default channels\r
should be used.\r
*/\r
- bool useDefaultInputChannels = true;\r
+ bool useDefaultInputChannels;\r
\r
/** The set of active output channels.\r
The bits that are set in this array indicate the channels of the\r
should be ignored, and instead, the device's default channels\r
should be used.\r
*/\r
- bool useDefaultOutputChannels = true;\r
-\r
- bool operator== (const AudioDeviceSetup&) const;\r
- bool operator!= (const AudioDeviceSetup&) const;\r
+ bool useDefaultOutputChannels;\r
};\r
\r
\r
/** Returns the current device properties that are in use.\r
@see setAudioDeviceSetup\r
*/\r
- AudioDeviceSetup getAudioDeviceSetup() const;\r
-\r
- /** Returns the current device properties that are in use.\r
- This is an old method, kept around for compatibility, but you should prefer the new\r
- version which returns the result rather than taking an out-parameter.\r
- @see getAudioDeviceSetup()\r
- */\r
void getAudioDeviceSetup (AudioDeviceSetup& result) const;\r
\r
/** Changes the current device or its settings.\r
\r
@see getAudioDeviceSetup\r
*/\r
- String setAudioDeviceSetup (const AudioDeviceSetup& newSetup, bool treatAsChosenDevice);\r
+ String setAudioDeviceSetup (const AudioDeviceSetup& newSetup,\r
+ bool treatAsChosenDevice);\r
\r
\r
/** Returns the currently-active audio device. */\r
\r
For a list of types, see getAvailableDeviceTypes().\r
*/\r
- void setCurrentAudioDeviceType (const String& type, bool treatAsChosenDevice);\r
+ void setCurrentAudioDeviceType (const String& type,\r
+ bool treatAsChosenDevice);\r
\r
/** Closes the currently-open device.\r
You can call restartLastAudioDevice() later to reopen it in the same state\r
*/\r
LevelMeter::Ptr getInputLevelGetter() noexcept { return inputLevelGetter; }\r
\r
- /** Returns a reference-counted object that can be used to get the current output level.\r
+ /** Returns a reference-counted object that can be used to get the current input level.\r
\r
You need to store this object locally to ensure that the reference count is incremented\r
- and decremented properly. The current output level value can be read using getCurrentLevel().\r
+ and decremented properly. The current input level value can be read using getCurrentLevel().\r
*/\r
LevelMeter::Ptr getOutputLevelGetter() noexcept { return outputLevelGetter; }\r
\r
std::unique_ptr<AudioBuffer<float>> testSound;\r
int testSoundPosition = 0;\r
\r
- AudioProcessLoadMeasurer loadMeasurer;\r
+ double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0;\r
+ int xruns = 0;\r
\r
LevelMeter::Ptr inputLevelGetter { new LevelMeter() },\r
outputLevelGetter { new LevelMeter() };\r
\r
//==============================================================================\r
class CallbackHandler;\r
+ friend class CallbackHandler;\r
+ friend struct ContainerDeletePolicy<CallbackHandler>;\r
std::unique_ptr<CallbackHandler> callbackHandler;\r
\r
void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels,\r
#include <mmreg.h>\r
#endif\r
\r
- #if JUCE_USE_WINRT_MIDI && JUCE_MSVC\r
+ #if JUCE_USE_WINRT_MIDI\r
/* If you cannot find any of the header files below then you are probably\r
attempting to use the Windows 10 Bluetooth Low Energy API. For this to work you\r
- need to install version 10.0.14393.0 of the Windows Standalone SDK and you may\r
- need to add the path to the WinRT headers to your build system. This path should\r
- have the form "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
+ need to install version 10.0.14393.0 of the Windows Standalone SDK and add the\r
+ path to the WinRT headers to your build system. This path should have the form\r
+ "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
\r
Also please note that Microsoft's Bluetooth MIDI stack has multiple issues, so\r
this API is EXPERIMENTAL - use at your own risk!\r
#include <windows.devices.h>\r
#include <windows.devices.midi.h>\r
#include <windows.devices.enumeration.h>\r
-\r
- #pragma warning (push)\r
- #pragma warning (disable: 4265)\r
#include <wrl/event.h>\r
- #pragma warning (pop)\r
-\r
- #pragma warning (push)\r
- #pragma warning (disable: 4467)\r
+ #if JUCE_MSVC\r
+ #pragma warning (push)\r
+ #pragma warning (disable: 4467)\r
+ #endif\r
#include <robuffer.h>\r
- #pragma warning (pop)\r
+ #if JUCE_MSVC\r
+ #pragma warning (pop)\r
+ #endif\r
#endif\r
\r
#if JUCE_ASIO\r
installed, or you've not got your paths set up correctly to find its header\r
files.\r
*/\r
- #include <rtdk.h>\r
#include <Bela.h>\r
- #include <Midi.h>\r
#endif\r
\r
#undef SIZEOF\r
#endif\r
\r
#if JUCE_USE_ANDROID_OBOE\r
- #if JUCE_USE_ANDROID_OPENSLES\r
- #error "Oboe cannot be enabled at the same time as openSL! Please disable JUCE_USE_ANDROID_OPENSLES"\r
- #endif\r
-\r
#include <oboe/Oboe.h>\r
#endif\r
\r
#include "native/juce_linux_ALSA.cpp"\r
#endif\r
\r
+ #include "native/juce_linux_Midi.cpp"\r
+\r
#if JUCE_JACK\r
#include "native/juce_linux_JackAudio.cpp"\r
#endif\r
\r
#if JUCE_BELA\r
#include "native/juce_linux_Bela.cpp"\r
- #else\r
- #include "native/juce_linux_Midi.cpp"\r
#endif\r
\r
//==============================================================================\r
\r
ID: juce_audio_devices\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE audio and MIDI I/O device classes\r
description: Classes to play and record from audio and MIDI I/O devices\r
website: http://www.juce.com/juce\r
#endif\r
\r
//==============================================================================\r
-/** Config: JUCE_USE_WINRT_MIDI\r
- Enables the use of the Windows Runtime API for MIDI, allowing connections\r
- to Bluetooth Low Energy devices on Windows 10 version 1809 (October 2018\r
- Update) and later. If you enable this flag then older, unsupported,\r
- versions of Windows will automatically fall back to using the regualar\r
- Win32 MIDI API.\r
-\r
- You will need version 10.0.14393.0 of the Windows Standalone SDK to compile\r
- and you may need to add the path to the WinRT headers. The path to the\r
- headers will be something similar to\r
- "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
-*/\r
-#ifndef JUCE_USE_WINRT_MIDI\r
- #define JUCE_USE_WINRT_MIDI 0\r
-#endif\r
-\r
/** Config: JUCE_ASIO\r
Enables ASIO audio devices (MS Windows only).\r
Turning this on means that you'll need to have the Steinberg ASIO SDK installed\r
#endif\r
#endif\r
\r
+/** Config: JUCE_USE_WINRT_MIDI\r
+ ***\r
+ EXPERIMENTAL - Microsoft's Bluetooth MIDI stack has multiple issues,\r
+ use at your own risk!\r
+ ***\r
+\r
+ Enables the use of the Windows Runtime API for MIDI, which supports\r
+ Bluetooth Low Energy connections on computers with the Anniversary Update\r
+ of Windows 10.\r
+\r
+ To compile with this flag requires version 10.0.14393.0 of the Windows\r
+ Standalone SDK and you must add the path to the WinRT headers. This path\r
+ should be something similar to\r
+ "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
+*/\r
+#ifndef JUCE_USE_WINRT_MIDI\r
+ #define JUCE_USE_WINRT_MIDI 0\r
+#endif\r
+\r
/** Config: JUCE_DISABLE_AUDIO_MIXING_WITH_OTHER_APPS\r
Turning this on gives your app exclusive access to the system's audio\r
on platforms which support it (currently iOS only).\r
{\r
MidiBuffer::Iterator i (buffer);\r
MidiMessage message;\r
- int samplePosition; // Note: Not actually used, so no need to initialise.\r
+ int samplePosition; // Note: not actually used, so no need to initialise.\r
\r
while (i.getNextEvent (message, samplePosition))\r
sendMessageNow (message);\r
class MidiDataConcatenator\r
{\r
public:\r
+ //==============================================================================\r
MidiDataConcatenator (int initialBufferSize)\r
- : pendingSysexData ((size_t) initialBufferSize)\r
+ : pendingData ((size_t) initialBufferSize)\r
{\r
}\r
\r
void reset()\r
{\r
- currentMessageLen = 0;\r
- pendingSysexSize = 0;\r
- pendingSysexTime = 0;\r
+ pendingBytes = 0;\r
+ runningStatus = 0;\r
+ pendingDataTime = 0;\r
}\r
\r
template <typename UserDataType, typename CallbackType>\r
void pushMidiData (const void* inputData, int numBytes, double time,\r
UserDataType* input, CallbackType& callback)\r
{\r
- auto d = static_cast<const uint8*> (inputData);\r
+ const uint8* d = static_cast<const uint8*> (inputData);\r
\r
while (numBytes > 0)\r
{\r
- auto nextByte = *d;\r
-\r
- if (pendingSysexSize != 0 || nextByte == 0xf0)\r
+ if (pendingBytes > 0 || d[0] == 0xf0)\r
{\r
processSysex (d, numBytes, time, input, callback);\r
- currentMessageLen = 0;\r
- continue;\r
+ runningStatus = 0;\r
}\r
+ else\r
+ {\r
+ int len = 0;\r
+ uint8 data[3];\r
\r
- ++d;\r
- --numBytes;\r
+ while (numBytes > 0)\r
+ {\r
+ // If there's a realtime message embedded in the middle of\r
+ // the normal message, handle it now..\r
+ if (*d >= 0xf8 && *d <= 0xfe)\r
+ {\r
+ callback.handleIncomingMidiMessage (input, MidiMessage (*d++, time));\r
+ --numBytes;\r
+ }\r
+ else\r
+ {\r
+ if (len == 0 && *d < 0x80 && runningStatus >= 0x80)\r
+ data[len++] = runningStatus;\r
\r
- if (isRealtimeMessage (nextByte))\r
- {\r
- callback.handleIncomingMidiMessage (input, MidiMessage (nextByte, time));\r
- // These can be embedded in the middle of a normal message, so we won't\r
- // reset the currentMessageLen here.\r
- continue;\r
- }\r
+ data[len++] = *d++;\r
+ --numBytes;\r
\r
- if (isInitialByte (nextByte))\r
- {\r
- currentMessage[0] = nextByte;\r
- currentMessageLen = 1;\r
- }\r
- else if (currentMessageLen > 0 && currentMessageLen < 3)\r
- {\r
- currentMessage[currentMessageLen++] = nextByte;\r
- }\r
- else\r
- {\r
- // message is too long or invalid MIDI - abandon it and start again with the next byte\r
- currentMessageLen = 0;\r
- continue;\r
- }\r
+ const uint8 firstByte = data[0];\r
\r
- auto expectedLength = MidiMessage::getMessageLengthFromFirstByte (currentMessage[0]);\r
+ if (firstByte < 0x80 || firstByte == 0xf7)\r
+ {\r
+ len = 0;\r
+ break; // ignore this malformed MIDI message..\r
+ }\r
\r
- if (expectedLength == currentMessageLen)\r
- {\r
- callback.handleIncomingMidiMessage (input, MidiMessage (currentMessage, expectedLength, time));\r
- currentMessageLen = 1; // reset, but leave the first byte to use as the running status byte\r
+ if (len >= MidiMessage::getMessageLengthFromFirstByte (firstByte))\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (len > 0)\r
+ {\r
+ int used = 0;\r
+ const MidiMessage m (data, len, used, 0, time);\r
+\r
+ if (used <= 0)\r
+ break; // malformed message..\r
+\r
+ jassert (used == len);\r
+ callback.handleIncomingMidiMessage (input, m);\r
+ runningStatus = data[0];\r
+ }\r
}\r
}\r
}\r
{\r
if (*d == 0xf0)\r
{\r
- pendingSysexSize = 0;\r
- pendingSysexTime = time;\r
+ pendingBytes = 0;\r
+ pendingDataTime = time;\r
}\r
\r
- pendingSysexData.ensureSize ((size_t) (pendingSysexSize + numBytes), false);\r
- auto totalMessage = static_cast<uint8*> (pendingSysexData.getData());\r
- auto dest = totalMessage + pendingSysexSize;\r
+ pendingData.ensureSize ((size_t) (pendingBytes + numBytes), false);\r
+ uint8* totalMessage = static_cast<uint8*> (pendingData.getData());\r
+ uint8* dest = totalMessage + pendingBytes;\r
\r
do\r
{\r
- if (pendingSysexSize > 0 && isInitialByte (*d))\r
+ if (pendingBytes > 0 && *d >= 0x80)\r
{\r
if (*d == 0xf7)\r
{\r
*dest++ = *d++;\r
- ++pendingSysexSize;\r
+ ++pendingBytes;\r
--numBytes;\r
break;\r
}\r
}\r
else\r
{\r
- pendingSysexSize = 0;\r
+ pendingBytes = 0;\r
int used = 0;\r
const MidiMessage m (d, numBytes, used, 0, time);\r
\r
else\r
{\r
*dest++ = *d++;\r
- ++pendingSysexSize;\r
+ ++pendingBytes;\r
--numBytes;\r
}\r
}\r
while (numBytes > 0);\r
\r
- if (pendingSysexSize > 0)\r
+ if (pendingBytes > 0)\r
{\r
- if (totalMessage [pendingSysexSize - 1] == 0xf7)\r
+ if (totalMessage [pendingBytes - 1] == 0xf7)\r
{\r
- callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingSysexSize, pendingSysexTime));\r
- pendingSysexSize = 0;\r
+ callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingBytes, pendingDataTime));\r
+ pendingBytes = 0;\r
}\r
else\r
{\r
- callback.handlePartialSysexMessage (input, totalMessage, pendingSysexSize, pendingSysexTime);\r
+ callback.handlePartialSysexMessage (input, totalMessage, pendingBytes, pendingDataTime);\r
}\r
}\r
}\r
\r
- static bool isRealtimeMessage (uint8 byte) { return byte >= 0xf8 && byte <= 0xfe; }\r
- static bool isInitialByte (uint8 byte) { return byte >= 0x80; }\r
-\r
- uint8 currentMessage[3];\r
- int currentMessageLen = 0;\r
-\r
- MemoryBlock pendingSysexData;\r
- double pendingSysexTime = 0;\r
- int pendingSysexSize = 0;\r
+ MemoryBlock pendingData;\r
+ double pendingDataTime = 0;\r
+ int pendingBytes = 0;\r
+ uint8 runningStatus = 0;\r
\r
JUCE_DECLARE_NON_COPYABLE (MidiDataConcatenator)\r
};\r
METHOD (flush, "flush", "()V") \\r
METHOD (write, "write", "([SII)I") \\r
\r
-DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack")\r
+DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
METHOD (read, "read", "([SII)I") \\r
METHOD (release, "release", "()V") \\r
\r
-DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord")\r
+DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICFIELD (SDK_INT, "SDK_INT", "I") \\r
\r
- DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION")\r
+ DECLARE_JNI_CLASS (AndroidBuildVersion, "android/os/Build$VERSION");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
}\r
};\r
\r
-template <typename Type>\r
-static String getOboeString (const Type& value)\r
-{\r
- return String (oboe::convertToText (value));\r
-}\r
-\r
//==============================================================================\r
class OboeAudioIODevice : public AudioIODevice\r
{\r
// by default. We need to be more conservative on other devices\r
// as they may be low-latency, but still have a crappy CPU.\r
return (isProAudioDevice() ? 1 : 6)\r
- * getNativeBufferSize();\r
+ * defaultBufferSizeIsMultipleOfNative * getNativeBufferSize();\r
}\r
\r
double getCurrentSampleRate() override\r
// Setting nullptr callback is allowed only when playback is stopped.\r
jassert (callbackToUse != nullptr);\r
\r
- for (;;)\r
+ while (true)\r
{\r
- auto old = callback.get();\r
+ AudioIODeviceCallback* old = callback.get();\r
\r
if (old == callbackToUse)\r
break;\r
void process (const float** inputChannelData, int numInputChannels,\r
float** outputChannelData, int numOutputChannels, int32_t numFrames)\r
{\r
- if (auto* cb = callback.exchange (nullptr))\r
+ if (AudioIODeviceCallback* cb = callback.exchange (nullptr))\r
{\r
cb->audioDeviceIOCallback (inputChannelData, numInputChannels,\r
outputChannelData, numOutputChannels, numFrames);\r
\r
~OboeStream()\r
{\r
+ // AudioStreamCallback can only be deleted when stream has been closed\r
close();\r
- delete stream;\r
}\r
\r
bool openedOk() const noexcept\r
int64 timeoutNanos = 1000 * oboe::kNanosPerMillisecond;\r
\r
auto startResult = stream->requestStart();\r
- JUCE_OBOE_LOG ("Requested Oboe stream start with result: " + getOboeString (startResult));\r
+ JUCE_OBOE_LOG ("Requested Oboe stream start with result: " + String (oboe::convertToText (startResult)));\r
\r
startResult = stream->waitForStateChange (expectedState, &nextState, timeoutNanos);\r
-\r
- JUCE_OBOE_LOG ("Starting Oboe stream with result: " + getOboeString (startResult);\r
- + "\nUses AAudio = " + String ((int) stream->usesAAudio())\r
- + "\nDirection = " + getOboeString (stream->getDirection())\r
- + "\nSharingMode = " + getOboeString (stream->getSharingMode())\r
- + "\nChannelCount = " + String (stream->getChannelCount())\r
- + "\nFormat = " + getOboeString (stream->getFormat())\r
- + "\nSampleRate = " + String (stream->getSampleRate())\r
- + "\nBufferSizeInFrames = " + String (stream->getBufferSizeInFrames())\r
- + "\nBufferCapacityInFrames = " + String (stream->getBufferCapacityInFrames())\r
- + "\nFramesPerBurst = " + String (stream->getFramesPerBurst())\r
- + "\nFramesPerCallback = " + String (stream->getFramesPerCallback())\r
- + "\nBytesPerFrame = " + String (stream->getBytesPerFrame())\r
- + "\nBytesPerSample = " + String (stream->getBytesPerSample())\r
- + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency)\r
- + "\ngetDeviceId = " + String (stream->getDeviceId()));\r
+ JUCE_OBOE_LOG ("Starting Oboe stream with result: " + String (oboe::convertToText (startResult));\r
+ + "\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
+ + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+ + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
+ + "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
+ + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
+ + "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
+ + "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
+ + "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
+ + "\nFramesPerBurst = " + (stream != nullptr ? String (stream->getFramesPerBurst()) : String ("?"))\r
+ + "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
+ + "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
+ + "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
+ + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency))\r
+ + "\ngetDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?")));\r
}\r
}\r
\r
- oboe::AudioStream* getNativeStream() const\r
+ oboe::AudioStream* getNativeStream()\r
{\r
jassert (openedOk());\r
+\r
return stream;\r
}\r
\r
int getXRunCount() const\r
{\r
- if (stream != nullptr)\r
- {\r
- auto count = stream->getXRunCount();\r
-\r
- if (count)\r
- return count.value();\r
-\r
- JUCE_OBOE_LOG ("Failed to get Xrun count: " + getOboeString (count.error()));\r
- }\r
-\r
- return 0;\r
+ return stream != nullptr ? stream->getXRunCount() : 0;\r
}\r
\r
private:\r
int32 sampleRate, int32 bufferSize,\r
oboe::AudioStreamCallback* callback = nullptr)\r
{\r
- oboe::DefaultStreamValues::FramesPerBurst = getDefaultFramesPerBurst();\r
-\r
oboe::AudioStreamBuilder builder;\r
\r
if (deviceId != -1)\r
builder.setDeviceId (deviceId);\r
\r
+ static int defaultFramesPerBurst = getDefaultFramesPerBurst();\r
+\r
// Note: letting OS to choose the buffer capacity & frames per callback.\r
builder.setDirection (direction);\r
builder.setSharingMode (sharingMode);\r
builder.setChannelCount (channelCount);\r
builder.setFormat (format);\r
builder.setSampleRate (sampleRate);\r
+ builder.setDefaultFramesPerBurst ((int32) defaultFramesPerBurst);\r
builder.setPerformanceMode (oboe::PerformanceMode::LowLatency);\r
builder.setCallback (callback);\r
\r
JUCE_OBOE_LOG (String ("Preparing Oboe stream with params:")\r
+ "\nAAudio supported = " + String (int (builder.isAAudioSupported()))\r
- + "\nAPI = " + getOboeString (builder.getAudioApi())\r
+ + "\nAPI = " + String (oboe::convertToText (builder.getAudioApi()))\r
+ "\nDeviceId = " + String (deviceId)\r
- + "\nDirection = " + getOboeString (direction)\r
- + "\nSharingMode = " + getOboeString (sharingMode)\r
+ + "\nDirection = " + String (oboe::convertToText (direction))\r
+ + "\nSharingMode = " + String (oboe::convertToText (sharingMode))\r
+ "\nChannelCount = " + String (channelCount)\r
- + "\nFormat = " + getOboeString (format)\r
+ + "\nFormat = " + String (oboe::convertToText (format))\r
+ "\nSampleRate = " + String (sampleRate)\r
- + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency));\r
+ + "\nBufferSizeInFrames = " + String (bufferSize)\r
+ + "\nFramesPerBurst = " + String (defaultFramesPerBurst)\r
+ + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency)));\r
\r
openResult = builder.openStream (&stream);\r
- JUCE_OBOE_LOG ("Building Oboe stream with result: " + getOboeString (openResult)\r
- + "\nStream state = " + (stream != nullptr ? getOboeString (stream->getState()) : String ("?")));\r
+ JUCE_OBOE_LOG ("Building Oboe stream with result: " + String (oboe::convertToText (openResult))\r
+ + "\nStream state = " + (stream != nullptr ? String (oboe::convertToText (stream->getState())) : String ("?")));\r
\r
- if (stream != nullptr && bufferSize != 0)\r
- {\r
- JUCE_OBOE_LOG ("Setting the bufferSizeInFrames to " + String (bufferSize));\r
+ if (stream != nullptr)\r
stream->setBufferSizeInFrames (bufferSize);\r
- }\r
\r
JUCE_OBOE_LOG (String ("Stream details:")\r
+ "\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
+ "\nDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?"))\r
- + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?"))\r
- + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?"))\r
+ + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+ + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
+ "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
- + "\nFormat = " + (stream != nullptr ? getOboeString (stream->getFormat()) : String ("?"))\r
+ + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
+ "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
+ "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
+ "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
+ "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
+ "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
+ "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
- + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency));\r
+ + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency)));\r
}\r
\r
void close()\r
if (stream != nullptr)\r
{\r
oboe::Result result = stream->close();\r
- JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + getOboeString (result));\r
+ JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + String (oboe::convertToText (result)));\r
}\r
}\r
\r
+ int getDefaultFramesPerBurst() const\r
+ {\r
+ // NB: this function only works for inbuilt speakers and headphones\r
+ auto* env = getEnv();\r
+\r
+ auto audioManager = LocalRef<jobject> (env->CallObjectMethod (android.activity,\r
+ JuceAppActivity.getSystemService,\r
+ javaString ("audio").get()));\r
+\r
+ auto propertyJavaString = javaString ("android.media.property.OUTPUT_FRAMES_PER_BUFFER");\r
+\r
+ auto framesPerBurstString = LocalRef<jstring> ((jstring) android.activity.callObjectMethod (JuceAppActivity.audioManagerGetProperty,\r
+ propertyJavaString.get()));\r
+\r
+ return framesPerBurstString != 0 ? env->CallStaticIntMethod (JavaInteger, JavaInteger.parseInt, framesPerBurstString.get(), 10) : 192;\r
+ }\r
+\r
oboe::AudioStream* stream = nullptr;\r
oboe::Result openResult;\r
};\r
void checkStreamSetup (OboeStream* stream, int deviceId, int numChannels, int sampleRate,\r
int bufferSize, oboe::AudioFormat format)\r
{\r
- if (auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr)\r
+ auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr;\r
+\r
+ if (nativeStream != nullptr)\r
{\r
ignoreUnused (deviceId, numChannels, sampleRate, bufferSize);\r
ignoreUnused (streamFormat, bitDepth);\r
\r
- jassert (numChannels == nativeStream->getChannelCount());\r
- jassert (sampleRate == 0 || sampleRate == nativeStream->getSampleRate());\r
+ jassert (deviceId = nativeStream->getDeviceId());\r
+ jassert (numChannels = nativeStream->getChannelCount());\r
+ jassert (sampleRate == nativeStream->getSampleRate());\r
jassert (format == nativeStream->getFormat());\r
+\r
+ if (nativeStream->usesAAudio())\r
+ jassert (bufferSize == nativeStream->getBufferSizeInFrames());\r
}\r
}\r
\r
\r
outputStream->start();\r
\r
- isInputLatencyDetectionSupported = isLatencyDetectionSupported (inputStream.get());\r
- isOutputLatencyDetectionSupported = isLatencyDetectionSupported (outputStream.get());\r
+ checkIsOutputLatencyDetectionSupported();\r
}\r
\r
void stop() override\r
}\r
\r
int getOutputLatencyInSamples() override { return outputLatency; }\r
- int getInputLatencyInSamples() override { return inputLatency; }\r
+ int getInputLatencyInSamples() override { return -1; }\r
\r
private:\r
- bool isLatencyDetectionSupported (OboeStream* stream)\r
+ void checkIsOutputLatencyDetectionSupported()\r
{\r
- if (stream == nullptr || ! openedOk())\r
- return false;\r
+ if (! openedOk())\r
+ {\r
+ isOutputLatencyDetectionSupported = false;\r
+ return;\r
+ }\r
\r
- auto result = stream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC, 0, 0);\r
- return result != oboe::Result::ErrorUnimplemented;\r
+ auto result = outputStream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC, 0, 0);\r
+ isOutputLatencyDetectionSupported = result != oboe::Result::ErrorUnimplemented;\r
}\r
\r
oboe::DataCallbackResult onAudioReady (oboe::AudioStream* stream, void* audioData, int32_t numFrames) override\r
\r
if (nativeInputStream->getFormat() != oboe::AudioFormat::I16 && nativeInputStream->getFormat() != oboe::AudioFormat::Float)\r
{\r
- JUCE_OBOE_LOG ("Unsupported input stream audio format: " + getOboeString (nativeInputStream->getFormat()));\r
+ JUCE_OBOE_LOG ("Unsupported input stream audio format: " + String (oboe::convertToText (nativeInputStream->getFormat())));\r
jassertfalse;\r
return oboe::DataCallbackResult::Continue;\r
}\r
\r
auto result = inputStream->getNativeStream()->read (inputStreamNativeBuffer.getData(), numFrames, 0);\r
\r
- if (result)\r
+ if (result >= 0)\r
{\r
OboeAudioIODeviceBufferHelpers<SampleType>::referAudioBufferDirectlyToOboeIfPossible (inputStreamNativeBuffer.get(),\r
inputStreamSampleBuffer,\r
- result.value());\r
+ result);\r
\r
- OboeAudioIODeviceBufferHelpers<SampleType>::convertFromOboe (inputStreamNativeBuffer.get(), inputStreamSampleBuffer, result.value());\r
+ OboeAudioIODeviceBufferHelpers<SampleType>::convertFromOboe (inputStreamNativeBuffer.get(), inputStreamSampleBuffer, result);\r
}\r
else\r
{\r
- JUCE_OBOE_LOG ("Failed to read from input stream: " + getOboeString (result.error()));\r
+ // Failed to read from input stream.\r
+ jassertfalse;\r
}\r
-\r
- if (isInputLatencyDetectionSupported)\r
- inputLatency = getLatencyFor (*inputStream);\r
}\r
\r
//-----------------\r
OboeAudioIODeviceBufferHelpers<SampleType>::convertToOboe (outputStreamSampleBuffer, static_cast<SampleType*> (audioData), numFrames);\r
\r
if (isOutputLatencyDetectionSupported)\r
- outputLatency = getLatencyFor (*outputStream);\r
+ calculateOutputLatency();\r
\r
audioCallbackGuard.set (0);\r
}\r
ignoreUnused (stream);\r
\r
JUCE_OBOE_LOG ("\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
- + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?"))\r
- + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?"))\r
+ + "\nDirection = " + (stream != nullptr ? String (oboe::convertToText (stream->getDirection())) : String ("?"))\r
+ + "\nSharingMode = " + (stream != nullptr ? String (oboe::convertToText (stream->getSharingMode())) : String ("?"))\r
+ "\nChannelCount = " + (stream != nullptr ? String (stream->getChannelCount()) : String ("?"))\r
- + "\nFormat = " + (stream != nullptr ? getOboeString (stream->getFormat()) : String ("?"))\r
+ + "\nFormat = " + (stream != nullptr ? String (oboe::convertToText (stream->getFormat())) : String ("?"))\r
+ "\nSampleRate = " + (stream != nullptr ? String (stream->getSampleRate()) : String ("?"))\r
+ "\nBufferSizeInFrames = " + (stream != nullptr ? String (stream->getBufferSizeInFrames()) : String ("?"))\r
+ "\nBufferCapacityInFrames = " + (stream != nullptr ? String (stream->getBufferCapacityInFrames()) : String ("?"))\r
+ "\nFramesPerCallback = " + (stream != nullptr ? String (stream->getFramesPerCallback()) : String ("?"))\r
+ "\nBytesPerFrame = " + (stream != nullptr ? String (stream->getBytesPerFrame()) : String ("?"))\r
+ "\nBytesPerSample = " + (stream != nullptr ? String (stream->getBytesPerSample()) : String ("?"))\r
- + "\nPerformanceMode = " + getOboeString (oboe::PerformanceMode::LowLatency)\r
+ + "\nPerformanceMode = " + String (oboe::convertToText (oboe::PerformanceMode::LowLatency))\r
+ "\ngetDeviceId = " + (stream != nullptr ? String (stream->getDeviceId()) : String ("?")));\r
}\r
\r
- int getLatencyFor (OboeStream& stream)\r
+ void calculateOutputLatency()\r
{\r
- auto& nativeStream = *stream.getNativeStream();\r
-\r
- if (auto latency = nativeStream.calculateLatencyMillis())\r
- return static_cast<int> ((latency.value() * sampleRate) / 1000);\r
+ // Sadly, Oboe uses non-portable int64_t (a.k.a. long on LP64 and long long on LLP64)\r
+ int64_t lastWrittenAndPresentedFrameIndex = 0;\r
+ int64_t lastFramePresentationTimeNanos = 0;\r
\r
- // Get the time that a known audio frame was presented.\r
- int64_t hardwareFrameIndex = 0;\r
- int64_t hardwareFrameHardwareTime = 0;\r
-\r
- auto result = nativeStream.getTimestamp (CLOCK_MONOTONIC,\r
- &hardwareFrameIndex,\r
- &hardwareFrameHardwareTime);\r
+ auto result = outputStream->getNativeStream()->getTimestamp (CLOCK_MONOTONIC,\r
+ &lastWrittenAndPresentedFrameIndex,\r
+ &lastFramePresentationTimeNanos);\r
\r
if (result != oboe::Result::OK)\r
- return 0;\r
+ return;\r
\r
- // Get counter closest to the app.\r
- const bool isOutput = nativeStream.getDirection() == oboe::Direction::Output;\r
- const int64_t appFrameIndex = isOutput ? nativeStream.getFramesWritten() : nativeStream.getFramesRead();\r
+ int64_t currentNumFramesWritten = outputStream->getNativeStream()->getFramesWritten();\r
+ int64_t framesDelta = currentNumFramesWritten - lastWrittenAndPresentedFrameIndex;\r
+ int64_t timeDeltaNanos = framesDelta * oboe::kNanosPerSecond / sampleRate;\r
\r
- // Assume that the next frame will be processed at the current time\r
- using namespace std::chrono;\r
- int64_t appFrameAppTime = getCurrentTimeNanos();//duration_cast<nanoseconds> (steady_clock::now().time_since_epoch()).count();\r
- int64_t appFrameAppTime2 = duration_cast<nanoseconds> (steady_clock::now().time_since_epoch()).count();\r
+ int64_t nextPresentationTimeNanos = lastFramePresentationTimeNanos + timeDeltaNanos;\r
+ int64_t nextFrameWriteTimeNanos = getCurrentTimeNanos();\r
\r
- // Calculate the number of frames between app and hardware\r
- int64_t frameIndexDelta = appFrameIndex - hardwareFrameIndex;\r
+ if (nextFrameWriteTimeNanos < 0)\r
+ return;\r
\r
- // Calculate the time which the next frame will be or was presented\r
- int64_t frameTimeDelta = (frameIndexDelta * oboe::kNanosPerSecond) / sampleRate;\r
- int64_t appFrameHardwareTime = hardwareFrameHardwareTime + frameTimeDelta;\r
-\r
- // Calculate latency as a difference in time between when the current frame is at the app\r
- // and when it is at the hardware.\r
- auto latencyNanos = isOutput ? (appFrameHardwareTime - appFrameAppTime) : (appFrameAppTime - appFrameHardwareTime);\r
- return static_cast<int> ((latencyNanos * sampleRate) / oboe::kNanosPerSecond);\r
+ outputLatency = (int) ((nextPresentationTimeNanos - nextFrameWriteTimeNanos) * sampleRate / oboe::kNanosPerSecond);\r
}\r
\r
int64_t getCurrentTimeNanos()\r
\r
void onErrorBeforeClose (oboe::AudioStream* stream, oboe::Result error) override\r
{\r
- attachAndroidJNI();\r
-\r
// only output stream should be the master stream receiving callbacks\r
jassert (stream->getDirection() == oboe::Direction::Output);\r
\r
- JUCE_OBOE_LOG ("Oboe stream onErrorBeforeClose(): " + getOboeString (error));\r
+ JUCE_OBOE_LOG ("Oboe stream onErrorBeforeClose(): " + String (oboe::convertToText (error)));\r
printStreamDebugInfo (stream);\r
}\r
\r
void onErrorAfterClose (oboe::AudioStream* stream, oboe::Result error) override\r
{\r
- attachAndroidJNI();\r
-\r
// only output stream should be the master stream receiving callbacks\r
jassert (stream->getDirection() == oboe::Direction::Output);\r
\r
- JUCE_OBOE_LOG ("Oboe stream onErrorAfterClose(): " + getOboeString (error));\r
+ JUCE_OBOE_LOG ("Oboe stream onErrorAfterClose(): " + String (oboe::convertToText (error)));\r
\r
if (error == oboe::Result::ErrorDisconnected)\r
{\r
Atomic<int> audioCallbackGuard { 0 },\r
streamRestartGuard { 0 };\r
\r
- bool isInputLatencyDetectionSupported = false;\r
- int inputLatency = -1;\r
-\r
- bool isOutputLatencyDetectionSupported = false;\r
+ bool isOutputLatencyDetectionSupported = true;\r
int outputLatency = -1;\r
};\r
\r
\r
bool running = false;\r
\r
+ enum\r
+ {\r
+ // These at the moment correspond to OpenSL settings.\r
+ bufferSizeMultForLowLatency = 4,\r
+ bufferSizeMultForSlowAudio = 8,\r
+ defaultBufferSizeIsMultipleOfNative = 1\r
+ };\r
+\r
//==============================================================================\r
static String audioManagerGetProperty (const String& property)\r
{\r
return androidHasSystemFeature ("android.hardware.audio.pro");\r
}\r
\r
- static int getDefaultFramesPerBurst()\r
- {\r
- // NB: this function only works for inbuilt speakers and headphones\r
- auto* env = getEnv();\r
-\r
- auto audioManager = LocalRef<jobject> (env->CallObjectMethod (android.activity,\r
- JuceAppActivity.getSystemService,\r
- javaString ("audio").get()));\r
-\r
- auto propertyJavaString = javaString ("android.media.property.OUTPUT_FRAMES_PER_BUFFER");\r
-\r
- auto framesPerBurstString = LocalRef<jstring> ((jstring) android.activity.callObjectMethod (JuceAppActivity.audioManagerGetProperty,\r
- propertyJavaString.get()));\r
-\r
- return framesPerBurstString != 0 ? env->CallStaticIntMethod (JavaInteger, JavaInteger.parseInt, framesPerBurstString.get(), 10) : 192;\r
- }\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OboeAudioIODevice)\r
};\r
\r
forInput ? oboe::Direction::Input : oboe::Direction::Output,\r
oboe::SharingMode::Shared,\r
forInput ? 1 : 2,\r
- getSDKVersion() >= 21 ? oboe::AudioFormat::Float : oboe::AudioFormat::I16,\r
+ getSdkVersion() >= 21 ? oboe::AudioFormat::Float : oboe::AudioFormat::I16,\r
(int) OboeAudioIODevice::getNativeSampleRate(),\r
OboeAudioIODevice::getNativeBufferSize(),\r
nullptr);\r
\r
int getIndexOfDevice (AudioIODevice* device, bool asInput) const override\r
{\r
- if (auto oboeDevice = static_cast<OboeAudioIODevice*> (device))\r
- {\r
- auto oboeDeviceId = asInput ? oboeDevice->inputDeviceId\r
- : oboeDevice->outputDeviceId;\r
+ if (device == nullptr)\r
+ return -1;\r
\r
- auto& devices = asInput ? inputDevices : outputDevices;\r
+ auto* oboeDevice = static_cast<OboeAudioIODevice*> (device);\r
+ auto oboeDeviceId = asInput ? oboeDevice->inputDeviceId\r
+ : oboeDevice->outputDeviceId;\r
\r
- for (int i = 0; i < devices.size(); ++i)\r
- if (devices.getReference (i).id == oboeDeviceId)\r
- return i;\r
- }\r
+ auto& devices = asInput ? inputDevices : outputDevices;\r
+\r
+ for (int i = 0; i < devices.size(); ++i)\r
+ if (devices.getReference (i).id == oboeDeviceId)\r
+ return i;\r
\r
return -1;\r
}\r
\r
bool supportsDevicesInfo() const\r
{\r
- static auto result = getSDKVersion() >= 23;\r
+ static auto result = getSdkVersion() >= 23;\r
return result;\r
}\r
\r
- int getSDKVersion() const\r
+ int getSdkVersion() const\r
{\r
static auto sdkVersion = getEnv()->GetStaticIntField (AndroidBuildVersion, AndroidBuildVersion.SDK_INT);\r
return sdkVersion;\r
return testStream != nullptr && testStream->openedOk();\r
}\r
\r
- pthread_t startThread (void*(*entry)(void*), void* userPtr)\r
+ pthread_t startThread (void* (*entry) (void*), void* userPtr)\r
{\r
pthread_mutex_lock (&threadReadyMutex);\r
\r
\r
void onErrorBeforeClose (oboe::AudioStream*, oboe::Result error) override\r
{\r
- JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + getOboeString (error));\r
- ignoreUnused (error);\r
- jassertfalse; // Should never get here!\r
+ JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + String (oboe::convertToText (error)));\r
}\r
\r
- void onErrorAfterClose (oboe::AudioStream*, oboe::Result error) override\r
+ void onErrorAfterClose (oboe::AudioStream* stream, oboe::Result error) override\r
{\r
- JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + getOboeString (error));\r
- ignoreUnused (error);\r
- jassertfalse; // Should never get here!\r
+ JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + String (oboe::convertToText (error)));\r
+\r
+ if (error == oboe::Result::ErrorDisconnected)\r
+ {\r
+ testStream.reset();\r
+ testStream.reset (new OboeStream (-1,\r
+ oboe::Direction::Output,\r
+ oboe::SharingMode::Exclusive,\r
+ 1,\r
+ formatUsed,\r
+ (int) OboeAudioIODevice::getNativeSampleRate(),\r
+ OboeAudioIODevice::getNativeBufferSize(),\r
+ this));\r
+ testStream->start();\r
+ }\r
}\r
\r
private:\r
return {};\r
\r
auto threadID = thread->startThread (entry, userPtr);\r
- thread.release(); // the thread will de-allocate itself\r
+\r
+ // the thread will de-allocate itself\r
+ thread.release();\r
+\r
return threadID;\r
}\r
\r
SLInterfaceID_ IntfIID<SLAndroidSimpleBufferQueueItf_>::iid = { 0x198e4940, 0xc5d7, 0x11df, 0xa2a6, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} };\r
SLInterfaceID_ IntfIID<SLAndroidConfigurationItf_>::iid = { 0x89f6a7e0, 0xbeac, 0x11df, 0x8b5c, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} };\r
\r
-template <typename SLObjectType>\r
-static void destroyObject (SLObjectType object)\r
-{\r
- if (object != nullptr && *object != nullptr)\r
- (*object)->Destroy (object);\r
-}\r
-\r
-template <>\r
-struct ContainerDeletePolicy<const SLObjectItf_* const>\r
-{\r
- static void destroy (SLObjectItf object)\r
- {\r
- destroyObject (object);\r
- }\r
-};\r
-\r
//==============================================================================\r
// Some life-time and type management of OpenSL objects\r
class SlObjectRef\r
public:\r
//==============================================================================\r
SlObjectRef() noexcept {}\r
- SlObjectRef (const SlObjectRef& obj) noexcept : cb (obj.cb) {}\r
+ SlObjectRef (const SlObjectRef& obj) noexcept : cb (obj.cb) {}\r
SlObjectRef (SlObjectRef&& obj) noexcept : cb (static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (obj.cb)) { obj.cb = nullptr; }\r
explicit SlObjectRef (SLObjectItf o) : cb (new ControlBlock (o)) {}\r
\r
//==============================================================================\r
- SlObjectRef& operator= (const SlObjectRef& r) noexcept { cb = r.cb; return *this; }\r
- SlObjectRef& operator= (SlObjectRef&& r) noexcept { cb = static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (r.cb); r.cb = nullptr; return *this; }\r
- SlObjectRef& operator= (std::nullptr_t) noexcept { cb = nullptr; return *this; }\r
+ SlObjectRef& operator=(const SlObjectRef& r) noexcept { cb = r.cb; return *this; }\r
+ SlObjectRef& operator=(SlObjectRef&& r) noexcept { cb = static_cast<ReferenceCountedObjectPtr<ControlBlock>&&> (r.cb); r.cb = nullptr; return *this; }\r
+ SlObjectRef& operator=(std::nullptr_t) noexcept { cb = nullptr; return *this; }\r
\r
//==============================================================================\r
- const SLObjectItf_* operator*() noexcept { return *cb->ptr.get(); }\r
- SLObjectItf operator->() noexcept { return (cb == nullptr ? nullptr : cb->ptr.get()); }\r
- operator SLObjectItf() noexcept { return (cb == nullptr ? nullptr : cb->ptr.get()); }\r
+ const SLObjectItf_* const operator*() noexcept { return *cb->ptr.get(); }\r
+ SLObjectItf operator->() noexcept { return (cb == nullptr ? nullptr : cb->ptr.get()); }\r
+ operator SLObjectItf() noexcept { return (cb == nullptr ? nullptr : cb->ptr.get()); }\r
\r
//==============================================================================\r
- bool operator== (nullptr_t) const noexcept { return (cb == nullptr || cb->ptr == nullptr); }\r
- bool operator!= (nullptr_t) const noexcept { return (cb != nullptr && cb->ptr != nullptr); }\r
-\r
+ bool operator== (nullptr_t) const noexcept { return (cb == nullptr || cb->ptr == nullptr); }\r
+ bool operator!= (nullptr_t) const noexcept { return (cb != nullptr && cb->ptr != nullptr); }\r
private:\r
- //==============================================================================\r
- struct ControlBlock : ReferenceCountedObject\r
- {\r
- ControlBlock() = default;\r
- ControlBlock (SLObjectItf o) : ptr (o) {}\r
-\r
- std::unique_ptr<const SLObjectItf_* const> ptr;\r
- };\r
\r
+ //==============================================================================\r
+ struct ControlBlock : ReferenceCountedObject { std::unique_ptr<const SLObjectItf_* const> ptr; ControlBlock() {} ControlBlock (SLObjectItf o) : ptr (o) {} };\r
ReferenceCountedObjectPtr<ControlBlock> cb;\r
};\r
\r
{\r
public:\r
//==============================================================================\r
- SlRef() noexcept {}\r
- SlRef (const SlRef& r) noexcept : SlObjectRef (r), type (r.type) {}\r
+ SlRef() noexcept : type (nullptr) {}\r
+ SlRef (SlRef& r) noexcept : SlObjectRef (r), type (r.type) {}\r
SlRef (SlRef&& r) noexcept : SlObjectRef (static_cast<SlRef&&> (r)), type (r.type) { r.type = nullptr; }\r
\r
//==============================================================================\r
SlRef& operator= (const SlRef& r) noexcept { SlObjectRef::operator= (r); type = r.type; return *this; }\r
- SlRef& operator= (SlRef&& r) noexcept { SlObjectRef::operator= (static_cast<SlObjectRef&&> (r)); type = r.type; r.type = nullptr; return *this; }\r
- SlRef& operator= (std::nullptr_t) noexcept { SlObjectRef::operator= (nullptr); type = nullptr; return *this; }\r
+ SlRef& operator= (SlRef&& r) noexcept { SlObjectRef::operator= (static_cast<SlObjectRef&&> (r)); type = r.type; r.type = nullptr; return *this; }\r
+ SlRef& operator= (std::nullptr_t) noexcept { SlObjectRef::operator= (nullptr); type = nullptr; return *this; }\r
\r
//==============================================================================\r
- T* const operator*() noexcept { return *type; }\r
- T* const* operator->() noexcept { return type; }\r
- operator T* const*() noexcept { return type; }\r
+ T* const operator*() noexcept { return *type; }\r
+ T* const * operator->() noexcept { return type; }\r
+ operator T* const *() noexcept { return type; }\r
\r
//==============================================================================\r
- static SlRef cast (SlObjectRef& base) { return SlRef (base); }\r
- static SlRef cast (SlObjectRef&& base) { return SlRef (static_cast<SlObjectRef&&> (base)); }\r
-\r
+ static SlRef cast (SlObjectRef& base) { return SlRef (base); }\r
+ static SlRef cast (SlObjectRef&& base) { return SlRef (static_cast<SlObjectRef&&> (base)); }\r
private:\r
+ //==============================================================================\r
SlRef (SlObjectRef& base) : SlObjectRef (base)\r
{\r
- if (auto obj = SlObjectRef::operator->())\r
- {\r
- auto err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
-\r
- if (type != nullptr && err == SL_RESULT_SUCCESS)\r
- return;\r
- }\r
-\r
- *this = nullptr;\r
+ SLObjectItf obj = SlObjectRef::operator->();\r
+ SLresult err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
+ if (type == nullptr || err != SL_RESULT_SUCCESS)\r
+ *this = nullptr;\r
}\r
\r
SlRef (SlObjectRef&& base) : SlObjectRef (static_cast<SlObjectRef&&> (base))\r
{\r
- if (auto obj = SlObjectRef::operator->())\r
- {\r
- auto err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
- base = nullptr;\r
+ SLObjectItf obj = SlObjectRef::operator->();\r
+ SLresult err = (*obj)->GetInterface (obj, &IntfIID<T>::iid, &type);\r
+ base = nullptr;\r
\r
- if (type != nullptr && err == SL_RESULT_SUCCESS)\r
- return;\r
- }\r
-\r
- *this = nullptr;\r
+ if (type == nullptr || err != SL_RESULT_SUCCESS)\r
+ *this = nullptr;\r
}\r
+ T* const * type;\r
+};\r
\r
- T* const* type = nullptr;\r
+template <>\r
+struct ContainerDeletePolicy<const SLObjectItf_* const>\r
+{\r
+ static void destroy (SLObjectItf object)\r
+ {\r
+ if (object != nullptr)\r
+ (*object)->Destroy (object);\r
+ }\r
};\r
\r
//==============================================================================\r
numChannels (numChannelsToUse),\r
nativeBuffer (static_cast<size_t> (numChannels * owner.bufferSize * owner.numBuffers)),\r
scratchBuffer (numChannelsToUse, owner.bufferSize),\r
- sampleBuffer (scratchBuffer.getArrayOfWritePointers(), numChannelsToUse, owner.bufferSize)\r
+ sampleBuffer (scratchBuffer.getArrayOfWritePointers(), numChannelsToUse, owner.bufferSize),\r
+ nextBlock (0), numBlocksOut (0)\r
{}\r
\r
~OpenSLQueueRunner()\r
bool init()\r
{\r
runner = crtp().createPlayerOrRecorder();\r
-\r
if (runner == nullptr)\r
return false;\r
\r
}\r
\r
queue = SlRef<SLAndroidSimpleBufferQueueItf_>::cast (runner);\r
-\r
if (queue == nullptr)\r
return false;\r
\r
return ((*queue)->RegisterCallback (queue, staticFinished, this) == SL_RESULT_SUCCESS);\r
}\r
\r
+\r
void clear()\r
{\r
nextBlock.set (0);\r
HeapBlock<T> nativeBuffer;\r
AudioBuffer<float> scratchBuffer, sampleBuffer;\r
\r
- Atomic<int> nextBlock { 0 }, numBlocksOut { 0 };\r
+ Atomic<int> nextBlock, numBlocksOut;\r
};\r
\r
//==============================================================================\r
{\r
using Base = OpenSLQueueRunner<T, OpenSLQueueRunnerPlayer<T>, SLPlayItf_>;\r
\r
+ enum { isPlayer = 1 };\r
+\r
OpenSLQueueRunnerPlayer (OpenSLSessionT<T>& sessionToUse, int numChannelsToUse)\r
: Base (sessionToUse, numChannelsToUse)\r
{}\r
\r
SlRef<SLPlayItf_> createPlayerOrRecorder()\r
{\r
- SLDataLocator_AndroidSimpleBufferQueue queueLocator = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers) };\r
- SLDataLocator_OutputMix outputMix = { SL_DATALOCATOR_OUTPUTMIX, Base::owner.outputMix };\r
+ SLDataLocator_AndroidSimpleBufferQueue queueLocator = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers)};\r
+ SLDataLocator_OutputMix outputMix = {SL_DATALOCATOR_OUTPUTMIX, Base::owner.outputMix};\r
\r
PCMDataFormatEx dataFormat;\r
BufferHelpers<T>::initPCMDataFormat (dataFormat, Base::numChannels, Base::owner.sampleRate);\r
\r
- SLDataSource source = { &queueLocator, &dataFormat };\r
- SLDataSink sink = { &outputMix, nullptr };\r
+ SLDataSource source = {&queueLocator, &dataFormat};\r
+ SLDataSink sink = {&outputMix, nullptr};\r
\r
SLInterfaceID queueInterfaces[] = { &IntfIID<SLAndroidSimpleBufferQueueItf_>::iid, &IntfIID<SLAndroidConfigurationItf_>::iid };\r
SLboolean interfaceRequired[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE};\r
\r
SLObjectItf obj = nullptr;\r
\r
- if (auto e = *Base::owner.engine)\r
+ SLresult status = (*Base::owner.engine)->CreateAudioPlayer (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+ if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- auto status = e->CreateAudioPlayer (Base::owner.engine, &obj, &source, &sink, 2,\r
- queueInterfaces, interfaceRequired);\r
+ if (obj != nullptr)\r
+ (*obj)->Destroy (obj);\r
\r
- if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize(obj, 0) != SL_RESULT_SUCCESS)\r
- {\r
- destroyObject (obj);\r
- return {};\r
- }\r
+ return SlRef<SLPlayItf_>();\r
}\r
\r
return SlRef<SLPlayItf_>::cast (SlObjectRef (obj));\r
};\r
\r
template <typename T>\r
- struct OpenSLQueueRunnerRecorder : public OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>\r
+ struct OpenSLQueueRunnerRecorder : OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>\r
{\r
using Base = OpenSLQueueRunner<T, OpenSLQueueRunnerRecorder<T>, SLRecordItf_>;\r
\r
+ enum { isPlayer = 0 };\r
+\r
OpenSLQueueRunnerRecorder (OpenSLSessionT<T>& sessionToUse, int numChannelsToUse)\r
: Base (sessionToUse, numChannelsToUse)\r
{}\r
\r
SlRef<SLRecordItf_> createPlayerOrRecorder()\r
{\r
- SLDataLocator_IODevice ioDeviceLocator = { SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr };\r
- SLDataLocator_AndroidSimpleBufferQueue queueLocator = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers) };\r
+ SLDataLocator_IODevice ioDeviceLocator = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr};\r
+ SLDataLocator_AndroidSimpleBufferQueue queueLocator = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, static_cast<SLuint32> (Base::owner.numBuffers)};\r
\r
PCMDataFormatEx dataFormat;\r
BufferHelpers<T>::initPCMDataFormat (dataFormat, Base::numChannels, Base::owner.sampleRate);\r
\r
- SLDataSource source = { &ioDeviceLocator, nullptr };\r
- SLDataSink sink = { &queueLocator, &dataFormat };\r
+ SLDataSource source = {&ioDeviceLocator, nullptr};\r
+ SLDataSink sink = {&queueLocator, &dataFormat};\r
\r
SLInterfaceID queueInterfaces[] = { &IntfIID<SLAndroidSimpleBufferQueueItf_>::iid, &IntfIID<SLAndroidConfigurationItf_>::iid };\r
- SLboolean interfaceRequired[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE };\r
+ SLboolean interfaceRequired[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE};\r
\r
SLObjectItf obj = nullptr;\r
\r
- if (auto e = *Base::owner.engine)\r
+ SLresult status = (*Base::owner.engine)->CreateAudioRecorder (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+ if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- auto status = e->CreateAudioRecorder (Base::owner.engine, &obj, &source, &sink, 2, queueInterfaces, interfaceRequired);\r
+ if (obj != nullptr)\r
+ (*obj)->Destroy (obj);\r
\r
- if (status != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
- {\r
- destroyObject (obj);\r
- return {};\r
- }\r
+ return SlRef<SLRecordItf_>();\r
}\r
\r
- return SlRef<SLRecordItf_>::cast (SlObjectRef (obj));\r
+ SlRef<SLRecordItf_> recorder = SlRef<SLRecordItf_>::cast (SlObjectRef (obj));\r
+\r
+ return recorder;\r
}\r
\r
bool setAudioPreprocessingEnabled (bool shouldEnable)\r
if (Base::config != nullptr)\r
{\r
const bool supportsUnprocessed = (getEnv()->GetStaticIntField (AndroidBuildVersion, AndroidBuildVersion.SDK_INT) >= 25);\r
-\r
const SLuint32 recordingPresetValue\r
= (shouldEnable ? SL_ANDROID_RECORDING_PRESET_GENERIC\r
: (supportsUnprocessed ? SL_ANDROID_RECORDING_PRESET_UNPROCESSED\r
: SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION));\r
\r
- auto status = (*Base::config)->SetConfiguration (Base::config, SL_ANDROID_KEY_RECORDING_PRESET,\r
- &recordingPresetValue, sizeof (recordingPresetValue));\r
+ SLresult status = (*Base::config)->SetConfiguration (Base::config, SL_ANDROID_KEY_RECORDING_PRESET,\r
+ &recordingPresetValue, sizeof (recordingPresetValue));\r
\r
return (status == SL_RESULT_SUCCESS);\r
}\r
return false;\r
}\r
\r
- void setState (bool running) { (*Base::runner)->SetRecordState (Base::runner, running ? SL_RECORDSTATE_RECORDING\r
- : SL_RECORDSTATE_STOPPED); }\r
+ void setState (bool running) { (*Base::runner)->SetRecordState (Base::runner, running ? SL_RECORDSTATE_RECORDING : SL_RECORDSTATE_STOPPED); }\r
};\r
\r
//==============================================================================\r
double samleRateToUse, int bufferSizeToUse,\r
int numBuffersToUse)\r
: inputChannels (numInputChannels), outputChannels (numOutputChannels),\r
- sampleRate (samleRateToUse), bufferSize (bufferSizeToUse), numBuffers (numBuffersToUse)\r
+ sampleRate (samleRateToUse), bufferSize (bufferSizeToUse), numBuffers (numBuffersToUse),\r
+ running (false), audioProcessingEnabled (true), callback (nullptr)\r
{\r
jassert (numInputChannels > 0 || numOutputChannels > 0);\r
\r
- if (auto createEngine = (CreateEngineFunc) slLibraryToUse.getFunction ("slCreateEngine"))\r
+ if (CreateEngineFunc createEngine = (CreateEngineFunc) slLibraryToUse.getFunction ("slCreateEngine"))\r
{\r
SLObjectItf obj = nullptr;\r
- auto err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
\r
- if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr\r
- || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
+ SLresult err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
+ if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- destroyObject (obj);\r
+ if (obj != nullptr)\r
+ (*obj)->Destroy (obj);\r
+\r
return;\r
}\r
\r
if (outputChannels > 0)\r
{\r
SLObjectItf obj = nullptr;\r
- auto err = (*engine)->CreateOutputMix (engine, &obj, 0, nullptr, nullptr);\r
\r
- if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr\r
- || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
+ SLresult err = (*engine)->CreateOutputMix (engine, &obj, 0, nullptr, nullptr);\r
+ if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- destroyObject (obj);\r
+ if (obj != nullptr)\r
+ (*obj)->Destroy (obj);\r
+\r
return;\r
}\r
\r
virtual bool openedOK() const { return (engine != nullptr && (outputChannels == 0 || (outputMix != nullptr))); }\r
virtual void start() { stop(); jassert (callback.get() != nullptr); running = true; }\r
virtual void stop() { running = false; }\r
-\r
virtual bool setAudioPreprocessingEnabled (bool shouldEnable) = 0;\r
virtual bool supportsFloatingPoint() const noexcept = 0;\r
virtual int getXRunCount() const noexcept = 0;\r
jassert (callbackToUse != nullptr);\r
\r
// spin-lock until we can set the callback\r
- for (;;)\r
+ while (true)\r
{\r
- auto old = callback.get();\r
-\r
+ AudioIODeviceCallback* old = callback.get();\r
if (old == callbackToUse)\r
break;\r
\r
\r
void process (const float** inputChannelData, float** outputChannelData)\r
{\r
- if (auto* cb = callback.exchange (nullptr))\r
+ if (AudioIODeviceCallback* cb = callback.exchange(nullptr))\r
{\r
cb->audioDeviceIOCallback (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize);\r
callback.set (cb);\r
int numBuffersToUse);\r
\r
//==============================================================================\r
- using CreateEngineFunc = SLresult (*) (SLObjectItf*, SLuint32, const SLEngineOption*,\r
- SLuint32, const SLInterfaceID*, const SLboolean*);\r
+ typedef SLresult (*CreateEngineFunc)(SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32, const SLInterfaceID*, const SLboolean*);\r
\r
//==============================================================================\r
int inputChannels, outputChannels;\r
double sampleRate;\r
int bufferSize, numBuffers;\r
- bool running = false, audioProcessingEnabled = true;\r
+\r
+ bool running, audioProcessingEnabled;\r
\r
SlRef<SLEngineItf_> engine;\r
SlRef<SLOutputMixItf_> outputMix;\r
\r
- Atomic<AudioIODeviceCallback*> callback { nullptr };\r
+ Atomic<AudioIODeviceCallback*> callback;\r
};\r
\r
template <typename T>\r
int numInputChannels, int numOutputChannels,\r
double samleRateToUse, int bufferSizeToUse,\r
int numBuffersToUse)\r
- : OpenSLSession (slLibraryToUse, numInputChannels, numOutputChannels,\r
- samleRateToUse, bufferSizeToUse, numBuffersToUse)\r
+ : OpenSLSession (slLibraryToUse, numInputChannels, numOutputChannels, samleRateToUse, bufferSizeToUse, numBuffersToUse)\r
{\r
jassert (numInputChannels > 0 || numOutputChannels > 0);\r
\r
\r
bool openedOK() const override\r
{\r
- return OpenSLSession::openedOK() && (inputChannels == 0 || recorder != nullptr)\r
- && (outputChannels == 0 || player != nullptr);\r
+ return (OpenSLSession::openedOK() && (inputChannels == 0 || recorder != nullptr)\r
+ && (outputChannels == 0 || player != nullptr));\r
}\r
\r
void start() override\r
};\r
\r
//==============================================================================\r
- OpenSLAudioIODevice (const String& deviceName) : AudioIODevice (deviceName, openSLTypeName)\r
+ OpenSLAudioIODevice (const String& deviceName)\r
+ : AudioIODevice (deviceName, openSLTypeName),\r
+ actualBufferSize (0), sampleRate (0), audioBuffersToEnqueue (0),\r
+ audioProcessingEnabled (true),\r
+ callback (nullptr)\r
{\r
// OpenSL has piss-poor support for determining latency, so the only way I can find to\r
// get a number for this is by asking the AudioTrack/AudioRecord classes..\r
\r
Array<double> getAvailableSampleRates() override\r
{\r
- // see https://developer.android.com/ndk/guides/audio/opensl-for-android.html\r
+ //see https://developer.android.com/ndk/guides/audio/opensl-for-android.html\r
\r
static const double rates[] = { 8000.0, 11025.0, 12000.0, 16000.0,\r
22050.0, 24000.0, 32000.0, 44100.0, 48000.0 };\r
\r
// make sure the native sample rate is pafrt of the list\r
double native = getNativeSampleRate();\r
-\r
if (native != 0.0 && ! retval.contains (native))\r
retval.add (native);\r
\r
close();\r
\r
lastError.clear();\r
-\r
- sampleRate = (int) (requestedSampleRate > 0 ? requestedSampleRate : getNativeSampleRate());\r
+ sampleRate = (int) requestedSampleRate;\r
\r
auto totalPreferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize;\r
auto nativeBufferSize = getNativeBufferSize();\r
\r
activeOutputChans = outputChannels;\r
activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false);\r
- auto numOutputChannels = activeOutputChans.countNumberOfSetBits();\r
+ int numOutputChannels = activeOutputChans.countNumberOfSetBits();\r
\r
activeInputChans = inputChannels;\r
activeInputChans.setRange (1, activeInputChans.getHighestBit(), false);\r
- auto numInputChannels = activeInputChans.countNumberOfSetBits();\r
+ int numInputChannels = activeInputChans.countNumberOfSetBits();\r
\r
if (numInputChannels > 0 && (! RuntimePermissions::isGranted (RuntimePermissions::recordAudio)))\r
{\r
session.reset (OpenSLSession::create (slLibrary, numInputChannels, numOutputChannels,\r
sampleRate, actualBufferSize, audioBuffersToEnqueue));\r
if (session != nullptr)\r
- {\r
session->setAudioPreprocessingEnabled (audioProcessingEnabled);\r
- }\r
else\r
{\r
if (numInputChannels > 0 && numOutputChannels > 0 && RuntimePermissions::isGranted (RuntimePermissions::recordAudio))\r
{\r
if (session != nullptr && callback != newCallback)\r
{\r
- auto oldCallback = callback;\r
+ AudioIODeviceCallback* oldCallback = callback;\r
\r
if (newCallback != nullptr)\r
newCallback->audioDeviceAboutToStart (this);\r
\r
//==============================================================================\r
DynamicLibrary slLibrary;\r
- int actualBufferSize = 0, sampleRate = 0, audioBuffersToEnqueue = 0;\r
+ int actualBufferSize, sampleRate, audioBuffersToEnqueue;\r
int inputLatency, outputLatency;\r
- bool deviceOpen = false, audioProcessingEnabled = true;\r
+ bool deviceOpen, audioProcessingEnabled;\r
String lastError;\r
BigInteger activeOutputChans, activeInputChans;\r
- AudioIODeviceCallback* callback = nullptr;\r
+ AudioIODeviceCallback* callback;\r
\r
std::unique_ptr<OpenSLSession> session;\r
\r
SLObjectItf obj = nullptr;\r
auto err = createEngine (&obj, 0, nullptr, 0, nullptr, nullptr);\r
\r
- if (err != SL_RESULT_SUCCESS || obj == nullptr || *obj == nullptr)\r
+ if (err != SL_RESULT_SUCCESS || obj == nullptr)\r
return;\r
\r
if ((*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
if (engine == nullptr)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
if (err != SL_RESULT_SUCCESS || obj == nullptr || (*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
if (outputMix == nullptr)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
if ((*obj)->Realize (obj, 0) != SL_RESULT_SUCCESS)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
if (player == nullptr)\r
{\r
- destroyObject (obj);\r
+ (*obj)->Destroy (obj);\r
return;\r
}\r
\r
\r
setAudioSessionActive (true);\r
updateHardwareInfo();\r
- channelData.reconfigure ({}, {});\r
setAudioSessionActive (false);\r
\r
+ channelData.reconfigure ({}, {});\r
+\r
sessionHolder->activeDevices.add (this);\r
}\r
\r
<< ", targetSampleRate: " << targetSampleRate\r
<< ", targetBufferSize: " << targetBufferSize);\r
\r
- setAudioSessionActive (true);\r
-\r
channelData.reconfigure (requestedInputChannels, requestedOutputChannels);\r
\r
setAudioSessionCategory (channelData.areInputChannelsAvailable() ? AVAudioSessionCategoryPlayAndRecord : AVAudioSessionCategoryPlayback);\r
+ setAudioSessionActive (true);\r
\r
setTargetSampleRateAndBufferSize();\r
\r
if (cardNum < 0)\r
break;\r
\r
- if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toRawUTF8(), SND_CTL_NONBLOCK)) >= 0)\r
+ if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toUTF8(), SND_CTL_NONBLOCK)) >= 0)\r
{\r
if (JUCE_CHECKED_RESULT (snd_ctl_card_info (handle, info)) >= 0)\r
{\r
namespace juce\r
{\r
\r
-//==============================================================================\r
-class BelaMidiInput\r
-{\r
-public:\r
- static Array<BelaMidiInput*> midiInputs;\r
-\r
- BelaMidiInput (const String& port, MidiInput* input, MidiInputCallback* callback)\r
- : midiInput (input), midiPort (port), midiCallback (callback)\r
- {\r
- jassert (midiCallback != nullptr);\r
- midiInputs.add (this);\r
- }\r
-\r
- ~BelaMidiInput()\r
- {\r
- stop();\r
- midiInputs.removeAllInstancesOf (this);\r
- }\r
-\r
- void start()\r
- {\r
- midi.readFrom (midiPort.toRawUTF8());\r
- }\r
-\r
- void stop()\r
- {\r
- midi.enableParser (false);\r
- }\r
-\r
- void poll()\r
- {\r
- for (;;)\r
- {\r
- auto data = midi.getInput();\r
-\r
- if (data < 0)\r
- break;\r
-\r
- auto byte = (uint8) data;\r
- concatenator.pushMidiData (&byte, 1, 0.0, midiInput, *midiCallback);\r
- }\r
- }\r
-\r
- static StringArray getDevices (bool input)\r
- {\r
- StringArray devices;\r
-\r
- for (auto& card : findAllALSACardIDs())\r
- findMidiDevices (devices, input, card);\r
-\r
- return devices;\r
- }\r
-\r
-private:\r
- static Array<int> findAllALSACardIDs()\r
- {\r
- Array<int> cards;\r
- int card = -1;\r
-\r
- for (;;)\r
- {\r
- auto status = snd_card_next (&card);\r
-\r
- if (status != 0 || card < 0)\r
- break;\r
-\r
- cards.add (card);\r
- }\r
-\r
- return cards;\r
- }\r
-\r
- // Adds all midi devices to the devices array of the given input/output type on the given card\r
- static void findMidiDevices (StringArray& devices, bool input, int cardNum)\r
- {\r
- snd_ctl_t* ctl = nullptr;\r
- auto status = snd_ctl_open (&ctl, ("hw:" + String (cardNum)).toRawUTF8(), 0);\r
-\r
- if (status < 0)\r
- return;\r
-\r
- int device = -1;\r
-\r
- for (;;)\r
- {\r
- status = snd_ctl_rawmidi_next_device (ctl, &device);\r
-\r
- if (status < 0 || device < 0)\r
- break;\r
-\r
- snd_rawmidi_info_t* info;\r
- snd_rawmidi_info_alloca (&info);\r
-\r
- snd_rawmidi_info_set_device (info, device);\r
- snd_rawmidi_info_set_stream (info, input ? SND_RAWMIDI_STREAM_INPUT\r
- : SND_RAWMIDI_STREAM_OUTPUT);\r
-\r
- snd_ctl_rawmidi_info (ctl, info);\r
-\r
- auto subCount = snd_rawmidi_info_get_subdevices_count (info);\r
-\r
- for (int sub = 0; sub < subCount; ++sub)\r
- {\r
- snd_rawmidi_info_set_subdevice (info, sub);\r
-\r
- status = snd_ctl_rawmidi_info (ctl, info);\r
-\r
- if (status == 0)\r
- devices.add ("hw:" + String (cardNum) + ","\r
- + String (device) + ","\r
- + String (sub));\r
- }\r
- }\r
-\r
- snd_ctl_close (ctl);\r
- }\r
-\r
- String midiPort;\r
- MidiInput* const midiInput;\r
- MidiInputCallback* const midiCallback;\r
-\r
- Midi midi;\r
- MidiDataConcatenator concatenator { 512 };\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BelaMidiInput)\r
-};\r
-\r
-Array<BelaMidiInput*> BelaMidiInput::midiInputs;\r
-\r
-\r
//==============================================================================\r
class BelaAudioIODevice : public AudioIODevice\r
{\r
Bela_defaultSettings (&defaultSettings);\r
}\r
\r
- ~BelaAudioIODevice()\r
- {\r
- close();\r
- }\r
+ ~BelaAudioIODevice() {}\r
\r
//==============================================================================\r
StringArray getOutputChannelNames() override { return { "Out #1", "Out #2" }; }\r
\r
ScopedLock lock (callbackLock);\r
\r
- // Check for and process and midi\r
- for (auto midiInput : BelaMidiInput::midiInputs)\r
- midiInput->poll();\r
-\r
if (callback != nullptr)\r
{\r
jassert (context.audioFrames <= actualBufferSize);\r
return new BelaAudioIODeviceType();\r
}\r
\r
-\r
-//==============================================================================\r
-// TODO: Add Bela MidiOutput support\r
-\r
-StringArray MidiOutput::getDevices() { return {}; }\r
-int MidiOutput::getDefaultDeviceIndex() { return 0; }\r
-MidiOutput* MidiOutput::openDevice (int) { return {}; }\r
-MidiOutput* MidiOutput::createNewDevice (const String&) { return {}; }\r
-MidiOutput::~MidiOutput() {}\r
-void MidiOutput::sendMessageNow (const MidiMessage&) {}\r
-\r
-\r
-//==============================================================================\r
-MidiInput::MidiInput (const String& nm) : name (nm) {}\r
-\r
-MidiInput::~MidiInput()\r
-{\r
- delete static_cast<BelaMidiInput*> (internal);\r
-}\r
-\r
-void MidiInput::start() { static_cast<BelaMidiInput*> (internal)->start(); }\r
-void MidiInput::stop() { static_cast<BelaMidiInput*> (internal)->stop(); }\r
-\r
-int MidiInput::getDefaultDeviceIndex()\r
-{\r
- return 0;\r
-}\r
-\r
-StringArray MidiInput::getDevices()\r
-{\r
- return BelaMidiInput::getDevices (true);\r
-}\r
-\r
-MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback)\r
-{\r
- auto devices = getDevices();\r
-\r
- if (index >= 0 && index < devices.size())\r
- {\r
- auto deviceName = devices[index];\r
- auto result = new MidiInput (deviceName);\r
- result->internal = new BelaMidiInput (deviceName, result, callback);\r
- return result;\r
- }\r
-\r
- return {};\r
-}\r
-\r
-MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
-{\r
- jassertfalse; // N/A on Bela\r
- return {};\r
-}\r
-\r
} // namespace juce\r
\r
#if JUCE_ALSA\r
\r
+// You can define these strings in your app if you want to override the default names:\r
+#ifndef JUCE_ALSA_MIDI_NAME\r
+ #define JUCE_ALSA_MIDI_NAME JUCEApplicationBase::getInstance()->getApplicationName().toUTF8()\r
+#endif\r
+\r
//==============================================================================\r
namespace\r
{\r
class AlsaClient : public ReferenceCountedObject\r
{\r
public:\r
- AlsaClient()\r
- {\r
- jassert (instance == nullptr);\r
-\r
- snd_seq_open (&handle, "default", SND_SEQ_OPEN_DUPLEX, 0);\r
-\r
- if (handle != nullptr)\r
- {\r
- snd_seq_nonblock (handle, SND_SEQ_NONBLOCK);\r
- snd_seq_set_client_name (handle, getAlsaMidiName().toRawUTF8());\r
- clientId = snd_seq_client_id (handle);\r
-\r
- // It's good idea to pre-allocate a good number of elements\r
- ports.ensureStorageAllocated (32);\r
- }\r
- }\r
-\r
- ~AlsaClient()\r
- {\r
- jassert (instance != nullptr);\r
- instance = nullptr;\r
-\r
- if (handle != nullptr)\r
- snd_seq_close (handle);\r
-\r
- jassert (activeCallbacks.get() == 0);\r
-\r
- if (inputThread)\r
- inputThread->stopThread (3000);\r
- }\r
-\r
- static String getAlsaMidiName()\r
- {\r
- #ifdef JUCE_ALSA_MIDI_NAME\r
- return JUCE_ALSA_MIDI_NAME;\r
- #else\r
- if (auto* app = JUCEApplicationBase::getInstance())\r
- return app->getApplicationName();\r
-\r
- return "JUCE";\r
- #endif\r
- }\r
-\r
using Ptr = ReferenceCountedObjectPtr<AlsaClient>;\r
\r
//==============================================================================\r
snd_seq_ev_clear (&event);\r
\r
auto numBytes = (long) message.getRawDataSize();\r
- auto* data = message.getRawData();\r
+ const uint8* data = message.getRawData();\r
\r
- auto seqHandle = client.get();\r
+ auto* seqHandle = client.get();\r
bool success = true;\r
\r
while (numBytes > 0)\r
\r
void createPort (const String& name, bool enableSubscription)\r
{\r
- if (auto seqHandle = client.get())\r
+ if (auto* seqHandle = client.get())\r
{\r
const unsigned int caps =\r
- isInput ? (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_WRITE : 0))\r
- : (SND_SEQ_PORT_CAP_READ | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_READ : 0));\r
-\r
+ isInput\r
+ ? (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_WRITE : 0))\r
+ : (SND_SEQ_PORT_CAP_WRITE | (enableSubscription ? SND_SEQ_PORT_CAP_SUBS_READ : 0));\r
portId = snd_seq_create_simple_port (seqHandle, name.toUTF8(), caps,\r
SND_SEQ_PORT_TYPE_MIDI_GENERIC |\r
SND_SEQ_PORT_TYPE_APPLICATION);\r
\r
static AlsaClient* instance;\r
\r
+ //==============================================================================\r
+ friend class ReferenceCountedObjectPtr<AlsaClient>;\r
+ friend struct ContainerDeletePolicy<AlsaClient>;\r
+\r
+ AlsaClient()\r
+ {\r
+ jassert (instance == nullptr);\r
+\r
+ snd_seq_open (&handle, "default", SND_SEQ_OPEN_DUPLEX, 0);\r
+ snd_seq_nonblock (handle, SND_SEQ_NONBLOCK);\r
+ snd_seq_set_client_name (handle, JUCE_ALSA_MIDI_NAME);\r
+ clientId = snd_seq_client_id(handle);\r
+\r
+ // It's good idea to pre-allocate a good number of elements\r
+ ports.ensureStorageAllocated (32);\r
+ }\r
+\r
+ ~AlsaClient()\r
+ {\r
+ jassert (instance != nullptr);\r
+\r
+ instance = nullptr;\r
+\r
+ if (handle != nullptr)\r
+ snd_seq_close (handle);\r
+\r
+ jassert (activeCallbacks.get() == 0);\r
+\r
+ if (inputThread)\r
+ inputThread->stopThread (3000);\r
+ }\r
+\r
//==============================================================================\r
class MidiInputThread : public Thread\r
{\r
\r
void run() override\r
{\r
- auto seqHandle = client.get();\r
-\r
const int maxEventSize = 16 * 1024;\r
snd_midi_event_t* midiParser;\r
+ snd_seq_t* seqHandle = client.get();\r
\r
if (snd_midi_event_new (maxEventSize, &midiParser) >= 0)\r
{\r
if (snd_seq_event_input (seqHandle, &inputEvent) >= 0)\r
{\r
// xxx what about SYSEXes that are too big for the buffer?\r
- auto numBytes = snd_midi_event_decode (midiParser, buffer,\r
- maxEventSize, inputEvent);\r
+ const long numBytes = snd_midi_event_decode (midiParser, buffer,\r
+ maxEventSize, inputEvent);\r
\r
snd_midi_event_reset_decode (midiParser);\r
\r
{\r
AlsaClient::Port* port = nullptr;\r
\r
- auto seqHandle = client->get();\r
+ snd_seq_t* seqHandle = client->get();\r
snd_seq_port_info_t* portInfo = nullptr;\r
\r
snd_seq_port_info_alloca (&portInfo);\r
AlsaClient::Port* port = nullptr;\r
auto client = AlsaClient::getInstance();\r
\r
- if (auto seqHandle = client->get())\r
+ if (auto* seqHandle = client->get())\r
{\r
snd_seq_system_info_t* systemInfo = nullptr;\r
snd_seq_client_info_t* clientInfo = nullptr;\r
}\r
\r
//==============================================================================\r
-MidiInput::MidiInput (const String& nm) : name (nm)\r
+MidiInput::MidiInput (const String& nm)\r
+ : name (nm), internal (nullptr)\r
{\r
}\r
\r
\r
MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback)\r
{\r
+ MidiInput* newDevice = nullptr;\r
+\r
StringArray devices;\r
auto* port = iterateMidiDevices (true, devices, deviceIndex);\r
\r
\r
jassert (port->isValid());\r
\r
- auto newDevice = new MidiInput (devices [deviceIndex]);\r
+ newDevice = new MidiInput (devices [deviceIndex]);\r
port->setupInput (newDevice, callback);\r
newDevice->internal = port;\r
+\r
return newDevice;\r
}\r
\r
MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
{\r
+ MidiInput* newDevice = nullptr;\r
+\r
auto client = AlsaClient::getInstance();\r
auto* port = client->createPort (deviceName, true, true);\r
\r
jassert (port->isValid());\r
\r
- auto newDevice = new MidiInput (deviceName);\r
+ newDevice = new MidiInput (deviceName);\r
port->setupInput (newDevice, callback);\r
newDevice->internal = port;\r
+\r
return newDevice;\r
}\r
\r
MidiOutput::~MidiOutput() {}\r
void MidiOutput::sendMessageNow (const MidiMessage&) {}\r
\r
-MidiInput::MidiInput (const String& nm) : name (nm) {}\r
+MidiInput::MidiInput (const String& nm) : name (nm), internal (nullptr) {}\r
MidiInput::~MidiInput() {}\r
void MidiInput::start() {}\r
void MidiInput::stop() {}\r
\r
if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges)))\r
{\r
- for (auto r : { 8000, 11025, 16000, 22050, 32000,\r
- 44100, 48000, 88200, 96000, 176400,\r
- 192000, 352800, 384000, 705600, 768000 })\r
- {\r
- auto rate = (double) r;\r
+ static const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 384000.0 };\r
\r
+ for (int i = 0; i < numElementsInArray (possibleRates); ++i)\r
+ {\r
for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;)\r
{\r
- if (rate >= ranges[j].mMinimum - 2 && rate <= ranges[j].mMaximum + 2)\r
+ if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2)\r
{\r
- newSampleRates.add (rate);\r
+ newSampleRates.add (possibleRates[i]);\r
break;\r
}\r
}\r
inputChannelInfo.swapWith (newInChans);\r
outputChannelInfo.swapWith (newOutChans);\r
\r
- numInputChans = inputChannelInfo.size();\r
- numOutputChans = outputChannelInfo.size();\r
-\r
allocateTempBuffers();\r
}\r
\r
\r
OSType typeId = types[index];\r
\r
- OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (typeId), &typeId));\r
+ OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (typeId), &typeId));\r
}\r
}\r
}\r
pa.mScope = kAudioObjectPropertyScopeGlobal;\r
pa.mElement = kAudioObjectPropertyElementMaster;\r
Float64 sr = newSampleRate;\r
- return OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (sr), &sr));\r
+ return OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (sr), &sr));\r
}\r
\r
//==============================================================================\r
pa.mElement = kAudioObjectPropertyElementMaster;\r
UInt32 framesPerBuf = (UInt32) bufferSizeSamples;\r
\r
- if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, nullptr, sizeof (framesPerBuf), &framesPerBuf)))\r
+ if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (framesPerBuf), &framesPerBuf)))\r
{\r
updateDetailsFromDevice();\r
error = "Couldn't change buffer size";\r
else\r
{\r
OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID));\r
- audioProcID = {};\r
+ audioProcID = 0;\r
}\r
}\r
}\r
{\r
OK (AudioDeviceStop (deviceID, audioIOProc));\r
OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID));\r
- audioProcID = {};\r
+ audioProcID = 0;\r
\r
started = false;\r
\r
\r
for (int i = numOutputChans; --i >= 0;)\r
{\r
- auto& info = outputChannelInfo.getReference (i);\r
+ auto& info = outputChannelInfo.getReference(i);\r
auto src = tempOutputBuffers[i];\r
auto dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) + info.dataOffsetSamples;\r
auto stride = info.dataStrideSamples;\r
Array<double> sampleRates;\r
Array<int> bufferSizes;\r
AudioIODeviceCallback* callback = nullptr;\r
- AudioDeviceIOProcID audioProcID = {};\r
+ AudioDeviceIOProcID audioProcID = 0;\r
\r
private:\r
CriticalSection callbackLock;\r
{\r
// It seems that OSX can be a bit picky about the thread that's first used to\r
// search for devices. It's safest to use the message thread for calling this.\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
StringArray s;\r
enableSimulatorMidiSession();\r
{\r
// Since OSX 10.6, the MIDIClientCreate function will only work\r
// correctly when called from the message thread!\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
enableSimulatorMidiSession();\r
\r
\r
for (unsigned int i = 0; i < pktlist->numPackets; ++i)\r
{\r
- auto len = readUnaligned<decltype (packet->length)> (&(packet->length));\r
- concatenator.pushMidiData (packet->data, (int) len, time, input, callback);\r
+ concatenator.pushMidiData (packet->data, (int) packet->length, time,\r
+ input, callback);\r
\r
packet = MIDIPacketNext (packet);\r
}\r
\r
if (asioObject != nullptr)\r
{\r
- for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
- 44100, 48000, 88200, 96000, 176400,\r
- 192000, 352800, 384000, 705600, 768000 })\r
- if (asioObject->canSampleRate ((double) rate) == 0)\r
- newRates.add ((double) rate);\r
+ const int possibleSampleRates[] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };\r
+\r
+ for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index)\r
+ if (asioObject->canSampleRate ((double) possibleSampleRates[index]) == 0)\r
+ newRates.add ((double) possibleSampleRates[index]);\r
}\r
\r
if (newRates.isEmpty())\r
\r
void reloadChannelNames()\r
{\r
- long totalInChannels = 0, totalOutChannels = 0;\r
-\r
if (asioObject != nullptr\r
- && asioObject->getChannels (&totalInChannels, &totalOutChannels) == ASE_OK)\r
+ && asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans) == ASE_OK)\r
{\r
- totalNumInputChans = totalInChannels;\r
- totalNumOutputChans = totalOutChannels;\r
-\r
inputChannelNames.clear();\r
outputChannelNames.clear();\r
\r
//==============================================================================\r
//==============================================================================\r
#if JUCE_USE_WINRT_MIDI\r
-\r
-#ifndef JUCE_FORCE_WINRT_MIDI\r
- #define JUCE_FORCE_WINRT_MIDI 0\r
-#endif\r
-\r
-#ifndef JUCE_WINRT_MIDI_LOGGING\r
- #define JUCE_WINRT_MIDI_LOGGING 0\r
-#endif\r
-\r
-#if JUCE_WINRT_MIDI_LOGGING\r
- #define JUCE_WINRT_MIDI_LOG(x) DBG(x)\r
-#else\r
- #define JUCE_WINRT_MIDI_LOG(x)\r
-#endif\r
-\r
using namespace Microsoft::WRL;\r
\r
using namespace ABI::Windows::Foundation;\r
-using namespace ABI::Windows::Foundation::Collections;\r
using namespace ABI::Windows::Devices::Midi;\r
using namespace ABI::Windows::Devices::Enumeration;\r
using namespace ABI::Windows::Storage::Streams;\r
\r
//==============================================================================\r
-struct WinRTMidiService : public MidiServiceType\r
+class WinRTMidiService : public MidiServiceType\r
{\r
public:\r
//==============================================================================\r
if (midiOutFactory == nullptr)\r
throw std::runtime_error ("Failed to create midi out factory");\r
\r
- // The WinRT BLE MIDI API doesn't provide callbacks when devices become disconnected,\r
- // but it does require a disconnection via the API before a device will reconnect again.\r
- // We can monitor the BLE connection state of paired devices to get callbacks when\r
- // connections are broken.\r
- bleDeviceWatcher.reset (new BLEDeviceWatcher());\r
-\r
- if (! bleDeviceWatcher->start())\r
- throw std::runtime_error ("Failed to start the BLE device watcher");\r
-\r
inputDeviceWatcher.reset (new MidiIODeviceWatcher<IMidiInPortStatics> (midiInFactory));\r
\r
if (! inputDeviceWatcher->start())\r
- throw std::runtime_error ("Failed to start the midi input device watcher");\r
+ throw std::runtime_error ("Failed to start midi input device watcher");\r
\r
outputDeviceWatcher.reset (new MidiIODeviceWatcher<IMidiOutPortStatics> (midiOutFactory));\r
\r
if (! outputDeviceWatcher->start())\r
- throw std::runtime_error ("Failed to start the midi output device watcher");\r
+ throw std::runtime_error ("Failed to start midi output device watcher");\r
}\r
\r
+ ~WinRTMidiService() {}\r
+\r
StringArray getDevices (bool isInput) override\r
{\r
return isInput ? inputDeviceWatcher ->getDevices()\r
return new WinRTOutputWrapper (*this, index);\r
}\r
\r
-private:\r
- //==============================================================================\r
- class DeviceCallbackHandler\r
+ template <typename COMFactoryType>\r
+ struct MidiIODeviceWatcher\r
{\r
- public:\r
- virtual ~DeviceCallbackHandler() {};\r
-\r
- virtual HRESULT addDevice (IDeviceInformation*) = 0;\r
- virtual HRESULT removeDevice (IDeviceInformationUpdate*) = 0;\r
- virtual HRESULT updateDevice (IDeviceInformationUpdate*) = 0;\r
-\r
- bool attach (HSTRING deviceSelector, DeviceInformationKind infoKind)\r
+ struct DeviceInfo\r
{\r
- auto deviceInfoFactory = WinRTWrapper::getInstance()->getWRLFactory<IDeviceInformationStatics2> (&RuntimeClass_Windows_Devices_Enumeration_DeviceInformation[0]);\r
-\r
- if (deviceInfoFactory == nullptr)\r
- return false;\r
-\r
- // A quick way of getting an IVector<HSTRING>...\r
- auto requestedProperties = []\r
- {\r
- auto devicePicker = WinRTWrapper::getInstance()->activateInstance<IDevicePicker> (&RuntimeClass_Windows_Devices_Enumeration_DevicePicker[0],\r
- __uuidof (IDevicePicker));\r
- jassert (devicePicker != nullptr);\r
-\r
- IVector<HSTRING>* result;\r
- auto hr = devicePicker->get_RequestedProperties (&result);\r
- jassert (SUCCEEDED (hr));\r
-\r
- hr = result->Clear();\r
- jassert (SUCCEEDED (hr));\r
-\r
- return result;\r
- }();\r
-\r
- StringArray propertyKeys = { "System.Devices.ContainerId",\r
- "System.Devices.Aep.ContainerId",\r
- "System.Devices.Aep.IsConnected" };\r
-\r
- for (auto& key : propertyKeys)\r
- {\r
- WinRTWrapper::ScopedHString hstr (key);\r
- auto hr = requestedProperties->Append (hstr.get());\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return false;\r
- }\r
- }\r
-\r
- WinRTWrapper::ComPtr<IIterable<HSTRING>> iter;\r
- auto hr = requestedProperties->QueryInterface (__uuidof (IIterable<HSTRING>), (void**) iter.resetAndGetPointerAddress());\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return false;\r
- }\r
-\r
- hr = deviceInfoFactory->CreateWatcherWithKindAqsFilterAndAdditionalProperties (deviceSelector, iter, infoKind,\r
- watcher.resetAndGetPointerAddress());\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return false;\r
- }\r
-\r
- enumerationThread.startThread();\r
-\r
- return true;\r
+ String name, id;\r
+ bool isDefault = false;\r
};\r
\r
- void detach()\r
+ MidiIODeviceWatcher (ComSmartPtr<COMFactoryType>& comFactory) : factory (comFactory)\r
{\r
- enumerationThread.stopThread (2000);\r
-\r
- if (watcher == nullptr)\r
- return;\r
-\r
- auto hr = watcher->Stop();\r
- jassert (SUCCEEDED (hr));\r
-\r
- if (deviceAddedToken.value != 0)\r
- {\r
- hr = watcher->remove_Added (deviceAddedToken);\r
- jassert (SUCCEEDED (hr));\r
- deviceAddedToken.value = 0;\r
- }\r
-\r
- if (deviceUpdatedToken.value != 0)\r
- {\r
- hr = watcher->remove_Updated (deviceUpdatedToken);\r
- jassert (SUCCEEDED (hr));\r
- deviceUpdatedToken.value = 0;\r
- }\r
-\r
- if (deviceRemovedToken.value != 0)\r
- {\r
- hr = watcher->remove_Removed (deviceRemovedToken);\r
- jassert (SUCCEEDED (hr));\r
- deviceRemovedToken.value = 0;\r
- }\r
-\r
- watcher = nullptr;\r
}\r
\r
- template<typename InfoType>\r
- IInspectable* getValueFromDeviceInfo (String key, InfoType* info)\r
- {\r
- __FIMapView_2_HSTRING_IInspectable* properties;\r
- info->get_Properties (&properties);\r
-\r
- boolean found = false;\r
- WinRTWrapper::ScopedHString keyHstr (key);\r
- auto hr = properties->HasKey (keyHstr.get(), &found);\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
-\r
- if (! found)\r
- return nullptr;\r
-\r
- IInspectable* inspectable;\r
- hr = properties->Lookup (keyHstr.get(), &inspectable);\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return nullptr;\r
- }\r
-\r
- return inspectable;\r
- }\r
-\r
- String getGUIDFromInspectable (IInspectable& inspectable)\r
+ ~MidiIODeviceWatcher()\r
{\r
- WinRTWrapper::ComPtr<IReference<GUID>> guidRef;\r
- auto hr = inspectable.QueryInterface (__uuidof (IReference<GUID>),\r
- (void**) guidRef.resetAndGetPointerAddress());\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- GUID result;\r
- hr = guidRef->get_Value (&result);\r
-\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- OLECHAR* resultString;\r
- StringFromCLSID (result, &resultString);\r
-\r
- return resultString;\r
+ stop();\r
}\r
\r
- bool getBoolFromInspectable (IInspectable& inspectable)\r
+ bool start()\r
{\r
- WinRTWrapper::ComPtr<IReference<bool>> boolRef;\r
- auto hr = inspectable.QueryInterface (__uuidof (IReference<bool>),\r
- (void**) boolRef.resetAndGetPointerAddress());\r
+ HSTRING deviceSelector;\r
+ auto hr = factory->GetDeviceSelector (&deviceSelector);\r
\r
if (FAILED (hr))\r
- {\r
- jassertfalse;\r
return false;\r
- }\r
\r
- boolean result;\r
- hr = boolRef->get_Value (&result);\r
+ auto deviceInformationFactory = WinRTWrapper::getInstance()->getWRLFactory<IDeviceInformationStatics> (&RuntimeClass_Windows_Devices_Enumeration_DeviceInformation[0]);\r
\r
- if (FAILED (hr))\r
- {\r
- jassertfalse;\r
+ if (deviceInformationFactory == nullptr)\r
return false;\r
- }\r
\r
- return result;\r
- }\r
-\r
- private:\r
- //==============================================================================\r
- struct DeviceEnumerationThread : public Thread\r
- {\r
- DeviceEnumerationThread (DeviceCallbackHandler& h,\r
- WinRTWrapper::ComPtr<IDeviceWatcher>& w,\r
- EventRegistrationToken& added,\r
- EventRegistrationToken& removed,\r
- EventRegistrationToken& updated)\r
- : Thread ("WinRT Device Enumeration Thread"), handler (h), watcher (w),\r
- deviceAddedToken (added), deviceRemovedToken (removed), deviceUpdatedToken (updated)\r
- {}\r
-\r
- void run() override\r
- {\r
- auto handlerPtr = std::addressof (handler);\r
-\r
- watcher->add_Added (\r
- Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformation*>> (\r
- [handlerPtr](IDeviceWatcher*, IDeviceInformation* info) { return handlerPtr->addDevice (info); }\r
- ).Get(),\r
- &deviceAddedToken);\r
-\r
- watcher->add_Removed (\r
- Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
- [handlerPtr](IDeviceWatcher*, IDeviceInformationUpdate* infoUpdate) { return handlerPtr->removeDevice (infoUpdate); }\r
- ).Get(),\r
- &deviceRemovedToken);\r
-\r
- watcher->add_Updated (\r
- Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
- [handlerPtr](IDeviceWatcher*, IDeviceInformationUpdate* infoUpdate) { return handlerPtr->updateDevice (infoUpdate); }\r
- ).Get(),\r
- &deviceRemovedToken);\r
-\r
- watcher->Start();\r
- }\r
-\r
- DeviceCallbackHandler& handler;\r
- WinRTWrapper::ComPtr<IDeviceWatcher>& watcher;\r
- EventRegistrationToken& deviceAddedToken, deviceRemovedToken, deviceUpdatedToken;\r
- };\r
-\r
- //==============================================================================\r
- WinRTWrapper::ComPtr<IDeviceWatcher> watcher;\r
-\r
- EventRegistrationToken deviceAddedToken { 0 },\r
- deviceRemovedToken { 0 },\r
- deviceUpdatedToken { 0 };\r
-\r
- DeviceEnumerationThread enumerationThread { *this, watcher,\r
- deviceAddedToken,\r
- deviceRemovedToken,\r
- deviceUpdatedToken };\r
- };\r
-\r
- //==============================================================================\r
- struct BLEDeviceWatcher final : private DeviceCallbackHandler\r
- {\r
- struct DeviceInfo\r
- {\r
- String containerID;\r
- bool isConnected = false;\r
- };\r
-\r
- BLEDeviceWatcher() = default;\r
-\r
- ~BLEDeviceWatcher()\r
- {\r
- detach();\r
- }\r
-\r
- //==============================================================================\r
- HRESULT addDevice (IDeviceInformation* addedDeviceInfo) override\r
- {\r
- HSTRING deviceIDHst;\r
- auto hr = addedDeviceInfo->get_Id (&deviceIDHst);\r
+ hr = deviceInformationFactory->CreateWatcherAqsFilter (deviceSelector, watcher.resetAndGetPointerAddress());\r
\r
if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query added BLE device ID!");\r
- return S_OK;\r
- }\r
-\r
- auto deviceID = WinRTWrapper::getInstance()->hStringToString (deviceIDHst);\r
- JUCE_WINRT_MIDI_LOG ("Detected paired BLE device: " << deviceID);\r
+ return false;\r
\r
- if (auto* containerIDValue = getValueFromDeviceInfo ("System.Devices.Aep.ContainerId", addedDeviceInfo))\r
+ struct DeviceEnumerationThread : public Thread\r
{\r
- auto containerID = getGUIDFromInspectable (*containerIDValue);\r
+ DeviceEnumerationThread (String threadName, MidiIODeviceWatcher<COMFactoryType>& p)\r
+ : Thread (threadName), parent (p)\r
+ {}\r
\r
- if (containerID.isNotEmpty())\r
+ void run() override\r
{\r
- DeviceInfo info = { containerID };\r
-\r
- if (auto* connectedValue = getValueFromDeviceInfo ("System.Devices.Aep.IsConnected", addedDeviceInfo))\r
- info.isConnected = getBoolFromInspectable (*connectedValue);\r
-\r
- JUCE_WINRT_MIDI_LOG ("Adding BLE device: " << deviceID << " " << info.containerID\r
- << " " << (info.isConnected ? "connected" : "disconnected"));\r
- devices.set (deviceID, info);\r
-\r
- return S_OK;\r
+ auto parentPtr = &parent;\r
+\r
+ parent.watcher->add_Added (\r
+ Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformation*>> (\r
+ [parentPtr](IDeviceWatcher*, IDeviceInformation* info) { return parentPtr->addDevice (info); }\r
+ ).Get(),\r
+ &parent.deviceAddedToken);\r
+\r
+ parent.watcher->add_Removed (\r
+ Callback<ITypedEventHandler<DeviceWatcher*, DeviceInformationUpdate*>> (\r
+ [parentPtr](IDeviceWatcher*, IDeviceInformationUpdate* info) { return parentPtr->removeDevice (info); }\r
+ ).Get(),\r
+ &parent.deviceRemovedToken);\r
+\r
+ EventRegistrationToken deviceEnumerationCompletedToken { 0 };\r
+ parent.watcher->add_EnumerationCompleted (\r
+ Callback<ITypedEventHandler<DeviceWatcher*, IInspectable*>> (\r
+ [this](IDeviceWatcher*, IInspectable*) { enumerationCompleted.signal(); return S_OK; }\r
+ ).Get(),\r
+ &deviceEnumerationCompletedToken);\r
+\r
+ parent.watcher->Start();\r
+ enumerationCompleted.wait();\r
+\r
+ if (deviceEnumerationCompletedToken.value != 0)\r
+ parent.watcher->remove_EnumerationCompleted (deviceEnumerationCompletedToken);\r
}\r
- }\r
\r
- JUCE_WINRT_MIDI_LOG ("Failed to get a container ID for BLE device: " << deviceID);\r
- return S_OK;\r
- }\r
+ MidiIODeviceWatcher<COMFactoryType>& parent;\r
+ WaitableEvent enumerationCompleted;\r
+ };\r
\r
- HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo) override\r
- {\r
- HSTRING removedDeviceIdHstr;\r
- auto hr = removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
-\r
- if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query removed BLE device ID!");\r
- return S_OK;\r
- }\r
-\r
- auto removedDeviceId = WinRTWrapper::getInstance()->hStringToString (removedDeviceIdHstr);\r
-\r
- JUCE_WINRT_MIDI_LOG ("Removing BLE device: " << removedDeviceId);\r
-\r
- {\r
- const ScopedLock lock (deviceChanges);\r
-\r
- if (devices.contains (removedDeviceId))\r
- {\r
- auto& info = devices.getReference (removedDeviceId);\r
- listeners.call ([&info](Listener& l) { l.bleDeviceDisconnected (info.containerID); });\r
- devices.remove (removedDeviceId);\r
- JUCE_WINRT_MIDI_LOG ("Removed BLE device: " << removedDeviceId);\r
- }\r
- }\r
+ DeviceEnumerationThread enumerationThread ("WinRT Device Enumeration Thread", *this);\r
+ enumerationThread.startThread();\r
+ enumerationThread.waitForThreadToExit (4000);\r
\r
- return S_OK;\r
+ return true;\r
}\r
\r
- HRESULT updateDevice (IDeviceInformationUpdate* updatedDeviceInfo) override\r
+ bool stop()\r
{\r
- HSTRING updatedDeviceIdHstr;\r
- auto hr = updatedDeviceInfo->get_Id (&updatedDeviceIdHstr);\r
+ if (watcher == nullptr)\r
+ return true;\r
\r
- if (FAILED (hr))\r
+ if (deviceAddedToken.value != 0)\r
{\r
- JUCE_WINRT_MIDI_LOG ("Failed to query updated BLE device ID!");\r
- return S_OK;\r
- }\r
+ auto hr = watcher->remove_Added (deviceAddedToken);\r
\r
- auto updatedDeviceId = WinRTWrapper::getInstance()->hStringToString (updatedDeviceIdHstr);\r
+ if (FAILED (hr))\r
+ return false;\r
\r
- JUCE_WINRT_MIDI_LOG ("Updating BLE device: " << updatedDeviceId);\r
+ deviceAddedToken.value = 0;\r
+ }\r
\r
- if (auto* connectedValue = getValueFromDeviceInfo ("System.Devices.Aep.IsConnected", updatedDeviceInfo))\r
+ if (deviceRemovedToken.value != 0)\r
{\r
- auto isConnected = getBoolFromInspectable (*connectedValue);\r
-\r
- {\r
- const ScopedLock lock (deviceChanges);\r
-\r
- if (! devices.contains (updatedDeviceId))\r
- return S_OK;\r
-\r
- auto& info = devices.getReference (updatedDeviceId);\r
+ auto hr = watcher->remove_Removed (deviceRemovedToken);\r
\r
- if (info.isConnected && ! isConnected)\r
- {\r
- JUCE_WINRT_MIDI_LOG ("BLE device connection status change: " << updatedDeviceId << " " << info.containerID << " " << (isConnected ? "connected" : "disconnected"));\r
- listeners.call ([&info](Listener& l) { l.bleDeviceDisconnected (info.containerID); });\r
- }\r
+ if (FAILED (hr))\r
+ return false;\r
\r
- info.isConnected = isConnected;\r
- }\r
+ deviceRemovedToken.value = 0;\r
}\r
\r
- return S_OK;\r
- }\r
-\r
- //==============================================================================\r
- bool start()\r
- {\r
- WinRTWrapper::ScopedHString deviceSelector ("System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\""\r
- " AND System.Devices.Aep.IsPaired:=System.StructuredQueryType.Boolean#True");\r
- return attach (deviceSelector.get(), DeviceInformationKind::DeviceInformationKind_AssociationEndpoint);\r
- }\r
-\r
- //==============================================================================\r
- struct Listener\r
- {\r
- virtual ~Listener() {};\r
- virtual void bleDeviceAdded (const String& containerID) = 0;\r
- virtual void bleDeviceDisconnected (const String& containerID) = 0;\r
- };\r
-\r
- void addListener (Listener* l)\r
- {\r
- listeners.add (l);\r
- }\r
-\r
- void removeListener (Listener* l)\r
- {\r
- listeners.remove (l);\r
- }\r
-\r
- //==============================================================================\r
- ListenerList<Listener> listeners;\r
- HashMap<String, DeviceInfo> devices;\r
- CriticalSection deviceChanges;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BLEDeviceWatcher);\r
- };\r
-\r
- //==============================================================================\r
- struct MIDIDeviceInfo\r
- {\r
- String deviceID, containerID, name;\r
- bool isDefault = false;\r
- };\r
+ auto hr = watcher->Stop();\r
\r
- //==============================================================================\r
- template <typename COMFactoryType>\r
- struct MidiIODeviceWatcher final : private DeviceCallbackHandler\r
- {\r
- MidiIODeviceWatcher (WinRTWrapper::ComPtr<COMFactoryType>& comFactory)\r
- : factory (comFactory)\r
- {\r
- }\r
+ if (FAILED (hr))\r
+ return false;\r
\r
- ~MidiIODeviceWatcher()\r
- {\r
- detach();\r
+ watcher = nullptr;\r
+ return true;\r
}\r
\r
- HRESULT addDevice (IDeviceInformation* addedDeviceInfo) override\r
+ HRESULT addDevice (IDeviceInformation* addedDeviceInfo)\r
{\r
- MIDIDeviceInfo info;\r
-\r
- HSTRING deviceID;\r
- auto hr = addedDeviceInfo->get_Id (&deviceID);\r
+ boolean isEnabled;\r
+ auto hr = addedDeviceInfo->get_IsEnabled (&isEnabled);\r
\r
if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query added MIDI device ID!");\r
return S_OK;\r
- }\r
-\r
- info.deviceID = WinRTWrapper::getInstance()->hStringToString (deviceID);\r
-\r
- JUCE_WINRT_MIDI_LOG ("Detected MIDI device: " << info.deviceID);\r
\r
- boolean isEnabled = false;\r
- hr = addedDeviceInfo->get_IsEnabled (&isEnabled);\r
-\r
- if (FAILED (hr) || ! isEnabled)\r
- {\r
- JUCE_WINRT_MIDI_LOG ("MIDI device not enabled: " << info.deviceID);\r
+ if (! isEnabled)\r
return S_OK;\r
- }\r
\r
- // We use the container ID to match a MIDI device with a generic BLE device, if possible\r
- if (auto* containerIDValue = getValueFromDeviceInfo ("System.Devices.ContainerId", addedDeviceInfo))\r
- info.containerID = getGUIDFromInspectable (*containerIDValue);\r
+ const ScopedLock lock (deviceChanges);\r
+\r
+ DeviceInfo info;\r
\r
HSTRING name;\r
hr = addedDeviceInfo->get_Name (&name);\r
\r
if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query detected MIDI device name for " << info.deviceID);\r
return S_OK;\r
- }\r
\r
info.name = WinRTWrapper::getInstance()->hStringToString (name);\r
\r
- boolean isDefault = false;\r
- hr = addedDeviceInfo->get_IsDefault (&isDefault);\r
+ HSTRING id;\r
+ hr = addedDeviceInfo->get_Id (&id);\r
\r
if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query detected MIDI device defaultness for " << info.deviceID << " " << info.name);\r
return S_OK;\r
- }\r
\r
- info.isDefault = isDefault;\r
+ info.id = WinRTWrapper::getInstance()->hStringToString (id);\r
\r
- JUCE_WINRT_MIDI_LOG ("Adding MIDI device: " << info.deviceID << " " << info.containerID << " " << info.name);\r
+ boolean isDefault;\r
+ hr = addedDeviceInfo->get_IsDefault (&isDefault);\r
\r
- {\r
- const ScopedLock lock (deviceChanges);\r
- connectedDevices.add (info);\r
- }\r
+ if (FAILED (hr))\r
+ return S_OK;\r
\r
+ info.isDefault = isDefault != 0;\r
+ connectedDevices.add (info);\r
return S_OK;\r
}\r
\r
- HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo) override\r
+ HRESULT removeDevice (IDeviceInformationUpdate* removedDeviceInfo)\r
{\r
- HSTRING removedDeviceIdHstr;\r
- auto hr = removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
-\r
- if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to query removed MIDI device ID!");\r
- return S_OK;\r
- }\r
+ const ScopedLock lock (deviceChanges);\r
\r
+ HSTRING removedDeviceIdHstr;\r
+ removedDeviceInfo->get_Id (&removedDeviceIdHstr);\r
auto removedDeviceId = WinRTWrapper::getInstance()->hStringToString (removedDeviceIdHstr);\r
\r
- JUCE_WINRT_MIDI_LOG ("Removing MIDI device: " << removedDeviceId);\r
-\r
+ for (int i = 0; i < connectedDevices.size(); ++i)\r
{\r
- const ScopedLock lock (deviceChanges);\r
-\r
- for (int i = 0; i < connectedDevices.size(); ++i)\r
+ if (connectedDevices[i].id == removedDeviceId)\r
{\r
- if (connectedDevices[i].deviceID == removedDeviceId)\r
- {\r
- connectedDevices.remove (i);\r
- JUCE_WINRT_MIDI_LOG ("Removed MIDI device: " << removedDeviceId);\r
- break;\r
- }\r
+ connectedDevices.remove (i);\r
+ break;\r
}\r
}\r
\r
return S_OK;\r
}\r
\r
- // This is never called\r
- HRESULT updateDevice (IDeviceInformationUpdate*) override { return S_OK; }\r
-\r
- bool start()\r
- {\r
- HSTRING deviceSelector;\r
- auto hr = factory->GetDeviceSelector (&deviceSelector);\r
-\r
- if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to get MIDI device selector!");\r
- return false;\r
- }\r
-\r
- return attach (deviceSelector, DeviceInformationKind::DeviceInformationKind_DeviceInterface);\r
- }\r
-\r
StringArray getDevices()\r
{\r
{\r
return 0;\r
}\r
\r
- MIDIDeviceInfo getDeviceInfoFromIndex (int index)\r
+ String getDeviceNameFromIndex (int index)\r
{\r
if (isPositiveAndBelow (index, lastQueriedConnectedDevices.get().size()))\r
- return lastQueriedConnectedDevices.get()[index];\r
+ return lastQueriedConnectedDevices.get()[index].name;\r
\r
return {};\r
}\r
\r
for (auto info : connectedDevices)\r
if (info.name == name)\r
- return info.deviceID;\r
+ return info.id;\r
\r
return {};\r
}\r
\r
- WinRTWrapper::ComPtr<COMFactoryType>& factory;\r
+ ComSmartPtr<COMFactoryType>& factory;\r
\r
- Array<MIDIDeviceInfo> connectedDevices;\r
+ EventRegistrationToken deviceAddedToken { 0 },\r
+ deviceRemovedToken { 0 };\r
+\r
+ ComSmartPtr<IDeviceWatcher> watcher;\r
+\r
+ Array<DeviceInfo> connectedDevices;\r
CriticalSection deviceChanges;\r
- ThreadLocalValue<Array<MIDIDeviceInfo>> lastQueriedConnectedDevices;\r
+ ThreadLocalValue<Array<DeviceInfo>> lastQueriedConnectedDevices;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiIODeviceWatcher);\r
};\r
struct OpenMidiPortThread : public Thread\r
{\r
OpenMidiPortThread (String threadName, String midiDeviceID,\r
- WinRTWrapper::ComPtr<COMFactoryType>& comFactory,\r
- WinRTWrapper::ComPtr<COMInterfaceType>& comPort)\r
+ ComSmartPtr<COMFactoryType>& comFactory,\r
+ ComSmartPtr<COMInterfaceType>& comPort)\r
: Thread (threadName),\r
deviceID (midiDeviceID),\r
factory (comFactory),\r
void run() override\r
{\r
WinRTWrapper::ScopedHString hDeviceId (deviceID);\r
- WinRTWrapper::ComPtr<IAsyncOperation<COMType*>> asyncOp;\r
+ ComSmartPtr<IAsyncOperation<COMType*>> asyncOp;\r
auto hr = factory->FromIdAsync (hDeviceId.get(), asyncOp.resetAndGetPointerAddress());\r
\r
if (FAILED (hr))\r
}\r
).Get());\r
\r
- // We need to use a timout here, rather than waiting indefinitely, as the\r
- // WinRT API can occaisonally hang!\r
+ // When using Bluetooth the asynchronous port opening operation will occasionally\r
+ // hang, so we use a timeout. We will be able to remove this when Microsoft\r
+ // improves the Bluetooth MIDI stack.\r
portOpened.wait (2000);\r
}\r
\r
const String deviceID;\r
- WinRTWrapper::ComPtr<COMFactoryType>& factory;\r
- WinRTWrapper::ComPtr<COMInterfaceType>& port;\r
+ ComSmartPtr<COMFactoryType>& factory;\r
+ ComSmartPtr<COMInterfaceType>& port;\r
WaitableEvent portOpened { true };\r
};\r
\r
//==============================================================================\r
- template <typename MIDIIOStaticsType, typename MIDIPort>\r
- class WinRTIOWrapper : private BLEDeviceWatcher::Listener\r
+ struct WinRTInputWrapper : public InputWrapper\r
{\r
- public:\r
- WinRTIOWrapper (BLEDeviceWatcher& bleWatcher,\r
- MidiIODeviceWatcher<MIDIIOStaticsType>& midiDeviceWatcher,\r
- int index)\r
- : bleDeviceWatcher (bleWatcher)\r
- {\r
- {\r
- const ScopedLock lock (midiDeviceWatcher.deviceChanges);\r
- deviceInfo = midiDeviceWatcher.getDeviceInfoFromIndex (index);\r
- }\r
-\r
- if (deviceInfo.deviceID.isEmpty())\r
- throw std::runtime_error ("Invalid device index");\r
-\r
- JUCE_WINRT_MIDI_LOG ("Creating JUCE MIDI IO: " << deviceInfo.deviceID);\r
-\r
- if (deviceInfo.containerID.isNotEmpty())\r
- {\r
- bleDeviceWatcher.addListener (this);\r
-\r
- const ScopedLock lock (bleDeviceWatcher.deviceChanges);\r
-\r
- HashMap<String, BLEDeviceWatcher::DeviceInfo>::Iterator iter (bleDeviceWatcher.devices);\r
-\r
- while (iter.next())\r
- {\r
- if (iter.getValue().containerID == deviceInfo.containerID)\r
- {\r
- isBLEDevice = true;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- virtual ~WinRTIOWrapper()\r
- {\r
- bleDeviceWatcher.removeListener (this);\r
-\r
- disconnect();\r
- }\r
-\r
- //==============================================================================\r
- virtual void disconnect()\r
+ WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, int index, MidiInputCallback& cb)\r
+ : inputDevice (input),\r
+ callback (cb)\r
{\r
- if (midiPort != nullptr)\r
- {\r
- if (isBLEDevice)\r
- midiPort->Release();\r
- }\r
+ const ScopedLock lock (service.inputDeviceWatcher->deviceChanges);\r
\r
- midiPort = nullptr;\r
- }\r
-\r
- private:\r
- //==============================================================================\r
- void bleDeviceAdded (const String& containerID) override\r
- {\r
- if (containerID == deviceInfo.containerID)\r
- isBLEDevice = true;\r
- }\r
+ deviceName = service.inputDeviceWatcher->getDeviceNameFromIndex (index);\r
\r
- void bleDeviceDisconnected (const String& containerID) override\r
- {\r
- if (containerID == deviceInfo.containerID)\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Disconnecting MIDI port from BLE disconnection: " << deviceInfo.deviceID\r
- << " " << deviceInfo.containerID << " " << deviceInfo.name);\r
- disconnect();\r
- }\r
- }\r
+ if (deviceName.isEmpty())\r
+ throw std::runtime_error ("Invalid device index");\r
\r
- protected:\r
- //==============================================================================\r
- BLEDeviceWatcher& bleDeviceWatcher;\r
- MIDIDeviceInfo deviceInfo;\r
- bool isBLEDevice = false;\r
- WinRTWrapper::ComPtr<MIDIPort> midiPort;\r
- };\r
+ auto deviceID = service.inputDeviceWatcher->getDeviceID (deviceName);\r
\r
- //==============================================================================\r
- struct WinRTInputWrapper final : public InputWrapper,\r
- private WinRTIOWrapper<IMidiInPortStatics, IMidiInPort>\r
+ if (deviceID.isEmpty())\r
+ throw std::runtime_error ("Device unavailable");\r
\r
- {\r
- WinRTInputWrapper (WinRTMidiService& service, MidiInput& input, int index, MidiInputCallback& cb)\r
- : WinRTIOWrapper <IMidiInPortStatics, IMidiInPort> (*service.bleDeviceWatcher, *service.inputDeviceWatcher, index),\r
- inputDevice (input),\r
- callback (cb)\r
- {\r
OpenMidiPortThread<IMidiInPortStatics, IMidiInPort, MidiInPort> portThread ("Open WinRT MIDI input port",\r
- deviceInfo.deviceID,\r
+ deviceID,\r
service.midiInFactory,\r
- midiPort);\r
+ midiInPort);\r
portThread.startThread();\r
portThread.waitForThreadToExit (-1);\r
\r
- if (midiPort == nullptr)\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Timed out waiting for midi input port creation");\r
- return;\r
- }\r
+ if (midiInPort == nullptr)\r
+ throw std::runtime_error ("Timed out waiting for midi input port creation");\r
\r
startTime = Time::getMillisecondCounterHiRes();\r
\r
- auto hr = midiPort->add_MessageReceived (\r
+ auto hr = midiInPort->add_MessageReceived (\r
Callback<ITypedEventHandler<MidiInPort*, MidiMessageReceivedEventArgs*>> (\r
- [this](IMidiInPort*, IMidiMessageReceivedEventArgs* args) { return midiInMessageReceived (args); }\r
+ [this] (IMidiInPort*, IMidiMessageReceivedEventArgs* args) { return midiInMessageReceived (args); }\r
).Get(),\r
&midiInMessageToken);\r
\r
if (FAILED (hr))\r
- {\r
- JUCE_WINRT_MIDI_LOG ("Failed to set MIDI input callback");\r
- jassertfalse;\r
- }\r
+ throw std::runtime_error ("Failed to set midi input callback");\r
}\r
\r
~WinRTInputWrapper()\r
{\r
- disconnect();\r
+ if (midiInMessageToken.value != 0)\r
+ midiInPort->remove_MessageReceived (midiInMessageToken);\r
+\r
+ midiInPort = nullptr;\r
}\r
\r
- //==============================================================================\r
void start() override\r
{\r
if (! isStarted)\r
}\r
}\r
\r
- String getDeviceName() override { return deviceInfo.name; }\r
-\r
- //==============================================================================\r
- void disconnect() override\r
- {\r
- stop();\r
-\r
- if (midiPort != nullptr && midiInMessageToken.value != 0)\r
- midiPort->remove_MessageReceived (midiInMessageToken);\r
+ String getDeviceName() override { return deviceName; }\r
\r
- WinRTIOWrapper<IMidiInPortStatics, IMidiInPort>::disconnect();\r
- }\r
-\r
- //==============================================================================\r
HRESULT midiInMessageReceived (IMidiMessageReceivedEventArgs* args)\r
{\r
if (! isStarted)\r
return S_OK;\r
\r
- WinRTWrapper::ComPtr<IMidiMessage> message;\r
+ ComSmartPtr<IMidiMessage> message;\r
auto hr = args->get_Message (message.resetAndGetPointerAddress());\r
\r
if (FAILED (hr))\r
return hr;\r
\r
- WinRTWrapper::ComPtr<IBuffer> buffer;\r
+ ComSmartPtr<IBuffer> buffer;\r
hr = message->get_RawData (buffer.resetAndGetPointerAddress());\r
\r
if (FAILED (hr))\r
return hr;\r
\r
- WinRTWrapper::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
+ ComSmartPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
hr = buffer->QueryInterface (bufferByteAccess.resetAndGetPointerAddress());\r
\r
if (FAILED (hr))\r
return t * 0.001;\r
}\r
\r
- //==============================================================================\r
MidiInput& inputDevice;\r
MidiInputCallback& callback;\r
-\r
+ String deviceName;\r
MidiDataConcatenator concatenator { 4096 };\r
+ ComSmartPtr<IMidiInPort> midiInPort;\r
EventRegistrationToken midiInMessageToken { 0 };\r
\r
double startTime = 0;\r
};\r
\r
//==============================================================================\r
- struct WinRTOutputWrapper final : public OutputWrapper,\r
- private WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort>\r
+ struct WinRTOutputWrapper : public OutputWrapper\r
{\r
WinRTOutputWrapper (WinRTMidiService& service, int index)\r
- : WinRTIOWrapper <IMidiOutPortStatics, IMidiOutPort> (*service.bleDeviceWatcher, *service.outputDeviceWatcher, index)\r
{\r
+ const ScopedLock lock (service.outputDeviceWatcher->deviceChanges);\r
+\r
+ deviceName = service.outputDeviceWatcher->getDeviceNameFromIndex (index);\r
+\r
+ if (deviceName.isEmpty())\r
+ throw std::runtime_error ("Invalid device index");\r
+\r
+ auto deviceID = service.outputDeviceWatcher->getDeviceID (deviceName);\r
+\r
+ if (deviceID.isEmpty())\r
+ throw std::runtime_error ("Device unavailable");\r
+\r
OpenMidiPortThread<IMidiOutPortStatics, IMidiOutPort, IMidiOutPort> portThread ("Open WinRT MIDI output port",\r
- deviceInfo.deviceID,\r
+ deviceID,\r
service.midiOutFactory,\r
- midiPort);\r
+ midiOutPort);\r
portThread.startThread();\r
portThread.waitForThreadToExit (-1);\r
\r
- if (midiPort == nullptr)\r
+ if (midiOutPort == nullptr)\r
throw std::runtime_error ("Timed out waiting for midi output port creation");\r
\r
auto bufferFactory = WinRTWrapper::getInstance()->getWRLFactory<IBufferFactory> (&RuntimeClass_Windows_Storage_Streams_Buffer[0]);\r
throw std::runtime_error ("Failed to get buffer data pointer");\r
}\r
\r
- //==============================================================================\r
+ ~WinRTOutputWrapper() {}\r
+\r
void sendMessageNow (const MidiMessage& message) override\r
{\r
- if (midiPort == nullptr)\r
- return;\r
-\r
auto numBytes = message.getRawDataSize();\r
auto hr = buffer->put_Length (numBytes);\r
\r
if (FAILED (hr))\r
- {\r
jassertfalse;\r
- return;\r
- }\r
\r
memcpy_s (bufferData, numBytes, message.getRawData(), numBytes);\r
- midiPort->SendBuffer (buffer);\r
+ midiOutPort->SendBuffer (buffer);\r
}\r
\r
- String getDeviceName() override { return deviceInfo.name; }\r
+ String getDeviceName() override { return deviceName; }\r
\r
- //==============================================================================\r
- WinRTWrapper::ComPtr<IBuffer> buffer;\r
- WinRTWrapper::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
+ String deviceName;\r
+ ComSmartPtr<IMidiOutPort> midiOutPort;\r
+ ComSmartPtr<IBuffer> buffer;\r
+ ComSmartPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;\r
uint8_t* bufferData = nullptr;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTOutputWrapper);\r
};\r
\r
- WinRTWrapper::ComPtr<IMidiInPortStatics> midiInFactory;\r
- WinRTWrapper::ComPtr<IMidiOutPortStatics> midiOutFactory;\r
+ ComSmartPtr<IMidiInPortStatics> midiInFactory;\r
+ ComSmartPtr<IMidiOutPortStatics> midiOutFactory;\r
\r
std::unique_ptr<MidiIODeviceWatcher<IMidiInPortStatics>> inputDeviceWatcher;\r
std::unique_ptr<MidiIODeviceWatcher<IMidiOutPortStatics>> outputDeviceWatcher;\r
- std::unique_ptr<BLEDeviceWatcher> bleDeviceWatcher;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WinRTMidiService)\r
};\r
\r
#endif // JUCE_USE_WINRT_MIDI\r
\r
-//==============================================================================\r
//==============================================================================\r
struct MidiService : public DeletedAtShutdown\r
{\r
MidiService()\r
{\r
- #if JUCE_USE_WINRT_MIDI\r
- #if ! JUCE_FORCE_WINRT_MIDI\r
- auto windowsVersionInfo = []\r
- {\r
- RTL_OSVERSIONINFOW versionInfo = { 0 };\r
-\r
- if (auto* mod = ::GetModuleHandleW (L"ntdll.dll"))\r
- {\r
- using RtlGetVersion = LONG (WINAPI*)(PRTL_OSVERSIONINFOW);\r
-\r
- if (auto* rtlGetVersion = (RtlGetVersion) ::GetProcAddress (mod, "RtlGetVersion"))\r
- {\r
- versionInfo.dwOSVersionInfoSize = sizeof (versionInfo);\r
- LONG STATUS_SUCCESS = 0;\r
-\r
- if (rtlGetVersion (&versionInfo) != STATUS_SUCCESS)\r
- versionInfo = { 0 };\r
- }\r
- }\r
-\r
- return versionInfo;\r
- }();\r
-\r
- if (windowsVersionInfo.dwMajorVersion >= 10 && windowsVersionInfo.dwBuildNumber >= 17763)\r
- #endif\r
+ #if JUCE_USE_WINRT_MIDI\r
+ try\r
{\r
- try\r
- {\r
- internal.reset (new WinRTMidiService());\r
- return;\r
- }\r
- catch (std::runtime_error&) {}\r
+ internal.reset (new WinRTMidiService());\r
+ return;\r
}\r
- #endif\r
+ catch (std::runtime_error&) {}\r
+ #endif\r
\r
internal.reset (new Win32MidiService());\r
}\r
// Got a format that is supported by the device so we can ask what sample rates are supported (in whatever format)\r
}\r
\r
- for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
- 44100, 48000, 88200, 96000, 176400,\r
- 192000, 352800, 384000, 705600, 768000 })\r
- {\r
- if (rates.contains (rate))\r
+ static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };\r
+\r
+ for (int i = 0; i < numElementsInArray (ratesToTest); ++i)\r
+ {\r
+ if (rates.contains (ratesToTest[i]))\r
continue;\r
\r
- format.Format.nSamplesPerSec = (DWORD) rate;\r
+ format.Format.nSamplesPerSec = (DWORD) ratesToTest[i];\r
format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nChannels * format.Format.wBitsPerSample / 8);\r
\r
if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE\r
: AUDCLNT_SHAREMODE_SHARED,\r
(WAVEFORMATEX*) &format, 0)))\r
- if (! rates.contains (rate))\r
- rates.addUsingDefaultSort (rate);\r
+ if (! rates.contains (ratesToTest[i]))\r
+ rates.addUsingDefaultSort (ratesToTest[i]);\r
}\r
}\r
\r
CFArrayRef extensions = nullptr;\r
UInt32 sizeOfArray = sizeof (extensions);\r
\r
- if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, nullptr, &sizeOfArray, &extensions) == noErr)\r
+ if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, 0, &sizeOfArray, &extensions) == noErr)\r
{\r
- auto numValues = CFArrayGetCount (extensions);\r
+ const CFIndex numValues = CFArrayGetCount (extensions);\r
\r
for (CFIndex i = 0; i < numValues; ++i)\r
extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions, i)));\r
static StringPairArray parseUserDefinedChunk (InputStream& input, int64 size)\r
{\r
StringPairArray infoStrings;\r
- auto originalPosition = input.getPosition();\r
+ const int64 originalPosition = input.getPosition();\r
\r
uint8 uuid[16];\r
input.read (uuid, sizeof (uuid));\r
\r
if (memcmp (uuid, "\x29\x81\x92\x73\xB5\xBF\x4A\xEF\xB7\x8D\x62\xD1\xEF\x90\xBB\x2C", 16) == 0)\r
{\r
- auto numEntries = (uint32) input.readIntBigEndian();\r
+ const uint32 numEntries = (uint32) input.readIntBigEndian();\r
\r
for (uint32 i = 0; i < numEntries && input.getPosition() < originalPosition + size; ++i)\r
{\r
if (chunkHeader.chunkSize == -1)\r
break;\r
\r
- input.setPosition (input.getPosition() + chunkHeader.chunkSize);\r
+ input.skipNextBytes (chunkHeader.chunkSize);\r
}\r
else if (chunkHeader.chunkType == chunkName ("midi"))\r
{\r
else\r
{\r
// we aren't decoding this chunk yet so just skip over it\r
- input.setPosition (input.getPosition() + chunkHeader.chunkSize);\r
+ input.skipNextBytes (chunkHeader.chunkSize);\r
}\r
}\r
}\r
if (input != nullptr)\r
CoreAudioFormatMetatdata::read (*input, metadataValues);\r
\r
- auto status = AudioFileOpenWithCallbacks (this,\r
- &readCallback,\r
- nullptr, // write needs to be null to avoid permisisions errors\r
- &getSizeCallback,\r
- nullptr, // setSize needs to be null to avoid permisisions errors\r
- 0, // AudioFileTypeID inFileTypeHint\r
- &audioFileID);\r
+ OSStatus status = AudioFileOpenWithCallbacks (this,\r
+ &readCallback,\r
+ nullptr, // write needs to be null to avoid permisisions errors\r
+ &getSizeCallback,\r
+ nullptr, // setSize needs to be null to avoid permisisions errors\r
+ 0, // AudioFileTypeID inFileTypeHint\r
+ &audioFileID);\r
if (status == noErr)\r
{\r
status = ExtAudioFileWrapAudioFileID (audioFileID, false, &audioFileRef);\r
for (auto tagEntry : knownTags)\r
expect (AudioChannelSet::channelSetWithChannels (CoreAudioLayouts::getSpeakerLayoutForCoreAudioTag (tagEntry.tag))\r
== CoreAudioLayouts::fromCoreAudio (tagEntry.tag),\r
- "Tag \"" + String (tagEntry.name) + "\" is not converted consistently by JUCE");\r
+ "Tag \"" + String (tagEntry.name) + "\" is not converted consistantly by JUCE");\r
}\r
\r
{\r
#pragma clang diagnostic ignored "-Wconversion"\r
#pragma clang diagnostic ignored "-Wshadow"\r
#pragma clang diagnostic ignored "-Wdeprecated-register"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
#endif\r
\r
#if JUCE_INTEL\r
}\r
else\r
{\r
- if (startSampleInFile >= lengthInSamples)\r
+ if (startSampleInFile >= (int) lengthInSamples)\r
{\r
samplesInReservoir = 0;\r
}\r
auto* src = buffer[i];\r
int n = i;\r
\r
- while (src == nullptr && n > 0)\r
+ while (src == 0 && n > 0)\r
src = buffer [--n];\r
\r
if (src != nullptr)\r
{\r
const uint8 n0 = si.allocation[i][0];\r
const uint8 n1 = si.allocation[i][1];\r
- fraction[0][i] = n0 > 0 ? (float) ((-(1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0;\r
- fraction[1][i] = n1 > 0 ? (float) ((-(1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0;\r
+ fraction[0][i] = n0 > 0 ? (float) (((-1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0;\r
+ fraction[1][i] = n1 > 0 ? (float) (((-1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0;\r
}\r
\r
for (i = jsbound; i < 32; ++i)\r
\r
if (n > 0)\r
{\r
- const uint32 w = ((uint32) -(1 << n) + getBitsUint16 (n + 1) + 1);\r
+ const uint32 w = ((uint32) (-1 << n) + getBitsUint16 (n + 1) + 1);\r
fraction[0][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][0]]);\r
fraction[1][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][1]]);\r
}\r
const uint8 j = si.scaleFactor[i][0];\r
\r
if (n > 0)\r
- fraction[0][i] = (float) ((-(1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]);\r
+ fraction[0][i] = (float) (((-1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]);\r
else\r
fraction[0][i] = 0;\r
}\r
#pragma clang diagnostic ignored "-Wconversion"\r
#pragma clang diagnostic ignored "-Wshadow"\r
#pragma clang diagnostic ignored "-Wdeprecated-register"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
#elif JUCE_GCC\r
#pragma GCC diagnostic push\r
#pragma GCC diagnostic ignored "-Wshadow"\r
callbacks.close_func = &oggCloseCallback;\r
callbacks.tell_func = &oggTellCallback;\r
\r
- auto err = ov_open_callbacks (input, &ovFile, nullptr, 0, callbacks);\r
+ auto err = ov_open_callbacks (input, &ovFile, 0, 0, callbacks);\r
\r
if (err == 0)\r
{\r
\r
while (vorbis_analysis_blockout (&vd, &vb) == 1)\r
{\r
- vorbis_analysis (&vb, nullptr);\r
+ vorbis_analysis (&vb, 0);\r
vorbis_bitrate_addblock (&vb);\r
\r
while (vorbis_bitrate_flushpacket (&vd, &op))\r
{\r
if (auto* in = source.createInputStream())\r
{\r
- if (auto r = std::unique_ptr<AudioFormatReader> (createReaderFor (in, true)))\r
+ std::unique_ptr<AudioFormatReader> r (createReaderFor (in, true));\r
+\r
+ if (r != nullptr)\r
{\r
auto lengthSecs = r->lengthInSamples / r->sampleRate;\r
auto approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs);\r
{\r
static void addToMetadata (StringPairArray& destValues, const String& source)\r
{\r
- if (auto xml = parseXML (source))\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (source));\r
+\r
+ if (xml != nullptr && xml->hasTagName ("ebucore:ebuCoreMain"))\r
{\r
- if (xml->hasTagName ("ebucore:ebuCoreMain"))\r
+ if (auto* xml2 = xml->getChildByName ("ebucore:coreMetadata"))\r
{\r
- if (auto xml2 = xml->getChildByName ("ebucore:coreMetadata"))\r
+ if (auto* xml3 = xml2->getChildByName ("ebucore:identifier"))\r
{\r
- if (auto xml3 = xml2->getChildByName ("ebucore:identifier"))\r
+ if (auto* xml4 = xml3->getChildByName ("dc:identifier"))\r
{\r
- if (auto xml4 = xml3->getChildByName ("dc:identifier"))\r
- {\r
- auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
+ auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
\r
- if (ISRCCode.isNotEmpty())\r
- destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
- }\r
+ if (ISRCCode.isNotEmpty())\r
+ destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
}\r
}\r
}\r
const int bufferSize = 4096;\r
HeapBlock<int> tempSpace (bufferSize * 2 + 64);\r
\r
- int* tempBuffer[3] = { tempSpace.get(),\r
- tempSpace.get() + bufferSize,\r
- nullptr };\r
+ int* tempBuffer[3];\r
+ tempBuffer[0] = tempSpace.get();\r
+ tempBuffer[1] = tempSpace.get() + bufferSize;\r
+ tempBuffer[2] = 0;\r
\r
int consecutive = 0;\r
int64 firstMatchPos = -1;\r
if (numSamplesToSearch < 0)\r
bufferStart -= numThisTime;\r
\r
- if (bufferStart >= lengthInSamples)\r
+ if (bufferStart >= (int) lengthInSamples)\r
break;\r
\r
read (tempBuffer, 2, bufferStart, numThisTime, false);\r
const int bufferSize = 16384;\r
AudioBuffer<float> tempBuffer ((int) numChannels, bufferSize);\r
\r
- int* buffers[128] = { nullptr };\r
+ int* buffers[128] = { 0 };\r
\r
for (int i = tempBuffer.getNumChannels(); --i >= 0;)\r
buffers[i] = reinterpret_cast<int*> (tempBuffer.getWritePointer (i, 0));\r
\r
private:\r
class Buffer;\r
+ friend struct ContainerDeletePolicy<Buffer>;\r
std::unique_ptr<Buffer> buffer;\r
};\r
\r
namespace juce\r
{\r
\r
-AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* sourceToUse,\r
- int64 startSampleToUse, int64 lengthToUse,\r
- bool deleteSource)\r
- : AudioFormatReader (nullptr, sourceToUse->getFormatName()),\r
- source (sourceToUse),\r
- startSample (startSampleToUse),\r
- deleteSourceWhenDeleted (deleteSource)\r
+AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* const source_,\r
+ const int64 startSample_,\r
+ const int64 length_,\r
+ const bool deleteSourceWhenDeleted_)\r
+ : AudioFormatReader (0, source_->getFormatName()),\r
+ source (source_),\r
+ startSample (startSample_),\r
+ deleteSourceWhenDeleted (deleteSourceWhenDeleted_)\r
{\r
- length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), lengthToUse);\r
+ length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), length_);\r
\r
sampleRate = source->sampleRate;\r
bitsPerSample = source->bitsPerSample;\r
int samplesToBuffer)\r
: AudioFormatReader (nullptr, sourceReader->getFormatName()),\r
source (sourceReader), thread (timeSliceThread),\r
- numBlocks (1 + (samplesToBuffer / samplesPerBlock))\r
+ nextReadPosition (0),\r
+ numBlocks (1 + (samplesToBuffer / samplesPerBlock)),\r
+ timeoutMs (0)\r
{\r
sampleRate = source->sampleRate;\r
lengthInSamples = source->lengthInSamples;\r
bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer,\r
int64 startSampleInFile, int numSamples)\r
{\r
- auto startTime = Time::getMillisecondCounter();\r
+ const uint32 startTime = Time::getMillisecondCounter();\r
clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer,\r
startSampleInFile, numSamples, lengthInSamples);\r
\r
\r
while (numSamples > 0)\r
{\r
- if (auto block = getBlockContaining (startSampleInFile))\r
+ if (const BufferedBlock* const block = getBlockContaining (startSampleInFile))\r
{\r
- auto offset = (int) (startSampleInFile - block->range.getStart());\r
- auto numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile));\r
+ const int offset = (int) (startSampleInFile - block->range.getStart());\r
+ const int numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile));\r
\r
for (int j = 0; j < numDestChannels; ++j)\r
{\r
- if (auto dest = (float*) destSamples[j])\r
+ if (float* dest = (float*) destSamples[j])\r
{\r
dest += startOffsetInDestBuffer;\r
\r
if (timeoutMs >= 0 && Time::getMillisecondCounter() >= startTime + (uint32) timeoutMs)\r
{\r
for (int j = 0; j < numDestChannels; ++j)\r
- if (auto dest = (float*) destSamples[j])\r
+ if (float* dest = (float*) destSamples[j])\r
FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples);\r
\r
break;\r
\r
BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept\r
{\r
- for (auto* b : blocks)\r
+ for (int i = blocks.size(); --i >= 0;)\r
+ {\r
+ BufferedBlock* const b = blocks.getUnchecked(i);\r
+\r
if (b->range.contains (pos))\r
return b;\r
+ }\r
\r
return nullptr;\r
}\r
\r
bool BufferingAudioReader::readNextBufferChunk()\r
{\r
- auto pos = nextReadPosition.load();\r
- auto startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;\r
- auto endPos = startPos + numBlocks * samplesPerBlock;\r
+ const int64 pos = nextReadPosition;\r
+ const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock;\r
+ const int64 endPos = startPos + numBlocks * samplesPerBlock;\r
\r
OwnedArray<BufferedBlock> newBlocks;\r
\r
return false;\r
}\r
\r
- for (auto p = startPos; p < endPos; p += samplesPerBlock)\r
+ for (int64 p = startPos; p < endPos; p += samplesPerBlock)\r
{\r
if (getBlockContaining (p) == nullptr)\r
{\r
private:\r
std::unique_ptr<AudioFormatReader> source;\r
TimeSliceThread& thread;\r
- std::atomic<int64> nextReadPosition { 0 };\r
+ int64 nextReadPosition;\r
const int numBlocks;\r
- int timeoutMs = 0;\r
+ int timeoutMs;\r
\r
enum { samplesPerBlock = 32768 };\r
\r
\r
ID: juce_audio_formats\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE audio file format codecs\r
description: Classes for reading and writing various audio file formats.\r
website: http://www.juce.com/juce\r
}\r
}\r
else\r
- {\r
isSuspended = true;\r
- }\r
\r
if (isSuspended)\r
{\r
audioProcessor.prepareToPlay (sampleRate, lastBufferSize);\r
maxBufferSize = lastBufferSize;\r
\r
- midiBuffer.ensureSize (2048);\r
- midiBuffer.clear();\r
-\r
sideChainBuffer.calloc (static_cast<size_t> (maxBufferSize));\r
}\r
\r
updateSidechainState();\r
}\r
\r
- //==============================================================================\r
- static AudioProcessor::CurveData::Type aaxCurveTypeToJUCE (AAX_CTypeID type) noexcept\r
- {\r
- switch (type)\r
- {\r
- case AAX_eCurveType_EQ: return AudioProcessor::CurveData::Type::EQ;\r
- case AAX_eCurveType_Dynamics: return AudioProcessor::CurveData::Type::Dynamics;\r
- case AAX_eCurveType_Reduction: return AudioProcessor::CurveData::Type::GainReduction;\r
- default: break;\r
- }\r
-\r
- return AudioProcessor::CurveData::Type::Unknown;\r
- }\r
-\r
- uint32_t getAAXMeterIdForParamId (const String& paramID) const noexcept\r
- {\r
- int idx;\r
-\r
- for (idx = 0; idx < aaxMeters.size(); ++idx)\r
- if (LegacyAudioParameter::getParamID (aaxMeters[idx], false) == paramID)\r
- break;\r
-\r
- // you sepecified a parameter id in your curve but the parameter does not have the meter\r
- // category\r
- jassert (idx < aaxMeters.size());\r
- return 'Metr' + static_cast<AAX_CTypeID> (idx);\r
- }\r
-\r
- //==============================================================================\r
- AAX_Result GetCurveData (AAX_CTypeID iCurveType, const float * iValues, uint32_t iNumValues, float * oValues ) const override\r
- {\r
- auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
- if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
- {\r
- auto& audioProcessor = getPluginInstance();\r
- auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
- if (curve.curve)\r
- {\r
- if (oValues != nullptr && iValues != nullptr)\r
- {\r
- for (uint32_t i = 0; i < iNumValues; ++i)\r
- oValues[i] = curve.curve (iValues[i]);\r
- }\r
-\r
- return AAX_SUCCESS;\r
- }\r
- }\r
-\r
- return AAX_ERROR_UNIMPLEMENTED;\r
- }\r
-\r
- AAX_Result GetCurveDataMeterIds (AAX_CTypeID iCurveType, uint32_t *oXMeterId, uint32_t *oYMeterId) const override\r
- {\r
- auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
- if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
- {\r
- auto& audioProcessor = getPluginInstance();\r
- auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
- if (curve.curve && curve.xMeterID.isNotEmpty() && curve.yMeterID.isNotEmpty())\r
- {\r
- if (oXMeterId != nullptr) *oXMeterId = getAAXMeterIdForParamId (curve.xMeterID);\r
- if (oYMeterId != nullptr) *oYMeterId = getAAXMeterIdForParamId (curve.yMeterID);\r
-\r
- return AAX_SUCCESS;\r
- }\r
- }\r
-\r
- return AAX_ERROR_UNIMPLEMENTED;\r
- }\r
-\r
- AAX_Result GetCurveDataDisplayRange (AAX_CTypeID iCurveType, float *oXMin, float *oXMax, float *oYMin, float *oYMax) const override\r
- {\r
- auto curveType = aaxCurveTypeToJUCE (iCurveType);\r
-\r
- if (curveType != AudioProcessor::CurveData::Type::Unknown)\r
- {\r
- auto& audioProcessor = getPluginInstance();\r
- auto curve = audioProcessor.getResponseCurve (curveType);\r
-\r
- if (curve.curve)\r
- {\r
- if (oXMin != nullptr) *oXMin = curve.xRange.getStart();\r
- if (oXMax != nullptr) *oXMax = curve.xRange.getEnd();\r
- if (oYMin != nullptr) *oYMin = curve.yRange.getStart();\r
- if (oYMax != nullptr) *oYMax = curve.yRange.getEnd();\r
-\r
- return AAX_SUCCESS;\r
- }\r
- }\r
-\r
- return AAX_ERROR_UNIMPLEMENTED;\r
- }\r
-\r
//==============================================================================\r
inline int getParamIndexFromID (AAX_CParamID paramID) const noexcept\r
{\r
// and the size of the data returned. To avoid generating\r
// it again in GetChunk, we need to store it somewhere.\r
// However, as GetChunkSize and GetChunk can be called\r
- // on different threads, we store it in thread dependent storage\r
+ // on different threads, we store it in thread dependant storage\r
// in a hash map with the thread id as a key.\r
mutable ThreadLocalValue<ChunkMemoryBlock> perThreadFilterData;\r
CriticalSection perThreadDataLock;\r
//==============================================================================\r
virtual void createPlugin()\r
{\r
+\r
#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
processor.reset (::createPluginFilterOfType (AudioProcessor::wrapperType_Standalone));\r
#else\r
deviceSelector (deviceManagerToUse,\r
minAudioInputChannels, maxAudioInputChannels,\r
minAudioOutputChannels, maxAudioOutputChannels,\r
- true,\r
- (pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()),\r
+ true, false,\r
true, false),\r
shouldMuteLabel ("Feedback Loop:", "Feedback Loop:"),\r
shouldMuteButton ("Mute audio input")\r
emptyBuffer.clear();\r
\r
player.audioDeviceAboutToStart (device);\r
- player.setMidiOutput (deviceManager.getDefaultMidiOutput());\r
}\r
\r
void audioDeviceStopped() override\r
{\r
- player.setMidiOutput (nullptr);\r
player.audioDeviceStopped();\r
emptyBuffer.setSize (0, 0);\r
}\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#pragma once\r
-\r
-\r
-//==============================================================================\r
-#define UNITY_AUDIO_PLUGIN_API_VERSION 0x010401\r
-\r
-#if JUCE_WINDOWS\r
- #define UNITY_INTERFACE_API __stdcall\r
- #define UNITY_INTERFACE_EXPORT __declspec(dllexport)\r
-#else\r
- #define UNITY_INTERFACE_API\r
- #define UNITY_INTERFACE_EXPORT __attribute__ ((visibility("default")))\r
-#endif\r
-\r
-//==============================================================================\r
-struct UnityAudioEffectState;\r
-\r
-typedef int (UNITY_INTERFACE_API * createCallback) (UnityAudioEffectState* state);\r
-typedef int (UNITY_INTERFACE_API * releaseCallback) (UnityAudioEffectState* state);\r
-typedef int (UNITY_INTERFACE_API * resetCallback) (UnityAudioEffectState* state);\r
-\r
-typedef int (UNITY_INTERFACE_API * processCallback) (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, unsigned int bufferSize,\r
- int numInChannels, int numOutChannels);\r
-\r
-typedef int (UNITY_INTERFACE_API * setPositionCallback) (UnityAudioEffectState* state, unsigned int pos);\r
-\r
-typedef int (UNITY_INTERFACE_API * setFloatParameterCallback) (UnityAudioEffectState* state, int index, float value);\r
-typedef int (UNITY_INTERFACE_API * getFloatParameterCallback) (UnityAudioEffectState* state, int index, float* value, char* valuestr);\r
-typedef int (UNITY_INTERFACE_API * getFloatBufferCallback) (UnityAudioEffectState* state, const char* name, float* buffer, int numsamples);\r
-\r
-typedef int (UNITY_INTERFACE_API * distanceAttenuationCallback) (UnityAudioEffectState* state, float distanceIn, float attenuationIn, float* attenuationOut);\r
-\r
-typedef void (UNITY_INTERFACE_API * renderCallback) (int eventId);\r
-\r
-//==============================================================================\r
-enum UnityAudioEffectDefinitionFlags\r
-{\r
- isSideChainTarget = 1,\r
- isSpatializer = 2,\r
- isAmbisonicDecoder = 4,\r
- appliesDistanceAttenuation = 8\r
-};\r
-\r
-enum UnityAudioEffectStateFlags\r
-{\r
- stateIsPlaying = 1,\r
- stateIsPaused = 2,\r
- stateIsMuted = 8,\r
- statIsSideChainTarget = 16\r
-};\r
-\r
-enum UnityEventModifiers\r
-{\r
- shift = 1,\r
- control = 2,\r
- alt = 4,\r
- command = 8,\r
- numeric = 16,\r
- capsLock = 32,\r
- functionKey = 64\r
-};\r
-\r
-//==============================================================================\r
-struct UnityAudioSpatializerData\r
-{\r
- float listenerMatrix[16];\r
- float sourceMatrix[16];\r
- float spatialBlend;\r
- float reverbZoneMix;\r
- float spread;\r
- float stereoPan;\r
- distanceAttenuationCallback attenuationCallback;\r
- float minDistance;\r
- float maxDistance;\r
-};\r
-\r
-struct UnityAudioAmbisonicData\r
-{\r
- float listenerMatrix[16];\r
- float sourceMatrix[16];\r
- float spatialBlend;\r
- float reverbZoneMix;\r
- float spread;\r
- float stereoPan;\r
- distanceAttenuationCallback attenuationCallback;\r
- int ambisonicOutChannels;\r
- float volume;\r
-};\r
-\r
-struct UnityAudioEffectState\r
-{\r
- juce::uint32 structSize;\r
- juce::uint32 sampleRate;\r
- juce::uint64 dspCurrentTick;\r
- juce::uint64 dspPreviousTick;\r
- float* sidechainBuffer;\r
- void* effectData;\r
- juce::uint32 flags;\r
- void* internal;\r
-\r
- UnityAudioSpatializerData* spatializerData;\r
- juce::uint32 dspBufferSize;\r
- juce::uint32 hostAPIVersion;\r
-\r
- UnityAudioAmbisonicData* ambisonicData;\r
-\r
- template<typename T>\r
- inline T* getEffectData() const\r
- {\r
- jassert (effectData != nullptr);\r
- jassert (internal != nullptr);\r
-\r
- return (T*) effectData;\r
- }\r
-};\r
-\r
-struct UnityAudioParameterDefinition\r
-{\r
- char name[16];\r
- char unit[16];\r
- const char* description;\r
- float min;\r
- float max;\r
- float defaultVal;\r
- float displayScale;\r
- float displayExponent;\r
-};\r
-\r
-struct UnityAudioEffectDefinition\r
-{\r
- juce::uint32 structSize;\r
- juce::uint32 parameterStructSize;\r
- juce::uint32 apiVersion;\r
- juce::uint32 pluginVersion;\r
- juce::uint32 channels;\r
- juce::uint32 numParameters;\r
- juce::uint64 flags;\r
- char name[32];\r
- createCallback create;\r
- releaseCallback release;\r
- resetCallback reset;\r
- processCallback process;\r
- setPositionCallback setPosition;\r
- UnityAudioParameterDefinition* parameterDefintions;\r
- setFloatParameterCallback setFloatParameter;\r
- getFloatParameterCallback getFloatParameter;\r
- getFloatBufferCallback getFloatBuffer;\r
-};\r
-\r
-//==============================================================================\r
-// Unity callback\r
-extern "C" UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API UnityGetAudioEffectDefinitions (UnityAudioEffectDefinition*** definitionsPtr);\r
-\r
-// GUI script callbacks\r
-extern "C" UNITY_INTERFACE_EXPORT renderCallback UNITY_INTERFACE_API getRenderCallback();\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityInitialiseTexture (int id, void* textureHandle, int w, int h);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDown (int id, float x, float y, UnityEventModifiers mods, int button);\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDrag (int id, float x, float y, UnityEventModifiers mods, int button);\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseUp (int id, float x, float y, UnityEventModifiers mods);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityKeyEvent (int id, int code, UnityEventModifiers mods, const char* name);\r
-\r
-extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, float x, float y, float w, float h);\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#if JucePlugin_Build_Unity\r
-\r
-#include "../../juce_core/system/juce_TargetPlatform.h"\r
-#include "../utility/juce_IncludeModuleHeaders.h"\r
-#include "../../juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp"\r
-\r
-#if JUCE_WINDOWS\r
- #include "../utility/juce_IncludeSystemHeaders.h"\r
-#endif\r
-\r
-#include "juce_UnityPluginInterface.h"\r
-\r
-//==============================================================================\r
-namespace juce\r
-{\r
-\r
-typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&);\r
-extern createUnityPeerFunctionType juce_createUnityPeerFn;\r
-\r
-//==============================================================================\r
-class UnityPeer : public ComponentPeer,\r
- public AsyncUpdater\r
-{\r
-public:\r
- UnityPeer (Component& ed)\r
- : ComponentPeer (ed, 0),\r
- mouseWatcher (*this)\r
- {\r
- getEditor().setResizable (false, false);\r
- }\r
-\r
- //==============================================================================\r
- Rectangle<int> getBounds() const override { return bounds; }\r
- Point<float> localToGlobal (Point<float> relativePosition) override { return relativePosition + getBounds().getPosition().toFloat(); }\r
- Point<float> globalToLocal (Point<float> screenPosition) override { return screenPosition - getBounds().getPosition().toFloat(); }\r
-\r
- StringArray getAvailableRenderingEngines() override { return StringArray ("Software Renderer"); }\r
-\r
- void setBounds (const Rectangle<int>& newBounds, bool) override\r
- {\r
- bounds = newBounds;\r
- mouseWatcher.setBoundsToWatch (bounds);\r
- }\r
-\r
- bool contains (Point<int> localPos, bool) const override\r
- {\r
- if (isPositiveAndBelow (localPos.getX(), getBounds().getWidth())\r
- && isPositiveAndBelow (localPos.getY(), getBounds().getHeight()))\r
- return true;\r
-\r
- return false;\r
- }\r
-\r
- void handleAsyncUpdate() override\r
- {\r
- fillPixels();\r
- }\r
-\r
- //==============================================================================\r
- AudioProcessorEditor& getEditor() { return *dynamic_cast<AudioProcessorEditor*> (&getComponent()); }\r
-\r
- void setPixelDataHandle (uint8* handle, int width, int height)\r
- {\r
- pixelData = handle;\r
-\r
- textureWidth = width;\r
- textureHeight = height;\r
-\r
- renderImage = Image (new UnityBitmapImage (pixelData, width, height));\r
- }\r
-\r
- // N.B. This is NOT an efficient way to do this and you shouldn't use this method in your own code.\r
- // It works for our purposes here but a much more efficient way would be to use a GL texture.\r
- void fillPixels()\r
- {\r
- if (pixelData == nullptr)\r
- return;\r
-\r
- LowLevelGraphicsSoftwareRenderer renderer (renderImage);\r
- renderer.addTransform (AffineTransform::verticalFlip ((float) getComponent().getHeight()));\r
-\r
- handlePaint (renderer);\r
-\r
- for (int i = 0; i < textureWidth * textureHeight * 4; i += 4)\r
- {\r
- auto r = pixelData[i + 2];\r
- auto g = pixelData[i + 1];\r
- auto b = pixelData[i + 0];\r
-\r
- pixelData[i + 0] = r;\r
- pixelData[i + 1] = g;\r
- pixelData[i + 2] = b;\r
- }\r
- }\r
-\r
- void forwardMouseEvent (Point<float> position, ModifierKeys mods)\r
- {\r
- ModifierKeys::currentModifiers = mods;\r
-\r
- handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::invalidPressure,\r
- juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
- }\r
-\r
- void forwardKeyPress (int code, String name, ModifierKeys mods)\r
- {\r
- ModifierKeys::currentModifiers = mods;\r
-\r
- handleKeyPress (getKeyPress (code, name));\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- struct UnityBitmapImage : public ImagePixelData\r
- {\r
- UnityBitmapImage (uint8* data, int w, int h)\r
- : ImagePixelData (Image::PixelFormat::ARGB, w, h),\r
- imageData (data),\r
- lineStride (width * pixelStride)\r
- {\r
- }\r
-\r
- ImageType* createType() const override { return new SoftwareImageType(); }\r
- LowLevelGraphicsContext* createLowLevelContext() override { return new LowLevelGraphicsSoftwareRenderer (Image (this)); }\r
-\r
- void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
- {\r
- ignoreUnused (mode);\r
-\r
- bitmap.data = imageData + x * pixelStride + y * lineStride;\r
- bitmap.pixelFormat = pixelFormat;\r
- bitmap.lineStride = lineStride;\r
- bitmap.pixelStride = pixelStride;\r
- }\r
-\r
- ImagePixelData::Ptr clone() override\r
- {\r
- auto im = new UnityBitmapImage (imageData, width, height);\r
-\r
- for (int i = 0; i < height; ++i)\r
- memcpy (im->imageData + i * lineStride, imageData + i * lineStride, (size_t) lineStride);\r
-\r
- return im;\r
- }\r
-\r
- uint8* imageData;\r
- int pixelStride = 4, lineStride;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityBitmapImage)\r
- };\r
-\r
- //==============================================================================\r
- struct MouseWatcher : public Timer\r
- {\r
- MouseWatcher (ComponentPeer& o) : owner (o) {}\r
-\r
- void timerCallback() override\r
- {\r
- auto pos = Desktop::getMousePosition();\r
-\r
- if (boundsToWatch.contains (pos) && pos != lastMousePos)\r
- {\r
- auto ms = Desktop::getInstance().getMainMouseSource();\r
-\r
- if (! ms.getCurrentModifiers().isLeftButtonDown())\r
- owner.handleMouseEvent (juce::MouseInputSource::mouse, owner.globalToLocal (pos.toFloat()), {},\r
- juce::MouseInputSource::invalidPressure, juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());\r
-\r
- lastMousePos = pos;\r
- }\r
-\r
- }\r
-\r
- void setBoundsToWatch (Rectangle<int> b)\r
- {\r
- if (boundsToWatch != b)\r
- boundsToWatch = b;\r
-\r
- startTimer (250);\r
- }\r
-\r
- ComponentPeer& owner;\r
- Rectangle<int> boundsToWatch;\r
- Point<int> lastMousePos;\r
- };\r
-\r
- //==============================================================================\r
- KeyPress getKeyPress (int keyCode, String name)\r
- {\r
- if (keyCode >= 32 && keyCode <= 64)\r
- return { keyCode, ModifierKeys::currentModifiers, juce::juce_wchar (keyCode) };\r
-\r
- if (keyCode >= 91 && keyCode <= 122)\r
- return { keyCode, ModifierKeys::currentModifiers, name[0] };\r
-\r
- if (keyCode >= 256 && keyCode <= 265)\r
- return { juce::KeyPress::numberPad0 + (keyCode - 256), ModifierKeys::currentModifiers, juce::String (keyCode - 256).getCharPointer()[0] };\r
-\r
- if (keyCode == 8) return { juce::KeyPress::backspaceKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 127) return { juce::KeyPress::deleteKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 9) return { juce::KeyPress::tabKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 13) return { juce::KeyPress::returnKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 27) return { juce::KeyPress::escapeKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 32) return { juce::KeyPress::spaceKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 266) return { juce::KeyPress::numberPadDecimalPoint, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 267) return { juce::KeyPress::numberPadDivide, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 268) return { juce::KeyPress::numberPadMultiply, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 269) return { juce::KeyPress::numberPadSubtract, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 270) return { juce::KeyPress::numberPadAdd, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 272) return { juce::KeyPress::numberPadEquals, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 273) return { juce::KeyPress::upKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 274) return { juce::KeyPress::downKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 275) return { juce::KeyPress::rightKey, ModifierKeys::currentModifiers, {} };\r
- if (keyCode == 276) return { juce::KeyPress::leftKey, ModifierKeys::currentModifiers, {} };\r
-\r
- return {};\r
- }\r
-\r
- //==============================================================================\r
- Rectangle<int> bounds;\r
- MouseWatcher mouseWatcher;\r
-\r
- uint8* pixelData = nullptr;\r
- int textureWidth, textureHeight;\r
- Image renderImage;\r
-\r
- //==============================================================================\r
- void setMinimised (bool) override {}\r
- bool isMinimised() const override { return false; }\r
- void setFullScreen (bool) override {}\r
- bool isFullScreen() const override { return false; }\r
- bool setAlwaysOnTop (bool) override { return false; }\r
- void toFront (bool) override {}\r
- void toBehind (ComponentPeer*) override {}\r
- bool isFocused() const override { return true; }\r
- void grabFocus() override {}\r
- void* getNativeHandle() const override { return nullptr; }\r
- BorderSize<int> getFrameSize() const override { return {}; }\r
- void setVisible (bool) override {}\r
- void setTitle (const String&) override {}\r
- void setIcon (const Image&) override {}\r
- void textInputRequired (Point<int>, TextInputTarget&) override {}\r
- void setAlpha (float) override {}\r
- void performAnyPendingRepaintsNow() override {}\r
- void repaint (const Rectangle<int>&) override {}\r
-\r
- //==============================================================================\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityPeer)\r
-};\r
-\r
-ComponentPeer* createUnityPeer (Component& c) { return new UnityPeer (c); }\r
-\r
-//==============================================================================\r
-class AudioProcessorUnityWrapper\r
-{\r
-public:\r
- AudioProcessorUnityWrapper (bool isTemporary)\r
- {\r
- pluginInstance.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Unity));\r
-\r
- if (! isTemporary && pluginInstance->hasEditor())\r
- {\r
- pluginInstanceEditor.reset (pluginInstance->createEditorIfNeeded());\r
- pluginInstanceEditor->setVisible (true);\r
- pluginInstanceEditor->addToDesktop (0);\r
- }\r
-\r
- juceParameters.update (*pluginInstance, false);\r
- }\r
-\r
- ~AudioProcessorUnityWrapper()\r
- {\r
- if (pluginInstanceEditor != nullptr)\r
- {\r
- pluginInstanceEditor->removeFromDesktop();\r
-\r
- PopupMenu::dismissAllActiveMenus();\r
- pluginInstanceEditor->processor.editorBeingDeleted (pluginInstanceEditor.get());\r
- pluginInstanceEditor = nullptr;\r
- }\r
- }\r
-\r
- void create (UnityAudioEffectState* state)\r
- {\r
- // only supported in Unity plugin API > 1.0\r
- if (state->structSize >= sizeof (UnityAudioEffectState))\r
- samplesPerBlock = static_cast<int> (state->dspBufferSize);\r
-\r
- #ifdef JucePlugin_PreferredChannelConfigurations\r
- short configs[][2] = { JucePlugin_PreferredChannelConfigurations };\r
- const int numConfigs = sizeof (configs) / sizeof (short[2]);\r
-\r
- jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0));\r
-\r
- pluginInstance->setPlayConfigDetails (configs[0][0], configs[0][1], state->sampleRate, samplesPerBlock);\r
- #else\r
- pluginInstance->setRateAndBufferSizeDetails (state->sampleRate, samplesPerBlock);\r
- #endif\r
-\r
- pluginInstance->prepareToPlay (state->sampleRate, samplesPerBlock);\r
-\r
- scratchBuffer.setSize (jmax (pluginInstance->getTotalNumInputChannels(), pluginInstance->getTotalNumOutputChannels()), samplesPerBlock);\r
- }\r
-\r
- void release()\r
- {\r
- pluginInstance->releaseResources();\r
- }\r
-\r
- void reset()\r
- {\r
- pluginInstance->reset();\r
- }\r
-\r
- void process (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed)\r
- {\r
- for (int pos = 0; pos < bufferSize;)\r
- {\r
- auto max = jmin (bufferSize - pos, samplesPerBlock);\r
- processBuffers (inBuffer + (pos * numInChannels), outBuffer + (pos * numOutChannels), max, numInChannels, numOutChannels, isBypassed);\r
-\r
- pos += max;\r
- }\r
- }\r
-\r
- void declareParameters (UnityAudioEffectDefinition& definition)\r
- {\r
- static std::unique_ptr<UnityAudioParameterDefinition> parametersPtr;\r
- static int numParams = 0;\r
-\r
- if (parametersPtr == nullptr)\r
- {\r
- numParams = juceParameters.params.size();\r
-\r
- parametersPtr.reset (static_cast<UnityAudioParameterDefinition*> (std::calloc (static_cast<size_t> (numParams),\r
- sizeof (UnityAudioParameterDefinition))));\r
-\r
- parameterDescriptions.clear();\r
-\r
- for (int i = 0; i < numParams; ++i)\r
- {\r
- auto* parameter = juceParameters.params[i];\r
- auto& paramDef = parametersPtr.get()[i];\r
-\r
- strncpy (paramDef.name, parameter->getName (15).toRawUTF8(), 15);\r
-\r
- if (parameter->getLabel().isNotEmpty())\r
- strncpy (paramDef.unit, parameter->getLabel().toRawUTF8(), 15);\r
-\r
- parameterDescriptions.add (parameter->getName (15));\r
- paramDef.description = parameterDescriptions[i].toRawUTF8();\r
-\r
- paramDef.defaultVal = parameter->getDefaultValue();\r
- paramDef.min = 0.0f;\r
- paramDef.max = 1.0f;\r
- paramDef.displayScale = 1.0f;\r
- paramDef.displayExponent = 1.0f;\r
- }\r
- }\r
-\r
- definition.numParameters = static_cast<uint32> (numParams);\r
- definition.parameterDefintions = parametersPtr.get();\r
- }\r
-\r
- void setParameter (int index, float value) { juceParameters.getParamForIndex (index)->setValueNotifyingHost (value); }\r
- float getParameter (int index) const noexcept { return juceParameters.getParamForIndex (index)->getValue(); }\r
-\r
- String getParameterString (int index) const noexcept\r
- {\r
- auto* param = juceParameters.getParamForIndex (index);\r
- return param->getText (param->getValue(), 16);\r
- }\r
-\r
- int getNumInputChannels() const noexcept { return pluginInstance->getTotalNumInputChannels(); }\r
- int getNumOutputChannels() const noexcept { return pluginInstance->getTotalNumOutputChannels(); }\r
-\r
- bool hasEditor() const noexcept { return pluginInstance->hasEditor(); }\r
-\r
- UnityPeer& getEditorPeer() const\r
- {\r
- auto* peer = dynamic_cast<UnityPeer*> (pluginInstanceEditor->getPeer());\r
-\r
- jassert (peer != nullptr);\r
- return *peer;\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- void processBuffers (float* inBuffer, float* outBuffer, int bufferSize, int numInChannels, int numOutChannels, bool isBypassed)\r
- {\r
- int ch;\r
- for (ch = 0; ch < numInChannels; ++ch)\r
- {\r
- using DstSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::NonConst>;\r
- using SrcSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::Interleaved, AudioData::Const>;\r
-\r
- DstSampleType dstData (scratchBuffer.getWritePointer (ch));\r
- SrcSampleType srcData (inBuffer + ch, numInChannels);\r
- dstData.convertSamples (srcData, bufferSize);\r
- }\r
-\r
- for (; ch < numOutChannels; ++ch)\r
- scratchBuffer.clear (ch, 0, bufferSize);\r
-\r
- {\r
- const ScopedLock sl (pluginInstance->getCallbackLock());\r
-\r
- if (pluginInstance->isSuspended())\r
- {\r
- scratchBuffer.clear();\r
- }\r
- else\r
- {\r
- MidiBuffer mb;\r
-\r
- if (isBypassed)\r
- pluginInstance->processBlockBypassed (scratchBuffer, mb);\r
- else\r
- pluginInstance->processBlock (scratchBuffer, mb);\r
- }\r
- }\r
-\r
- for (ch = 0; ch < numOutChannels; ++ch)\r
- {\r
- using DstSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::Interleaved, AudioData::NonConst>;\r
- using SrcSampleType = AudioData::Pointer<AudioData::Float32, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const>;\r
-\r
- DstSampleType dstData (outBuffer + ch, numOutChannels);\r
- SrcSampleType srcData (scratchBuffer.getReadPointer (ch));\r
- dstData.convertSamples (srcData, bufferSize);\r
- }\r
- }\r
-\r
- //==============================================================================\r
- std::unique_ptr<AudioProcessor> pluginInstance;\r
- std::unique_ptr<AudioProcessorEditor> pluginInstanceEditor;\r
-\r
- int samplesPerBlock = 1024;\r
- StringArray parameterDescriptions;\r
-\r
- AudioBuffer<float> scratchBuffer;\r
-\r
- LegacyAudioParametersWrapper juceParameters;\r
-\r
- //==============================================================================\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorUnityWrapper)\r
-};\r
-\r
-//==============================================================================\r
-HashMap<int, AudioProcessorUnityWrapper*>& getWrapperMap()\r
-{\r
- static HashMap<int, AudioProcessorUnityWrapper*> wrapperMap;\r
- return wrapperMap;\r
-}\r
-\r
-static void onWrapperCreation (AudioProcessorUnityWrapper* wrapperToAdd)\r
-{\r
- getWrapperMap().set (std::abs (Random::getSystemRandom().nextInt (65536)), wrapperToAdd);\r
-}\r
-\r
-static void onWrapperDeletion (AudioProcessorUnityWrapper* wrapperToRemove)\r
-{\r
- getWrapperMap().removeValue (wrapperToRemove);\r
-}\r
-\r
-//==============================================================================\r
-namespace UnityCallbacks\r
-{\r
- int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state)\r
- {\r
- auto* pluginInstance = new AudioProcessorUnityWrapper (false);\r
- pluginInstance->create (state);\r
-\r
- state->effectData = pluginInstance;\r
-\r
- onWrapperCreation (pluginInstance);\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state)\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
- pluginInstance->release();\r
-\r
- onWrapperDeletion (pluginInstance);\r
- delete pluginInstance;\r
-\r
- if (getWrapperMap().size() == 0)\r
- shutdownJuce_GUI();\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state)\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
- pluginInstance->reset();\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos)\r
- {\r
- ignoreUnused (state, pos);\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value)\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
- pluginInstance->setParameter (index, value);\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr)\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
- *value = pluginInstance->getParameter (index);\r
-\r
- strncpy (valueStr, pluginInstance->getParameterString (index).toRawUTF8(), 15);\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples)\r
- {\r
- ignoreUnused (numSamples);\r
-\r
- auto nameStr = String (name);\r
-\r
- if (nameStr == "Editor")\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
- buffer[0] = pluginInstance->hasEditor() ? 1.0f : 0.0f;\r
- }\r
- else if (nameStr == "ID")\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
- for (HashMap<int, AudioProcessorUnityWrapper*>::Iterator i (getWrapperMap()); i.next();)\r
- {\r
- if (i.getValue() == pluginInstance)\r
- {\r
- buffer[0] = (float) i.getKey();\r
- break;\r
- }\r
- }\r
-\r
- return 0;\r
- }\r
- else if (nameStr == "Size")\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
- auto& editor = pluginInstance->getEditorPeer().getEditor();\r
-\r
- buffer[0] = (float) editor.getBounds().getWidth();\r
- buffer[1] = (float) editor.getBounds().getHeight();\r
- buffer[2] = (float) editor.getConstrainer()->getMinimumWidth();\r
- buffer[3] = (float) editor.getConstrainer()->getMinimumHeight();\r
- buffer[4] = (float) editor.getConstrainer()->getMaximumWidth();\r
- buffer[5] = (float) editor.getConstrainer()->getMaximumHeight();\r
- }\r
-\r
- return 0;\r
- }\r
-\r
- int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer,\r
- unsigned int bufferSize, int numInChannels, int numOutChannels)\r
- {\r
- auto* pluginInstance = state->getEffectData<AudioProcessorUnityWrapper>();\r
-\r
- if (pluginInstance != nullptr)\r
- {\r
- auto isPlaying = ((state->flags & stateIsPlaying) != 0);\r
- auto isMuted = ((state->flags & stateIsMuted) != 0);\r
- auto isPaused = ((state->flags & stateIsPaused) != 0);\r
-\r
- auto bypassed = ! isPlaying || (isMuted || isPaused);\r
-\r
- pluginInstance->process (inBuffer, outBuffer, static_cast<int> (bufferSize), numInChannels, numOutChannels, bypassed);\r
- }\r
- else\r
- {\r
- FloatVectorOperations::clear (outBuffer, static_cast<int> (bufferSize) * numOutChannels);\r
- }\r
-\r
- return 0;\r
- }\r
-}\r
-\r
-//==============================================================================\r
-static void declareEffect (UnityAudioEffectDefinition& definition)\r
-{\r
- memset (&definition, 0, sizeof (definition));\r
-\r
- std::unique_ptr<AudioProcessorUnityWrapper> wrapper = std::make_unique<AudioProcessorUnityWrapper> (true);\r
-\r
- String name (JucePlugin_Name);\r
- if (! name.startsWithIgnoreCase ("audioplugin"))\r
- name = "audioplugin_" + name;\r
-\r
- strcpy (definition.name, name.toRawUTF8());\r
-\r
- definition.structSize = sizeof (UnityAudioEffectDefinition);\r
- definition.parameterStructSize = sizeof (UnityAudioParameterDefinition);\r
-\r
- definition.apiVersion = UNITY_AUDIO_PLUGIN_API_VERSION;\r
- definition.pluginVersion = JucePlugin_VersionCode;\r
-\r
- // effects must set this to 0, generators > 0\r
- definition.channels = (wrapper->getNumInputChannels() != 0 ? 0\r
- : static_cast<uint32> (wrapper->getNumOutputChannels()));\r
-\r
- wrapper->declareParameters (definition);\r
-\r
- definition.create = UnityCallbacks::createCallback;\r
- definition.release = UnityCallbacks::releaseCallback;\r
- definition.reset = UnityCallbacks::resetCallback;\r
- definition.setPosition = UnityCallbacks::setPositionCallback;\r
- definition.process = UnityCallbacks::processCallback;\r
- definition.setFloatParameter = UnityCallbacks::setFloatParameterCallback;\r
- definition.getFloatParameter = UnityCallbacks::getFloatParameterCallback;\r
- definition.getFloatBuffer = UnityCallbacks::getFloatBufferCallback;\r
-}\r
-\r
-} // namespace juce\r
-\r
-UNITY_INTERFACE_EXPORT int UnityGetAudioEffectDefinitions (UnityAudioEffectDefinition*** definitionsPtr)\r
-{\r
- if (juce::getWrapperMap().size() == 0)\r
- juce::initialiseJuce_GUI();\r
-\r
- static bool hasInitialised = false;\r
-\r
- if (! hasInitialised)\r
- {\r
- juce::PluginHostType::jucePlugInClientCurrentWrapperType = juce::AudioProcessor::wrapperType_Unity;\r
- juce::juce_createUnityPeerFn = juce::createUnityPeer;\r
-\r
- hasInitialised = true;\r
- }\r
-\r
- auto* definition = new UnityAudioEffectDefinition();\r
- juce::declareEffect (*definition);\r
-\r
- *definitionsPtr = &definition;\r
-\r
- return 1;\r
-}\r
-\r
-//==============================================================================\r
-static juce::ModifierKeys unityModifiersToJUCE (UnityEventModifiers mods, bool mouseDown, int mouseButton = -1)\r
-{\r
- int flags = 0;\r
-\r
- if (mouseDown)\r
- {\r
- if (mouseButton == 0)\r
- flags |= juce::ModifierKeys::leftButtonModifier;\r
- else if (mouseButton == 1)\r
- flags |= juce::ModifierKeys::rightButtonModifier;\r
- else if (mouseButton == 2)\r
- flags |= juce::ModifierKeys::middleButtonModifier;\r
- }\r
-\r
- if (mods == 0)\r
- return flags;\r
-\r
- if ((mods & UnityEventModifiers::shift) != 0) flags |= juce::ModifierKeys::shiftModifier;\r
- if ((mods & UnityEventModifiers::control) != 0) flags |= juce::ModifierKeys::ctrlModifier;\r
- if ((mods & UnityEventModifiers::alt) != 0) flags |= juce::ModifierKeys::altModifier;\r
- if ((mods & UnityEventModifiers::command) != 0) flags |= juce::ModifierKeys::commandModifier;\r
-\r
- return { flags };\r
-}\r
-\r
-//==============================================================================\r
-static juce::AudioProcessorUnityWrapper* getWrapperChecked (int id)\r
-{\r
- auto* wrapper = juce::getWrapperMap()[id];\r
- jassert (wrapper != nullptr);\r
-\r
- return wrapper;\r
-}\r
-\r
-//==============================================================================\r
-static void UNITY_INTERFACE_API onRenderEvent (int id)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().triggerAsyncUpdate();\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT renderCallback UNITY_INTERFACE_API getRenderCallback()\r
-{\r
- return onRenderEvent;\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void unityInitialiseTexture (int id, void* data, int w, int h)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().setPixelDataHandle (reinterpret_cast<juce::uint8*> (data), w, h);\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDown (int id, float x, float y, UnityEventModifiers unityMods, int button)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, true, button));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseDrag (int id, float x, float y, UnityEventModifiers unityMods, int button)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, true, button));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityMouseUp (int id, float x, float y, UnityEventModifiers unityMods)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().forwardMouseEvent ({ x, y }, unityModifiersToJUCE (unityMods, false));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unityKeyEvent (int id, int code, UnityEventModifiers mods, const char* name)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().forwardKeyPress (code, name, unityModifiersToJUCE (mods, false));\r
-}\r
-\r
-UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, float x, float y, float w, float h)\r
-{\r
- getWrapperChecked (id)->getEditorPeer().getEditor().setBounds ({ (int) x, (int) y, (int) w, (int) h });\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_WINDOWS\r
- extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID)\r
- {\r
- if (reason == DLL_PROCESS_ATTACH)\r
- juce::Process::setCurrentModuleInstanceHandle (instance);\r
-\r
- return true;\r
- }\r
-#endif\r
-\r
-#endif\r
namespace juce\r
{\r
\r
-/** An interface to allow an AudioProcessor to send and receive VST specific calls from\r
+/** An interface to allow an AudioProcessor to receive VST specific calls from\r
the host.\r
\r
@tags{Audio}\r
pointer_sized_int value,\r
void* ptr,\r
float opt) = 0;\r
-\r
- // Note: VS2013 prevents a "using" declaration here\r
- /** The host callback function type. */\r
- typedef pointer_sized_int (VstHostCallbackType) (int32 opcode,\r
- int32 index,\r
- pointer_sized_int value,\r
- void* ptr,\r
- float opt);\r
-\r
- /** This is called once by the VST plug-in wrapper after its constructor.\r
- You can use the supplied function to query the VST host.\r
- */\r
- virtual void handleVstHostCallbackAvailable (std::function<VstHostCallbackType>&& callback)\r
- {\r
- ignoreUnused (callback);\r
- }\r
};\r
\r
} // namespace juce\r
#endif\r
\r
#include "../utility/juce_IncludeSystemHeaders.h"\r
-#include <juce_core/juce_core.h>\r
-\r
-#if JucePlugin_VersionCode < 0x010000 // Major < 0\r
-\r
- #if (JucePlugin_VersionCode & 0x00FF00) > (9 * 0x100) // check if Minor number exceeeds 9\r
- JUCE_COMPILER_WARNING ("When version has 'major' = 0, VST2 has trouble displaying 'minor' exceeding 9")\r
- #endif\r
-\r
- #if (JucePlugin_VersionCode & 0xFF) > 9 // check if Bugfix number exceeeds 9\r
- JUCE_COMPILER_WARNING ("When version has 'major' = 0, VST2 has trouble displaying 'bugfix' exceeding 9")\r
- #endif\r
-\r
-#elif JucePlugin_VersionCode >= 0x650000 // Major >= 101\r
-\r
- #if (JucePlugin_VersionCode & 0x00FF00) > (99 * 0x100) // check if Minor number exceeeds 99\r
- JUCE_COMPILER_WARNING ("When version has 'major' > 100, VST2 has trouble displaying 'minor' exceeding 99")\r
- #endif\r
-\r
- #if (JucePlugin_VersionCode & 0xFF) > 99 // check if Bugfix number exceeeds 99\r
- JUCE_COMPILER_WARNING ("When version has 'major' > 100, VST2 has trouble displaying 'bugfix' exceeding 99")\r
- #endif\r
-\r
-#endif\r
\r
#ifdef PRAGMA_ALIGN_SUPPORTED\r
#undef PRAGMA_ALIGN_SUPPORTED\r
#pragma warning (disable : 4458)\r
#endif\r
\r
-#define VST_FORCE_DEPRECATED 0\r
-\r
-namespace Vst2\r
-{\r
-// If the following files cannot be found then you are probably trying to build\r
-// a VST2 plug-in or a VST2-compatible VST3 plug-in. To do this you must have a\r
-// VST2 SDK in your header search paths or use the "VST (Legacy) SDK Folder"\r
-// field in the Projucer. The VST2 SDK can be obtained from the\r
-// vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. You\r
-// also need a VST2 license from Steinberg to distribute VST2 plug-ins.\r
-#include "pluginterfaces/vst2.x/aeffect.h"\r
-#include "pluginterfaces/vst2.x/aeffectx.h"\r
-}\r
-\r
-using namespace juce;\r
+#include <juce_core/juce_core.h>\r
+#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
\r
#ifdef _MSC_VER\r
#pragma warning (pop)\r
#pragma pack (push, 8)\r
#endif\r
\r
-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
-\r
#include "../utility/juce_IncludeModuleHeaders.h"\r
#include "../utility/juce_FakeMouseMoveGenerator.h"\r
#include "../utility/juce_WindowsHooks.h"\r
#include "../../juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp"\r
#include "../../juce_audio_processors/format_types/juce_VSTCommon.h"\r
\r
-#if JUCE_BIG_ENDIAN\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
-#else\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
-#endif\r
-\r
#ifdef _MSC_VER\r
#pragma pack (pop)\r
#endif\r
\r
public:\r
//==============================================================================\r
- JuceVSTWrapper (Vst2::audioMasterCallback cb, AudioProcessor* af)\r
+ JuceVSTWrapper (VstHostCallback cb, AudioProcessor* af)\r
: hostCallback (cb),\r
processor (af)\r
{\r
juceParameters.update (*processor, false);\r
\r
memset (&vstEffect, 0, sizeof (vstEffect));\r
- vstEffect.magic = 0x56737450 /* 'VstP' */;\r
- vstEffect.dispatcher = (Vst2::AEffectDispatcherProc) dispatcherCB;\r
- vstEffect.process = nullptr;\r
- vstEffect.setParameter = (Vst2::AEffectSetParameterProc) setParameterCB;\r
- vstEffect.getParameter = (Vst2::AEffectGetParameterProc) getParameterCB;\r
+ vstEffect.interfaceIdentifier = juceVstInterfaceIdentifier;\r
+ vstEffect.dispatchFunction = dispatcherCB;\r
+ vstEffect.processAudioFunction = nullptr;\r
+ vstEffect.setParameterValueFunction = setParameterCB;\r
+ vstEffect.getParameterValueFunction = getParameterCB;\r
vstEffect.numPrograms = jmax (1, af->getNumPrograms());\r
- vstEffect.numParams = juceParameters.getNumParameters();\r
- vstEffect.numInputs = maxNumInChannels;\r
- vstEffect.numOutputs = maxNumOutChannels;\r
- vstEffect.initialDelay = processor->getLatencySamples();\r
- vstEffect.object = this;\r
- vstEffect.uniqueID = JucePlugin_VSTUniqueID;\r
+ vstEffect.numParameters = juceParameters.getNumParameters();\r
+ vstEffect.numInputChannels = maxNumInChannels;\r
+ vstEffect.numOutputChannels = maxNumOutChannels;\r
+ vstEffect.latency = processor->getLatencySamples();\r
+ vstEffect.effectPointer = this;\r
+ vstEffect.plugInIdentifier = JucePlugin_VSTUniqueID;\r
\r
#ifdef JucePlugin_VSTChunkStructureVersion\r
- vstEffect.version = JucePlugin_VSTChunkStructureVersion;\r
+ vstEffect.plugInVersion = JucePlugin_VSTChunkStructureVersion;\r
#else\r
- vstEffect.version = JucePlugin_VersionCode;\r
+ vstEffect.plugInVersion = JucePlugin_VersionCode;\r
#endif\r
\r
- vstEffect.processReplacing = (Vst2::AEffectProcessProc) processReplacingCB;\r
- vstEffect.processDoubleReplacing = (Vst2::AEffectProcessDoubleProc) processDoubleReplacingCB;\r
+ vstEffect.processAudioInplaceFunction = processReplacingCB;\r
+ vstEffect.processDoubleAudioInplaceFunction = processDoubleReplacingCB;\r
\r
- vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+ vstEffect.flags |= vstEffectFlagHasEditor;\r
\r
- vstEffect.flags |= Vst2::effFlagsCanReplacing;\r
+ vstEffect.flags |= vstEffectFlagInplaceAudio;\r
if (processor->supportsDoublePrecisionProcessing())\r
- vstEffect.flags |= Vst2::effFlagsCanDoubleReplacing;\r
-\r
- vstEffect.flags |= Vst2::effFlagsProgramChunks;\r
+ vstEffect.flags |= vstEffectFlagInplaceDoubleAudio;\r
\r
#if JucePlugin_IsSynth\r
- vstEffect.flags |= Vst2::effFlagsIsSynth;\r
- #else\r
- if (processor->getTailLengthSeconds() == 0.0)\r
- vstEffect.flags |= Vst2::effFlagsNoSoundInStop;\r
+ vstEffect.flags |= vstEffectFlagIsSynth;\r
#endif\r
\r
+ vstEffect.flags |= vstEffectFlagDataInChunks;\r
+\r
activePlugins.add (this);\r
}\r
\r
}\r
}\r
\r
- Vst2::AEffect* getAEffect() noexcept { return &vstEffect; }\r
+ VstEffectInterface* getVstEffectInterface() noexcept { return &vstEffect; }\r
\r
template <typename FloatType>\r
void internalProcessReplacing (FloatType** inputs, FloatType** outputs,\r
\r
// Send VST events to the host.\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterProcessEvents, 0, 0, outgoingEvents.events, 0);\r
+ hostCallback (&vstEffect, hostOpcodePreAudioProcessingEvents, 0, 0, outgoingEvents.events, 0);\r
#elif JUCE_DEBUG\r
/* This assertion is caused when you've added some events to the\r
midiMessages array in your processBlock() method, which usually means\r
internalProcessReplacing (inputs, outputs, sampleFrames, floatTempBuffers);\r
}\r
\r
- static void processReplacingCB (Vst2::AEffect* vstInterface, float** inputs, float** outputs, int32 sampleFrames)\r
+ static void processReplacingCB (VstEffectInterface* vstInterface, float** inputs, float** outputs, int32 sampleFrames)\r
{\r
getWrapper (vstInterface)->processReplacing (inputs, outputs, sampleFrames);\r
}\r
internalProcessReplacing (inputs, outputs, sampleFrames, doubleTempBuffers);\r
}\r
\r
- static void processDoubleReplacingCB (Vst2::AEffect* vstInterface, double** inputs, double** outputs, int32 sampleFrames)\r
+ static void processDoubleReplacingCB (VstEffectInterface* vstInterface, double** inputs, double** outputs, int32 sampleFrames)\r
{\r
getWrapper (vstInterface)->processDoubleReplacing (inputs, outputs, sampleFrames);\r
}\r
{\r
isProcessing = true;\r
\r
- auto numInAndOutChannels = static_cast<size_t> (vstEffect.numInputs + vstEffect.numOutputs);\r
+ auto numInAndOutChannels = static_cast<size_t> (vstEffect.numInputChannels + vstEffect.numOutputChannels);\r
floatTempBuffers .channels.calloc (numInAndOutChannels);\r
doubleTempBuffers.channels.calloc (numInAndOutChannels);\r
\r
midiEvents.ensureSize (2048);\r
midiEvents.clear();\r
\r
- vstEffect.initialDelay = processor->getLatencySamples();\r
+ vstEffect.latency = processor->getLatencySamples();\r
\r
/** If this plug-in is a synth or it can receive midi events we need to tell the\r
host that we want midi. In the SDK this method is marked as deprecated, but\r
some hosts rely on this behaviour.\r
*/\r
- if (vstEffect.flags & Vst2::effFlagsIsSynth || JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect)\r
+ if (vstEffect.flags & vstEffectFlagIsSynth || JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect)\r
{\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterWantMidi, 0, 1, 0, 0);\r
+ hostCallback (&vstEffect, hostOpcodePlugInWantsMidi, 0, 1, 0, 0);\r
}\r
\r
if (getHostType().isAbletonLive()\r
&& hostCallback != nullptr\r
- && processor->getTailLengthSeconds() == std::numeric_limits<double>::infinity())\r
+ && processor->getTailLengthSeconds() == std::numeric_limits<double>::max())\r
{\r
AbletonLiveHostSpecific hostCmd;\r
\r
hostCmd.commandSize = sizeof (int);\r
hostCmd.flags = AbletonLiveHostSpecific::KCantBeSuspended;\r
\r
- hostCallback (&vstEffect, Vst2::audioMasterVendorSpecific, 0, 0, &hostCmd, 0.0f);\r
+ hostCallback (&vstEffect, hostOpcodeManufacturerSpecific, 0, 0, &hostCmd, 0.0f);\r
}\r
\r
#if JucePlugin_ProducesMidiOutput || JucePlugin_IsMidiEffect\r
//==============================================================================\r
bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override\r
{\r
- const Vst2::VstTimeInfo* ti = nullptr;\r
+ const VstTimingInformation* ti = nullptr;\r
\r
if (hostCallback != nullptr)\r
{\r
- int32 flags = Vst2::kVstPpqPosValid | Vst2::kVstTempoValid\r
- | Vst2::kVstBarsValid | Vst2::kVstCyclePosValid\r
- | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid\r
- | Vst2::kVstClockValid;\r
+ int32 flags = vstTimingInfoFlagMusicalPositionValid | vstTimingInfoFlagTempoValid\r
+ | vstTimingInfoFlagLastBarPositionValid | vstTimingInfoFlagLoopPositionValid\r
+ | vstTimingInfoFlagTimeSignatureValid | vstTimingInfoFlagSmpteValid\r
+ | vstTimingInfoFlagNearestClockValid;\r
\r
- auto result = hostCallback (&vstEffect, Vst2::audioMasterGetTime, 0, flags, 0, 0);\r
- ti = reinterpret_cast<Vst2::VstTimeInfo*> (result);\r
+ auto result = hostCallback (&vstEffect, hostOpcodeGetTimingInfo, 0, flags, 0, 0);\r
+ ti = reinterpret_cast<VstTimingInformation*> (result);\r
}\r
\r
if (ti == nullptr || ti->sampleRate <= 0)\r
return false;\r
\r
- info.bpm = (ti->flags & Vst2::kVstTempoValid) != 0 ? ti->tempo : 0.0;\r
+ info.bpm = (ti->flags & vstTimingInfoFlagTempoValid) != 0 ? ti->tempoBPM : 0.0;\r
\r
- if ((ti->flags & Vst2::kVstTimeSigValid) != 0)\r
+ if ((ti->flags & vstTimingInfoFlagTimeSignatureValid) != 0)\r
{\r
- info.timeSigNumerator = ti->timeSigNumerator;\r
- info.timeSigDenominator = ti->timeSigDenominator;\r
+ info.timeSigNumerator = ti->timeSignatureNumerator;\r
+ info.timeSigDenominator = ti->timeSignatureDenominator;\r
}\r
else\r
{\r
info.timeSigDenominator = 4;\r
}\r
\r
- info.timeInSamples = (int64) (ti->samplePos + 0.5);\r
- info.timeInSeconds = ti->samplePos / ti->sampleRate;\r
- info.ppqPosition = (ti->flags & Vst2::kVstPpqPosValid) != 0 ? ti->ppqPos : 0.0;\r
- info.ppqPositionOfLastBarStart = (ti->flags & Vst2::kVstBarsValid) != 0 ? ti->barStartPos : 0.0;\r
+ info.timeInSamples = (int64) (ti->samplePosition + 0.5);\r
+ info.timeInSeconds = ti->samplePosition / ti->sampleRate;\r
+ info.ppqPosition = (ti->flags & vstTimingInfoFlagMusicalPositionValid) != 0 ? ti->musicalPosition : 0.0;\r
+ info.ppqPositionOfLastBarStart = (ti->flags & vstTimingInfoFlagLastBarPositionValid) != 0 ? ti->lastBarPosition : 0.0;\r
\r
- if ((ti->flags & Vst2::kVstSmpteValid) != 0)\r
+ if ((ti->flags & vstTimingInfoFlagSmpteValid) != 0)\r
{\r
AudioPlayHead::FrameRateType rate = AudioPlayHead::fpsUnknown;\r
double fps = 1.0;\r
\r
- switch (ti->smpteFrameRate)\r
+ switch (ti->smpteRate)\r
{\r
- case Vst2::kVstSmpte239fps: rate = AudioPlayHead::fps23976; fps = 24.0 * 1000.0 / 1001.0; break;\r
- case Vst2::kVstSmpte24fps: rate = AudioPlayHead::fps24; fps = 24.0; break;\r
- case Vst2::kVstSmpte25fps: rate = AudioPlayHead::fps25; fps = 25.0; break;\r
- case Vst2::kVstSmpte2997fps: rate = AudioPlayHead::fps2997; fps = 30.0 * 1000.0 / 1001.0; break;\r
- case Vst2::kVstSmpte30fps: rate = AudioPlayHead::fps30; fps = 30.0; break;\r
- case Vst2::kVstSmpte2997dfps: rate = AudioPlayHead::fps2997drop; fps = 30.0 * 1000.0 / 1001.0; break;\r
- case Vst2::kVstSmpte30dfps: rate = AudioPlayHead::fps30drop; fps = 30.0; break;\r
-\r
- case Vst2::kVstSmpteFilm16mm:\r
- case Vst2::kVstSmpteFilm35mm: fps = 24.0; break;\r
-\r
- case Vst2::kVstSmpte249fps: fps = 25.0 * 1000.0 / 1001.0; break;\r
- case Vst2::kVstSmpte599fps: fps = 60.0 * 1000.0 / 1001.0; break;\r
- case Vst2::kVstSmpte60fps: fps = 60; break;\r
-\r
- default: jassertfalse; // unknown frame-rate..\r
+ case vstSmpteRateFps239: rate = AudioPlayHead::fps23976; fps = 24.0 * 1000.0 / 1001.0; break;\r
+ case vstSmpteRateFps24: rate = AudioPlayHead::fps24; fps = 24.0; break;\r
+ case vstSmpteRateFps25: rate = AudioPlayHead::fps25; fps = 25.0; break;\r
+ case vstSmpteRateFps2997: rate = AudioPlayHead::fps2997; fps = 30.0 * 1000.0 / 1001.0; break;\r
+ case vstSmpteRateFps30: rate = AudioPlayHead::fps30; fps = 30.0; break;\r
+ case vstSmpteRateFps2997drop: rate = AudioPlayHead::fps2997drop; fps = 30.0 * 1000.0 / 1001.0; break;\r
+ case vstSmpteRateFps30drop: rate = AudioPlayHead::fps30drop; fps = 30.0; break;\r
+\r
+ case vstSmpteRate16mmFilm:\r
+ case vstSmpteRate35mmFilm: fps = 24.0; break;\r
+\r
+ case vstSmpteRateFps249: fps = 25.0 * 1000.0 / 1001.0; break;\r
+ case vstSmpteRateFps599: fps = 60.0 * 1000.0 / 1001.0; break;\r
+ case vstSmpteRateFps60: fps = 60; break;\r
+\r
+ default: jassertfalse; // unknown frame-rate..\r
}\r
\r
info.frameRate = rate;\r
info.editOriginTime = 0;\r
}\r
\r
- info.isRecording = (ti->flags & Vst2::kVstTransportRecording) != 0;\r
- info.isPlaying = (ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0;\r
- info.isLooping = (ti->flags & Vst2::kVstTransportCycleActive) != 0;\r
+ info.isRecording = (ti->flags & vstTimingInfoFlagCurrentlyRecording) != 0;\r
+ info.isPlaying = (ti->flags & (vstTimingInfoFlagCurrentlyRecording | vstTimingInfoFlagCurrentlyPlaying)) != 0;\r
+ info.isLooping = (ti->flags & vstTimingInfoFlagLoopActive) != 0;\r
\r
- if ((ti->flags & Vst2::kVstCyclePosValid) != 0)\r
+ if ((ti->flags & vstTimingInfoFlagLoopPositionValid) != 0)\r
{\r
- info.ppqLoopStart = ti->cycleStartPos;\r
- info.ppqLoopEnd = ti->cycleEndPos;\r
+ info.ppqLoopStart = ti->loopStartPosition;\r
+ info.ppqLoopEnd = ti->loopEndPosition;\r
}\r
else\r
{\r
return 0.0f;\r
}\r
\r
- static float getParameterCB (Vst2::AEffect* vstInterface, int32 index)\r
+ static float getParameterCB (VstEffectInterface* vstInterface, int32 index)\r
{\r
return getWrapper (vstInterface)->getParameter (index);\r
}\r
}\r
}\r
\r
- static void setParameterCB (Vst2::AEffect* vstInterface, int32 index, float value)\r
+ static void setParameterCB (VstEffectInterface* vstInterface, int32 index, float value)\r
{\r
getWrapper (vstInterface)->setParameter (index, value);\r
}\r
}\r
\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterAutomate, index, 0, 0, newValue);\r
+ hostCallback (&vstEffect, hostOpcodeParameterChanged, index, 0, 0, newValue);\r
}\r
\r
void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override\r
{\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterBeginEdit, index, 0, 0, 0);\r
+ hostCallback (&vstEffect, hostOpcodeParameterChangeGestureBegin, index, 0, 0, 0);\r
}\r
\r
void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override\r
{\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterEndEdit, index, 0, 0, 0);\r
+ hostCallback (&vstEffect, hostOpcodeParameterChangeGestureEnd, index, 0, 0, 0);\r
}\r
\r
void parameterValueChanged (int, float newValue) override\r
\r
void audioProcessorChanged (AudioProcessor*) override\r
{\r
- vstEffect.initialDelay = processor->getLatencySamples();\r
+ vstEffect.latency = processor->getLatencySamples();\r
\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterUpdateDisplay, 0, 0, 0, 0);\r
+ hostCallback (&vstEffect, hostOpcodeUpdateView, 0, 0, 0, 0);\r
\r
triggerAsyncUpdate();\r
}\r
void handleAsyncUpdate() override\r
{\r
if (hostCallback != nullptr)\r
- hostCallback (&vstEffect, Vst2::audioMasterIOChanged, 0, 0, 0, 0);\r
+ hostCallback (&vstEffect, hostOpcodeIOModified, 0, 0, 0, 0);\r
}\r
\r
- bool getPinProperties (Vst2::VstPinProperties& properties, bool direction, int index) const\r
+ bool getPinProperties (VstPinInfo& properties, bool direction, int index) const\r
{\r
if (processor->isMidiEffect())\r
return false;\r
\r
// fill with default\r
properties.flags = 0;\r
- properties.label[0] = 0;\r
- properties.shortLabel[0] = 0;\r
- properties.arrangementType = Vst2::kSpeakerArrEmpty;\r
+ properties.text[0] = 0;\r
+ properties.shortText[0] = 0;\r
+ properties.configurationType = vstSpeakerConfigTypeEmpty;\r
\r
if ((channelIdx = processor->getOffsetInBusBufferForAbsoluteChannelIndex (direction, index, busIdx)) >= 0)\r
{\r
auto& channelSet = bus.getCurrentLayout();\r
auto channelType = channelSet.getTypeOfChannel (channelIdx);\r
\r
- properties.flags = Vst2::kVstPinIsActive | Vst2::kVstPinUseSpeaker;\r
- properties.arrangementType = SpeakerMappings::channelSetToVstArrangementType (channelSet);\r
+ properties.flags = vstPinInfoFlagIsActive | vstPinInfoFlagValid;\r
+ properties.configurationType = SpeakerMappings::channelSetToVstArrangementType (channelSet);\r
String label = bus.getName();\r
\r
#ifdef JucePlugin_PreferredChannelConfigurations\r
label += " " + AudioChannelSet::getAbbreviatedChannelTypeName (channelType);\r
#endif\r
\r
- label.copyToUTF8 (properties.label, (size_t) (Vst2::kVstMaxLabelLen + 1));\r
- label.copyToUTF8 (properties.shortLabel, (size_t) (Vst2::kVstMaxShortLabelLen + 1));\r
+ label.copyToUTF8 (properties.text, (size_t) (vstMaxParameterOrPinLabelLength + 1));\r
+ label.copyToUTF8 (properties.shortText, (size_t) (vstMaxParameterOrPinShortLabelLength + 1));\r
\r
if (channelType == AudioChannelSet::left\r
|| channelType == AudioChannelSet::leftSurround\r
|| channelType == AudioChannelSet::topRearLeft\r
|| channelType == AudioChannelSet::leftSurroundRear\r
|| channelType == AudioChannelSet::wideLeft)\r
- properties.flags |= Vst2::kVstPinIsStereo;\r
+ properties.flags |= vstPinInfoFlagIsStereo;\r
\r
return true;\r
}\r
}\r
};\r
\r
- static AudioChannelSet vstArrangementTypeToChannelSet (const Vst2::VstSpeakerArrangement& arr)\r
- {\r
- if (arr.type == Vst2::kSpeakerArrEmpty) return AudioChannelSet::disabled();\r
- if (arr.type == Vst2::kSpeakerArrMono) return AudioChannelSet::mono();\r
- if (arr.type == Vst2::kSpeakerArrStereo) return AudioChannelSet::stereo();\r
- if (arr.type == Vst2::kSpeakerArr30Cine) return AudioChannelSet::createLCR();\r
- if (arr.type == Vst2::kSpeakerArr30Music) return AudioChannelSet::createLRS();\r
- if (arr.type == Vst2::kSpeakerArr40Cine) return AudioChannelSet::createLCRS();\r
- if (arr.type == Vst2::kSpeakerArr50) return AudioChannelSet::create5point0();\r
- if (arr.type == Vst2::kSpeakerArr51) return AudioChannelSet::create5point1();\r
- if (arr.type == Vst2::kSpeakerArr60Cine) return AudioChannelSet::create6point0();\r
- if (arr.type == Vst2::kSpeakerArr61Cine) return AudioChannelSet::create6point1();\r
- if (arr.type == Vst2::kSpeakerArr60Music) return AudioChannelSet::create6point0Music();\r
- if (arr.type == Vst2::kSpeakerArr61Music) return AudioChannelSet::create6point1Music();\r
- if (arr.type == Vst2::kSpeakerArr70Music) return AudioChannelSet::create7point0();\r
- if (arr.type == Vst2::kSpeakerArr70Cine) return AudioChannelSet::create7point0SDDS();\r
- if (arr.type == Vst2::kSpeakerArr71Music) return AudioChannelSet::create7point1();\r
- if (arr.type == Vst2::kSpeakerArr71Cine) return AudioChannelSet::create7point1SDDS();\r
- if (arr.type == Vst2::kSpeakerArr40Music) return AudioChannelSet::quadraphonic();\r
-\r
- for (auto* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+ static AudioChannelSet vstArrangementTypeToChannelSet (const VstSpeakerConfiguration& arr)\r
+ {\r
+ if (arr.type == vstSpeakerConfigTypeEmpty) return AudioChannelSet::disabled();\r
+ if (arr.type == vstSpeakerConfigTypeMono) return AudioChannelSet::mono();\r
+ if (arr.type == vstSpeakerConfigTypeLR) return AudioChannelSet::stereo();\r
+ if (arr.type == vstSpeakerConfigTypeLRC) return AudioChannelSet::createLCR();\r
+ if (arr.type == vstSpeakerConfigTypeLRS) return AudioChannelSet::createLRS();\r
+ if (arr.type == vstSpeakerConfigTypeLRCS) return AudioChannelSet::createLCRS();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLsRs) return AudioChannelSet::create5point0();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLfeLsRs) return AudioChannelSet::create5point1();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLsRsCs) return AudioChannelSet::create6point0();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsCs) return AudioChannelSet::create6point1();\r
+ if (arr.type == vstSpeakerConfigTypeLRLsRsSlSr) return AudioChannelSet::create6point0Music();\r
+ if (arr.type == vstSpeakerConfigTypeLRLfeLsRsSlSr) return AudioChannelSet::create6point1Music();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLsRsSlSr) return AudioChannelSet::create7point0();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLsRsLcRc) return AudioChannelSet::create7point0SDDS();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsSlSr) return AudioChannelSet::create7point1();\r
+ if (arr.type == vstSpeakerConfigTypeLRCLfeLsRsLcRc) return AudioChannelSet::create7point1SDDS();\r
+ if (arr.type == vstSpeakerConfigTypeLRLsRs) return AudioChannelSet::quadraphonic();\r
+\r
+ for (auto* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
{\r
if (m->vst2 == arr.type)\r
{\r
}\r
}\r
\r
- return AudioChannelSet::discreteChannels (arr.numChannels);\r
+ return AudioChannelSet::discreteChannels (arr.numberOfChannels);\r
}\r
\r
static int32 channelSetToVstArrangementType (AudioChannelSet channels)\r
{\r
- if (channels == AudioChannelSet::disabled()) return Vst2::kSpeakerArrEmpty;\r
- if (channels == AudioChannelSet::mono()) return Vst2::kSpeakerArrMono;\r
- if (channels == AudioChannelSet::stereo()) return Vst2::kSpeakerArrStereo;\r
- if (channels == AudioChannelSet::createLCR()) return Vst2::kSpeakerArr30Cine;\r
- if (channels == AudioChannelSet::createLRS()) return Vst2::kSpeakerArr30Music;\r
- if (channels == AudioChannelSet::createLCRS()) return Vst2::kSpeakerArr40Cine;\r
- if (channels == AudioChannelSet::create5point0()) return Vst2::kSpeakerArr50;\r
- if (channels == AudioChannelSet::create5point1()) return Vst2::kSpeakerArr51;\r
- if (channels == AudioChannelSet::create6point0()) return Vst2::kSpeakerArr60Cine;\r
- if (channels == AudioChannelSet::create6point1()) return Vst2::kSpeakerArr61Cine;\r
- if (channels == AudioChannelSet::create6point0Music()) return Vst2::kSpeakerArr60Music;\r
- if (channels == AudioChannelSet::create6point1Music()) return Vst2::kSpeakerArr61Music;\r
- if (channels == AudioChannelSet::create7point0()) return Vst2::kSpeakerArr70Music;\r
- if (channels == AudioChannelSet::create7point0SDDS()) return Vst2::kSpeakerArr70Cine;\r
- if (channels == AudioChannelSet::create7point1()) return Vst2::kSpeakerArr71Music;\r
- if (channels == AudioChannelSet::create7point1SDDS()) return Vst2::kSpeakerArr71Cine;\r
- if (channels == AudioChannelSet::quadraphonic()) return Vst2::kSpeakerArr40Music;\r
+ if (channels == AudioChannelSet::disabled()) return vstSpeakerConfigTypeEmpty;\r
+ if (channels == AudioChannelSet::mono()) return vstSpeakerConfigTypeMono;\r
+ if (channels == AudioChannelSet::stereo()) return vstSpeakerConfigTypeLR;\r
+ if (channels == AudioChannelSet::createLCR()) return vstSpeakerConfigTypeLRC;\r
+ if (channels == AudioChannelSet::createLRS()) return vstSpeakerConfigTypeLRS;\r
+ if (channels == AudioChannelSet::createLCRS()) return vstSpeakerConfigTypeLRCS;\r
+ if (channels == AudioChannelSet::create5point0()) return vstSpeakerConfigTypeLRCLsRs;\r
+ if (channels == AudioChannelSet::create5point1()) return vstSpeakerConfigTypeLRCLfeLsRs;\r
+ if (channels == AudioChannelSet::create6point0()) return vstSpeakerConfigTypeLRCLsRsCs;\r
+ if (channels == AudioChannelSet::create6point1()) return vstSpeakerConfigTypeLRCLfeLsRsCs;\r
+ if (channels == AudioChannelSet::create6point0Music()) return vstSpeakerConfigTypeLRLsRsSlSr;\r
+ if (channels == AudioChannelSet::create6point1Music()) return vstSpeakerConfigTypeLRLfeLsRsSlSr;\r
+ if (channels == AudioChannelSet::create7point0()) return vstSpeakerConfigTypeLRCLsRsSlSr;\r
+ if (channels == AudioChannelSet::create7point0SDDS()) return vstSpeakerConfigTypeLRCLsRsLcRc;\r
+ if (channels == AudioChannelSet::create7point1()) return vstSpeakerConfigTypeLRCLfeLsRsSlSr;\r
+ if (channels == AudioChannelSet::create7point1SDDS()) return vstSpeakerConfigTypeLRCLfeLsRsLcRc;\r
+ if (channels == AudioChannelSet::quadraphonic()) return vstSpeakerConfigTypeLRLsRs;\r
\r
if (channels == AudioChannelSet::disabled())\r
- return Vst2::kSpeakerArrEmpty;\r
+ return vstSpeakerConfigTypeEmpty;\r
\r
auto chans = channels.getChannelTypes();\r
\r
- for (auto* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+ for (auto* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
if (m->matches (chans))\r
return m->vst2;\r
\r
- return Vst2::kSpeakerArrUserDefined;\r
+ return vstSpeakerConfigTypeUser;\r
}\r
\r
- static void channelSetToVstArrangement (const AudioChannelSet& channels, Vst2::VstSpeakerArrangement& result)\r
+ static void channelSetToVstArrangement (const AudioChannelSet& channels, VstSpeakerConfiguration& result)\r
{\r
result.type = channelSetToVstArrangementType (channels);\r
- result.numChannels = channels.size();\r
+ result.numberOfChannels = channels.size();\r
\r
- for (int i = 0; i < result.numChannels; ++i)\r
+ for (int i = 0; i < result.numberOfChannels; ++i)\r
{\r
auto& speaker = result.speakers[i];\r
\r
- zeromem (&speaker, sizeof (Vst2::VstSpeakerProperties));\r
+ zeromem (&speaker, sizeof (VstIndividualSpeakerInfo));\r
speaker.type = getSpeakerType (channels.getTypeOfChannel (i));\r
}\r
}\r
{\r
static const Mapping mappings[] =\r
{\r
- { Vst2::kSpeakerArrMono, { centre, unknown } },\r
- { Vst2::kSpeakerArrStereo, { left, right, unknown } },\r
- { Vst2::kSpeakerArrStereoSurround, { leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArrStereoCenter, { leftCentre, rightCentre, unknown } },\r
- { Vst2::kSpeakerArrStereoSide, { leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArrStereoCLfe, { centre, LFE, unknown } },\r
- { Vst2::kSpeakerArr30Cine, { left, right, centre, unknown } },\r
- { Vst2::kSpeakerArr30Music, { left, right, surround, unknown } },\r
- { Vst2::kSpeakerArr31Cine, { left, right, centre, LFE, unknown } },\r
- { Vst2::kSpeakerArr31Music, { left, right, LFE, surround, unknown } },\r
- { Vst2::kSpeakerArr40Cine, { left, right, centre, surround, unknown } },\r
- { Vst2::kSpeakerArr40Music, { left, right, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr41Cine, { left, right, centre, LFE, surround, unknown } },\r
- { Vst2::kSpeakerArr41Music, { left, right, LFE, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr50, { left, right, centre, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr51, { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr60Cine, { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
- { Vst2::kSpeakerArr60Music, { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr61Cine, { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
- { Vst2::kSpeakerArr61Music, { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr70Cine, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
- { Vst2::kSpeakerArr70Music, { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr71Cine, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
- { Vst2::kSpeakerArr71Music, { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr80Cine, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
- { Vst2::kSpeakerArr80Music, { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr81Cine, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
- { Vst2::kSpeakerArr81Music, { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr102, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
- { Vst2::kSpeakerArrEmpty, { unknown } }\r
+ { vstSpeakerConfigTypeMono, { centre, unknown } },\r
+ { vstSpeakerConfigTypeLR, { left, right, unknown } },\r
+ { vstSpeakerConfigTypeLsRs, { leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLcRc, { leftCentre, rightCentre, unknown } },\r
+ { vstSpeakerConfigTypeSlSr, { leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeCLfe, { centre, LFE, unknown } },\r
+ { vstSpeakerConfigTypeLRC, { left, right, centre, unknown } },\r
+ { vstSpeakerConfigTypeLRS, { left, right, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfe, { left, right, centre, LFE, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeS, { left, right, LFE, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCS, { left, right, centre, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLsRs, { left, right, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeS, { left, right, centre, LFE, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeLsRs, { left, right, LFE, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRs, { left, right, centre, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRs, { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsCs, { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLsRsSlSr, { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsCs, { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeLsRsSlSr, { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsLcRc, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsSlSr, { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsLcRc, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsSlSr, { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsLcRcCs, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsCsSlSr, { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsLcRcCs, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsCsSlSr, { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
+ { vstSpeakerConfigTypeEmpty, { unknown } }\r
};\r
\r
return mappings;\r
{\r
switch (type)\r
{\r
- case AudioChannelSet::left: return Vst2::kSpeakerL;\r
- case AudioChannelSet::right: return Vst2::kSpeakerR;\r
- case AudioChannelSet::centre: return Vst2::kSpeakerC;\r
- case AudioChannelSet::LFE: return Vst2::kSpeakerLfe;\r
- case AudioChannelSet::leftSurround: return Vst2::kSpeakerLs;\r
- case AudioChannelSet::rightSurround: return Vst2::kSpeakerRs;\r
- case AudioChannelSet::leftCentre: return Vst2::kSpeakerLc;\r
- case AudioChannelSet::rightCentre: return Vst2::kSpeakerRc;\r
- case AudioChannelSet::surround: return Vst2::kSpeakerS;\r
- case AudioChannelSet::leftSurroundRear: return Vst2::kSpeakerSl;\r
- case AudioChannelSet::rightSurroundRear: return Vst2::kSpeakerSr;\r
- case AudioChannelSet::topMiddle: return Vst2::kSpeakerTm;\r
- case AudioChannelSet::topFrontLeft: return Vst2::kSpeakerTfl;\r
- case AudioChannelSet::topFrontCentre: return Vst2::kSpeakerTfc;\r
- case AudioChannelSet::topFrontRight: return Vst2::kSpeakerTfr;\r
- case AudioChannelSet::topRearLeft: return Vst2::kSpeakerTrl;\r
- case AudioChannelSet::topRearCentre: return Vst2::kSpeakerTrc;\r
- case AudioChannelSet::topRearRight: return Vst2::kSpeakerTrr;\r
- case AudioChannelSet::LFE2: return Vst2::kSpeakerLfe2;\r
+ case AudioChannelSet::left: return vstIndividualSpeakerTypeLeft;\r
+ case AudioChannelSet::right: return vstIndividualSpeakerTypeRight;\r
+ case AudioChannelSet::centre: return vstIndividualSpeakerTypeCentre;\r
+ case AudioChannelSet::LFE: return vstIndividualSpeakerTypeLFE;\r
+ case AudioChannelSet::leftSurround: return vstIndividualSpeakerTypeLeftSurround;\r
+ case AudioChannelSet::rightSurround: return vstIndividualSpeakerTypeRightSurround;\r
+ case AudioChannelSet::leftCentre: return vstIndividualSpeakerTypeLeftCentre;\r
+ case AudioChannelSet::rightCentre: return vstIndividualSpeakerTypeRightCentre;\r
+ case AudioChannelSet::surround: return vstIndividualSpeakerTypeSurround;\r
+ case AudioChannelSet::leftSurroundRear: return vstIndividualSpeakerTypeLeftRearSurround;\r
+ case AudioChannelSet::rightSurroundRear: return vstIndividualSpeakerTypeRightRearSurround;\r
+ case AudioChannelSet::topMiddle: return vstIndividualSpeakerTypeTopMiddle;\r
+ case AudioChannelSet::topFrontLeft: return vstIndividualSpeakerTypeTopFrontLeft;\r
+ case AudioChannelSet::topFrontCentre: return vstIndividualSpeakerTypeTopFrontCentre;\r
+ case AudioChannelSet::topFrontRight: return vstIndividualSpeakerTypeTopFrontRight;\r
+ case AudioChannelSet::topRearLeft: return vstIndividualSpeakerTypeTopRearLeft;\r
+ case AudioChannelSet::topRearCentre: return vstIndividualSpeakerTypeTopRearCentre;\r
+ case AudioChannelSet::topRearRight: return vstIndividualSpeakerTypeTopRearRight;\r
+ case AudioChannelSet::LFE2: return vstIndividualSpeakerTypeLFE2;\r
default: break;\r
}\r
\r
{\r
switch (type)\r
{\r
- case Vst2::kSpeakerL: return AudioChannelSet::left;\r
- case Vst2::kSpeakerR: return AudioChannelSet::right;\r
- case Vst2::kSpeakerC: return AudioChannelSet::centre;\r
- case Vst2::kSpeakerLfe: return AudioChannelSet::LFE;\r
- case Vst2::kSpeakerLs: return AudioChannelSet::leftSurround;\r
- case Vst2::kSpeakerRs: return AudioChannelSet::rightSurround;\r
- case Vst2::kSpeakerLc: return AudioChannelSet::leftCentre;\r
- case Vst2::kSpeakerRc: return AudioChannelSet::rightCentre;\r
- case Vst2::kSpeakerS: return AudioChannelSet::surround;\r
- case Vst2::kSpeakerSl: return AudioChannelSet::leftSurroundRear;\r
- case Vst2::kSpeakerSr: return AudioChannelSet::rightSurroundRear;\r
- case Vst2::kSpeakerTm: return AudioChannelSet::topMiddle;\r
- case Vst2::kSpeakerTfl: return AudioChannelSet::topFrontLeft;\r
- case Vst2::kSpeakerTfc: return AudioChannelSet::topFrontCentre;\r
- case Vst2::kSpeakerTfr: return AudioChannelSet::topFrontRight;\r
- case Vst2::kSpeakerTrl: return AudioChannelSet::topRearLeft;\r
- case Vst2::kSpeakerTrc: return AudioChannelSet::topRearCentre;\r
- case Vst2::kSpeakerTrr: return AudioChannelSet::topRearRight;\r
- case Vst2::kSpeakerLfe2: return AudioChannelSet::LFE2;\r
+ case vstIndividualSpeakerTypeLeft: return AudioChannelSet::left;\r
+ case vstIndividualSpeakerTypeRight: return AudioChannelSet::right;\r
+ case vstIndividualSpeakerTypeCentre: return AudioChannelSet::centre;\r
+ case vstIndividualSpeakerTypeLFE: return AudioChannelSet::LFE;\r
+ case vstIndividualSpeakerTypeLeftSurround: return AudioChannelSet::leftSurround;\r
+ case vstIndividualSpeakerTypeRightSurround: return AudioChannelSet::rightSurround;\r
+ case vstIndividualSpeakerTypeLeftCentre: return AudioChannelSet::leftCentre;\r
+ case vstIndividualSpeakerTypeRightCentre: return AudioChannelSet::rightCentre;\r
+ case vstIndividualSpeakerTypeSurround: return AudioChannelSet::surround;\r
+ case vstIndividualSpeakerTypeLeftRearSurround: return AudioChannelSet::leftSurroundRear;\r
+ case vstIndividualSpeakerTypeRightRearSurround: return AudioChannelSet::rightSurroundRear;\r
+ case vstIndividualSpeakerTypeTopMiddle: return AudioChannelSet::topMiddle;\r
+ case vstIndividualSpeakerTypeTopFrontLeft: return AudioChannelSet::topFrontLeft;\r
+ case vstIndividualSpeakerTypeTopFrontCentre: return AudioChannelSet::topFrontCentre;\r
+ case vstIndividualSpeakerTypeTopFrontRight: return AudioChannelSet::topFrontRight;\r
+ case vstIndividualSpeakerTypeTopRearLeft: return AudioChannelSet::topRearLeft;\r
+ case vstIndividualSpeakerTypeTopRearCentre: return AudioChannelSet::topRearCentre;\r
+ case vstIndividualSpeakerTypeTopRearRight: return AudioChannelSet::topRearRight;\r
+ case vstIndividualSpeakerTypeLFE2: return AudioChannelSet::LFE2;\r
default: break;\r
}\r
\r
{\r
if (auto* ed = processor->createEditorIfNeeded())\r
{\r
- vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+ vstEffect.flags |= vstEffectFlagHasEditor;\r
editorComp.reset (new EditorCompWrapper (*this, *ed));\r
+\r
+ #if ! (JUCE_MAC || JUCE_IOS)\r
+ ed->setScaleFactor (editorScaleFactor);\r
+ #endif\r
}\r
else\r
{\r
- vstEffect.flags &= ~Vst2::effFlagsHasEditor;\r
+ vstEffect.flags &= ~vstEffectFlagHasEditor;\r
}\r
}\r
\r
\r
switch (opCode)\r
{\r
- case Vst2::effOpen: return handleOpen (args);\r
- case Vst2::effClose: return handleClose (args);\r
- case Vst2::effSetProgram: return handleSetCurrentProgram (args);\r
- case Vst2::effGetProgram: return handleGetCurrentProgram (args);\r
- case Vst2::effSetProgramName: return handleSetCurrentProgramName (args);\r
- case Vst2::effGetProgramName: return handleGetCurrentProgramName (args);\r
- case Vst2::effGetParamLabel: return handleGetParameterLabel (args);\r
- case Vst2::effGetParamDisplay: return handleGetParameterText (args);\r
- case Vst2::effGetParamName: return handleGetParameterName (args);\r
- case Vst2::effSetSampleRate: return handleSetSampleRate (args);\r
- case Vst2::effSetBlockSize: return handleSetBlockSize (args);\r
- case Vst2::effMainsChanged: return handleResumeSuspend (args);\r
- case Vst2::effEditGetRect: return handleGetEditorBounds (args);\r
- case Vst2::effEditOpen: return handleOpenEditor (args);\r
- case Vst2::effEditClose: return handleCloseEditor (args);\r
- case Vst2::effIdentify: return (pointer_sized_int) ByteOrder::bigEndianInt ("NvEf");\r
- case Vst2::effGetChunk: return handleGetData (args);\r
- case Vst2::effSetChunk: return handleSetData (args);\r
- case Vst2::effProcessEvents: return handlePreAudioProcessingEvents (args);\r
- case Vst2::effCanBeAutomated: return handleIsParameterAutomatable (args);\r
- case Vst2::effString2Parameter: return handleParameterValueForText (args);\r
- case Vst2::effGetProgramNameIndexed: return handleGetProgramName (args);\r
- case Vst2::effGetInputProperties: return handleGetInputPinProperties (args);\r
- case Vst2::effGetOutputProperties: return handleGetOutputPinProperties (args);\r
- case Vst2::effGetPlugCategory: return handleGetPlugInCategory (args);\r
- case Vst2::effSetSpeakerArrangement: return handleSetSpeakerConfiguration (args);\r
- case Vst2::effSetBypass: return handleSetBypass (args);\r
- case Vst2::effGetEffectName: return handleGetPlugInName (args);\r
- case Vst2::effGetProductString: return handleGetPlugInName (args);\r
- case Vst2::effGetVendorString: return handleGetManufacturerName (args);\r
- case Vst2::effGetVendorVersion: return handleGetManufacturerVersion (args);\r
- case Vst2::effVendorSpecific: return handleManufacturerSpecific (args);\r
- case Vst2::effCanDo: return handleCanPlugInDo (args);\r
- case Vst2::effGetTailSize: return handleGetTailSize (args);\r
- case Vst2::effKeysRequired: return handleKeyboardFocusRequired (args);\r
- case Vst2::effGetVstVersion: return handleGetVstInterfaceVersion (args);\r
- case Vst2::effGetCurrentMidiProgram: return handleGetCurrentMidiProgram (args);\r
- case Vst2::effGetSpeakerArrangement: return handleGetSpeakerConfiguration (args);\r
- case Vst2::effSetTotalSampleToProcess: return handleSetNumberOfSamplesToProcess (args);\r
- case Vst2::effSetProcessPrecision: return handleSetSampleFloatType (args);\r
- case Vst2::effGetNumMidiInputChannels: return handleGetNumMidiInputChannels();\r
- case Vst2::effGetNumMidiOutputChannels: return handleGetNumMidiOutputChannels();\r
- default: return 0;\r
- }\r
- }\r
-\r
- static pointer_sized_int dispatcherCB (Vst2::AEffect* vstInterface, int32 opCode, int32 index,\r
+ case plugInOpcodeOpen: return handleOpen (args);\r
+ case plugInOpcodeClose: return handleClose (args);\r
+ case plugInOpcodeSetCurrentProgram: return handleSetCurrentProgram (args);\r
+ case plugInOpcodeGetCurrentProgram: return handleGetCurrentProgram (args);\r
+ case plugInOpcodeSetCurrentProgramName: return handleSetCurrentProgramName (args);\r
+ case plugInOpcodeGetCurrentProgramName: return handleGetCurrentProgramName (args);\r
+ case plugInOpcodeGetParameterLabel: return handleGetParameterLabel (args);\r
+ case plugInOpcodeGetParameterText: return handleGetParameterText (args);\r
+ case plugInOpcodeGetParameterName: return handleGetParameterName (args);\r
+ case plugInOpcodeSetSampleRate: return handleSetSampleRate (args);\r
+ case plugInOpcodeSetBlockSize: return handleSetBlockSize (args);\r
+ case plugInOpcodeResumeSuspend: return handleResumeSuspend (args);\r
+ case plugInOpcodeGetEditorBounds: return handleGetEditorBounds (args);\r
+ case plugInOpcodeOpenEditor: return handleOpenEditor (args);\r
+ case plugInOpcodeCloseEditor: return handleCloseEditor (args);\r
+ case plugInOpcodeIdentify: return (pointer_sized_int) ByteOrder::bigEndianInt ("NvEf");\r
+ case plugInOpcodeGetData: return handleGetData (args);\r
+ case plugInOpcodeSetData: return handleSetData (args);\r
+ case plugInOpcodePreAudioProcessingEvents: return handlePreAudioProcessingEvents (args);\r
+ case plugInOpcodeIsParameterAutomatable: return handleIsParameterAutomatable (args);\r
+ case plugInOpcodeParameterValueForText: return handleParameterValueForText (args);\r
+ case plugInOpcodeGetProgramName: return handleGetProgramName (args);\r
+ case plugInOpcodeGetInputPinProperties: return handleGetInputPinProperties (args);\r
+ case plugInOpcodeGetOutputPinProperties: return handleGetOutputPinProperties (args);\r
+ case plugInOpcodeGetPlugInCategory: return handleGetPlugInCategory (args);\r
+ case plugInOpcodeSetSpeakerConfiguration: return handleSetSpeakerConfiguration (args);\r
+ case plugInOpcodeSetBypass: return handleSetBypass (args);\r
+ case plugInOpcodeGetPlugInName: return handleGetPlugInName (args);\r
+ case plugInOpcodeGetManufacturerProductName: return handleGetPlugInName (args);\r
+ case plugInOpcodeGetManufacturerName: return handleGetManufacturerName (args);\r
+ case plugInOpcodeGetManufacturerVersion: return handleGetManufacturerVersion (args);\r
+ case plugInOpcodeManufacturerSpecific: return handleManufacturerSpecific (args);\r
+ case plugInOpcodeCanPlugInDo: return handleCanPlugInDo (args);\r
+ case plugInOpcodeGetTailSize: return handleGetTailSize (args);\r
+ case plugInOpcodeKeyboardFocusRequired: return handleKeyboardFocusRequired (args);\r
+ case plugInOpcodeGetVstInterfaceVersion: return handleGetVstInterfaceVersion (args);\r
+ case plugInOpcodeGetCurrentMidiProgram: return handleGetCurrentMidiProgram (args);\r
+ case plugInOpcodeGetSpeakerArrangement: return handleGetSpeakerConfiguration (args);\r
+ case plugInOpcodeSetNumberOfSamplesToProcess: return handleSetNumberOfSamplesToProcess (args);\r
+ case plugInOpcodeSetSampleFloatType: return handleSetSampleFloatType (args);\r
+ case pluginOpcodeGetNumMidiInputChannels: return handleGetNumMidiInputChannels();\r
+ case pluginOpcodeGetNumMidiOutputChannels: return handleGetNumMidiOutputChannels();\r
+ default: return 0;\r
+ }\r
+ }\r
+\r
+ static pointer_sized_int dispatcherCB (VstEffectInterface* vstInterface, int32 opCode, int32 index,\r
pointer_sized_int value, void* ptr, float opt)\r
{\r
auto* wrapper = getWrapper (vstInterface);\r
VstOpCodeArguments args = { index, value, ptr, opt };\r
\r
- if (opCode == Vst2::effClose)\r
+ if (opCode == plugInOpcodeClose)\r
{\r
wrapper->dispatcher (opCode, args);\r
delete wrapper;\r
// chores when it changes or repaints.\r
struct EditorCompWrapper : public Component\r
{\r
- EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor)\r
- : wrapper (w)\r
+ EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor) : wrapper (w)\r
{\r
editor.setOpaque (true);\r
editor.setVisible (true);\r
\r
void paint (Graphics&) override {}\r
\r
- void getEditorBounds (Vst2::ERect& bounds)\r
+ void getEditorBounds (VstEditorBounds& bounds)\r
{\r
auto b = getSizeToContainChild();\r
\r
- bounds.top = 0;\r
- bounds.left = 0;\r
- bounds.bottom = (int16) b.getHeight();\r
- bounds.right = (int16) b.getWidth();\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- bounds.bottom = (int16) roundToInt (bounds.bottom * wrapper.editorScaleFactor);\r
- bounds.right = (int16) roundToInt (bounds.right * wrapper.editorScaleFactor);\r
- #endif\r
+ bounds.upper = 0;\r
+ bounds.leftmost = 0;\r
+ bounds.lower = (int16) b.getHeight();\r
+ bounds.rightmost = (int16) b.getWidth();\r
}\r
\r
void attachToHost (VstOpCodeArguments args)\r
#if JUCE_WINDOWS\r
addToDesktop (0, args.ptr);\r
hostWindow = (HWND) args.ptr;\r
-\r
- if (auto* ed = getEditorComp())\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (auto* peer = ed->getPeer())\r
- wrapper.editorScaleFactor = (float) peer->getPlatformScaleFactor();\r
- #else\r
- ed->setScaleFactor (wrapper.editorScaleFactor);\r
- #endif\r
#elif JUCE_LINUX\r
addToDesktop (0, args.ptr);\r
hostWindow = (Window) args.ptr;\r
return dynamic_cast<AudioProcessorEditor*> (getChildComponent(0));\r
}\r
\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- void checkScaleFactorIsCorrect()\r
- {\r
- if (auto* peer = getEditorComp()->getPeer())\r
- {\r
- auto peerScaleFactor = (float) peer->getPlatformScaleFactor();\r
-\r
- if (! approximatelyEqual (peerScaleFactor, wrapper.editorScaleFactor))\r
- wrapper.handleSetContentScaleFactor (peerScaleFactor);\r
- }\r
- }\r
- #endif\r
-\r
void resized() override\r
{\r
if (auto* ed = getEditorComp())\r
{\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- checkScaleFactorIsCorrect();\r
- #endif\r
-\r
ed->setTopLeftPosition (0, 0);\r
\r
if (shouldResizeEditor)\r
ed->setBounds (ed->getLocalArea (this, getLocalBounds()));\r
\r
- updateWindowSize (false);\r
+ if (! getHostType().isBitwigStudio())\r
+ updateWindowSize (false);\r
}\r
\r
#if JUCE_MAC && ! JUCE_64BIT\r
shouldResizeEditor = true;\r
#else\r
ignoreUnused (resizeEditor);\r
- XResizeWindow (display.display, (Window) getWindowHandle(),\r
- static_cast<unsigned int> (roundToInt (pos.getWidth() * wrapper.editorScaleFactor)),\r
- static_cast<unsigned int> (roundToInt (pos.getHeight() * wrapper.editorScaleFactor)));\r
+ XResizeWindow (display.display, (Window) getWindowHandle(), pos.getWidth(), pos.getHeight());\r
#endif\r
\r
#if JUCE_MAC\r
\r
if (auto host = wrapper.hostCallback)\r
{\r
- auto status = host (wrapper.getAEffect(), Vst2::audioMasterCanDo, 0, 0, const_cast<char*> ("sizeWindow"), 0);\r
+ auto status = host (wrapper.getVstEffectInterface(), hostOpcodeCanHostDo, 0, 0, const_cast<char*> ("sizeWindow"), 0);\r
\r
if (status == (pointer_sized_int) 1 || getHostType().isAbletonLive())\r
{\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- newWidth = roundToInt (newWidth * wrapper.editorScaleFactor);\r
- newHeight = roundToInt (newHeight * wrapper.editorScaleFactor);\r
- #endif\r
-\r
- const ScopedValueSetter<bool> inSizeWindowSetter (isInSizeWindow, true);\r
-\r
- sizeWasSuccessful = (host (wrapper.getAEffect(), Vst2::audioMasterSizeWindow,\r
- newWidth, newHeight, 0, 0) != 0);\r
+ isInSizeWindow = true;\r
+ sizeWasSuccessful = (host (wrapper.getVstEffectInterface(), hostOpcodeWindowSize, newWidth, newHeight, 0, 0) != 0);\r
+ isInSizeWindow = false;\r
}\r
}\r
\r
\r
//==============================================================================\r
private:\r
- static JuceVSTWrapper* getWrapper (Vst2::AEffect* v) noexcept { return static_cast<JuceVSTWrapper*> (v->object); }\r
+ VstHostCallback hostCallback;\r
+ AudioProcessor* processor = {};\r
+ double sampleRate = 44100.0;\r
+ int32 blockSize = 1024;\r
+ VstEffectInterface vstEffect;\r
+ juce::MemoryBlock chunkMemory;\r
+ juce::uint32 chunkMemoryTime = 0;\r
+ std::unique_ptr<EditorCompWrapper> editorComp;\r
+ VstEditorBounds editorBounds;\r
+ MidiBuffer midiEvents;\r
+ VSTMidiEventList outgoingEvents;\r
+ float editorScaleFactor = 1.0f;\r
+\r
+ LegacyAudioParametersWrapper juceParameters;\r
+\r
+ bool isProcessing = false, isBypassed = false, hasShutdown = false;\r
+ bool firstProcessCallback = true, shouldDeleteEditor = false;\r
+\r
+ #if JUCE_64BIT\r
+ bool useNSView = true;\r
+ #else\r
+ bool useNSView = false;\r
+ #endif\r
+\r
+ VstTempBuffers<float> floatTempBuffers;\r
+ VstTempBuffers<double> doubleTempBuffers;\r
+ int maxNumInChannels = 0, maxNumOutChannels = 0;\r
+\r
+ HeapBlock<VstSpeakerConfiguration> cachedInArrangement, cachedOutArrangement;\r
+\r
+ ThreadLocalValue<bool> inParameterChangedCallback;\r
+\r
+ static JuceVSTWrapper* getWrapper (VstEffectInterface* v) noexcept { return static_cast<JuceVSTWrapper*> (v->effectPointer); }\r
\r
bool isProcessLevelOffline()\r
{\r
return hostCallback != nullptr\r
- && (int32) hostCallback (&vstEffect, Vst2::audioMasterGetCurrentProcessLevel, 0, 0, 0, 0) == 4;\r
+ && (int32) hostCallback (&vstEffect, hostOpcodeGetCurrentAudioProcessingLevel, 0, 0, 0, 0) == 4;\r
}\r
\r
static inline int32 convertHexVersionToDecimal (const unsigned int hexVersion)\r
tmpBuffers.release();\r
\r
if (processor != nullptr)\r
- tmpBuffers.tempChannels.insertMultiple (0, nullptr, vstEffect.numInputs\r
- + vstEffect.numOutputs);\r
+ tmpBuffers.tempChannels.insertMultiple (0, nullptr, vstEffect.numInputChannels\r
+ + vstEffect.numOutputChannels);\r
}\r
\r
void deleteTempChannels()\r
{\r
// Note: most hosts call this on the UI thread, but wavelab doesn't, so be careful in here.\r
if (processor->hasEditor())\r
- vstEffect.flags |= Vst2::effFlagsHasEditor;\r
+ vstEffect.flags |= vstEffectFlagHasEditor;\r
else\r
- vstEffect.flags &= ~Vst2::effFlagsHasEditor;\r
+ vstEffect.flags &= ~vstEffectFlagHasEditor;\r
\r
return 0;\r
}\r
if (editorComp != nullptr)\r
{\r
editorComp->getEditorBounds (editorBounds);\r
- *((Vst2::ERect**) args.ptr) = &editorBounds;\r
+ *((VstEditorBounds**) args.ptr) = &editorBounds;\r
return (pointer_sized_int) &editorBounds;\r
}\r
\r
pointer_sized_int handlePreAudioProcessingEvents (VstOpCodeArguments args)\r
{\r
#if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
- VSTMidiEventList::addEventsToMidiBuffer ((Vst2::VstEvents*) args.ptr, midiEvents);\r
+ VSTMidiEventList::addEventsToMidiBuffer ((VstEventBlock*) args.ptr, midiEvents);\r
return 1;\r
#else\r
ignoreUnused (args);\r
\r
pointer_sized_int handleGetInputPinProperties (VstOpCodeArguments args)\r
{\r
- return (processor != nullptr && getPinProperties (*(Vst2::VstPinProperties*) args.ptr, true, args.index)) ? 1 : 0;\r
+ return (processor != nullptr && getPinProperties (*(VstPinInfo*) args.ptr, true, args.index)) ? 1 : 0;\r
}\r
\r
pointer_sized_int handleGetOutputPinProperties (VstOpCodeArguments args)\r
{\r
- return (processor != nullptr && getPinProperties (*(Vst2::VstPinProperties*) args.ptr, false, args.index)) ? 1 : 0;\r
+ return (processor != nullptr && getPinProperties (*(VstPinInfo*) args.ptr, false, args.index)) ? 1 : 0;\r
}\r
\r
pointer_sized_int handleGetPlugInCategory (VstOpCodeArguments)\r
{\r
- return Vst2::JucePlugin_VSTCategory;\r
+ return JucePlugin_VSTCategory;\r
}\r
\r
pointer_sized_int handleSetSpeakerConfiguration (VstOpCodeArguments args)\r
{\r
- auto* pluginInput = reinterpret_cast<Vst2::VstSpeakerArrangement*> (args.value);\r
- auto* pluginOutput = reinterpret_cast<Vst2::VstSpeakerArrangement*> (args.ptr);\r
+ auto* pluginInput = reinterpret_cast<VstSpeakerConfiguration*> (args.value);\r
+ auto* pluginOutput = reinterpret_cast<VstSpeakerConfiguration*> (args.ptr);\r
\r
if (processor->isMidiEffect())\r
return 0;\r
if (pluginInput != nullptr && pluginInput->type >= 0)\r
{\r
// inconsistent request?\r
- if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput).size() != pluginInput->numChannels)\r
+ if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput).size() != pluginInput->numberOfChannels)\r
return 0;\r
}\r
\r
if (pluginOutput != nullptr && pluginOutput->type >= 0)\r
{\r
// inconsistent request?\r
- if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput).size() != pluginOutput->numChannels)\r
+ if (SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput).size() != pluginOutput->numberOfChannels)\r
return 0;\r
}\r
\r
- if (pluginInput != nullptr && pluginInput->numChannels > 0 && numIns == 0)\r
+ if (pluginInput != nullptr && pluginInput->numberOfChannels > 0 && numIns == 0)\r
return 0;\r
\r
- if (pluginOutput != nullptr && pluginOutput->numChannels > 0 && numOuts == 0)\r
+ if (pluginOutput != nullptr && pluginOutput->numberOfChannels > 0 && numOuts == 0)\r
return 0;\r
\r
auto layouts = processor->getBusesLayout();\r
\r
- if (pluginInput != nullptr && pluginInput-> numChannels >= 0 && numIns > 0)\r
+ if (pluginInput != nullptr && pluginInput-> numberOfChannels >= 0 && numIns > 0)\r
layouts.getChannelSet (true, 0) = SpeakerMappings::vstArrangementTypeToChannelSet (*pluginInput);\r
\r
- if (pluginOutput != nullptr && pluginOutput->numChannels >= 0 && numOuts > 0)\r
+ if (pluginOutput != nullptr && pluginOutput->numberOfChannels >= 0 && numOuts > 0)\r
layouts.getChannelSet (false, 0) = SpeakerMappings::vstArrangementTypeToChannelSet (*pluginOutput);\r
\r
#ifdef JucePlugin_PreferredChannelConfigurations\r
if (handleManufacturerSpecificVST2Opcode (args.index, args.value, args.ptr, args.opt))\r
return 1;\r
\r
- if (args.index == JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S')\r
- && args.value == JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's'))\r
+ if (args.index == presonusVendorID && args.value == presonusSetContentScaleFactor)\r
return handleSetContentScaleFactor (args.opt);\r
\r
- if (args.index == Vst2::effGetParamDisplay)\r
+ if (args.index == plugInOpcodeGetParameterText)\r
return handleCockosGetParameterText (args.value, args.ptr, args.opt);\r
\r
if (auto callbackHandler = dynamic_cast<VSTCallbackHandler*> (processor))\r
auto matches = [=](const char* s) { return strcmp (text, s) == 0; };\r
\r
if (matches ("receiveVstEvents")\r
- || matches ("receiveVstMidiEvent")\r
- || matches ("receiveVstMidiEvents"))\r
+ || matches ("receiveVstMidiEvent")\r
+ || matches ("receiveVstMidiEvents"))\r
{\r
#if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
return 1;\r
}\r
\r
if (matches ("sendVstEvents")\r
- || matches ("sendVstMidiEvent")\r
- || matches ("sendVstMidiEvents"))\r
+ || matches ("sendVstMidiEvent")\r
+ || matches ("sendVstMidiEvents"))\r
{\r
#if JucePlugin_ProducesMidiOutput || JucePlugin_IsMidiEffect\r
return 1;\r
}\r
\r
if (matches ("receiveVstTimeInfo")\r
- || matches ("conformsToWindowRules")\r
- || matches ("supportsViewDpiScaling")\r
- || matches ("bypass"))\r
+ || matches ("conformsToWindowRules")\r
+ || matches ("supportsViewDpiScaling")\r
+ || matches ("bypass"))\r
{\r
return 1;\r
}\r
pointer_sized_int handleGetTailSize (VstOpCodeArguments)\r
{\r
if (processor != nullptr)\r
- {\r
- int32 result;\r
-\r
- auto tailSeconds = processor->getTailLengthSeconds();\r
-\r
- if (tailSeconds == std::numeric_limits<double>::infinity())\r
- result = std::numeric_limits<int32>::max();\r
- else\r
- result = static_cast<int32> (tailSeconds * sampleRate);\r
-\r
- return result; // Vst2 expects an int32 upcasted to a intptr_t here\r
- }\r
+ return (pointer_sized_int) (processor->getTailLengthSeconds() * sampleRate);\r
\r
return 0;\r
}\r
\r
pointer_sized_int handleGetVstInterfaceVersion (VstOpCodeArguments)\r
{\r
- return kVstVersion;\r
+ return juceVstInterfaceVersion;\r
}\r
\r
pointer_sized_int handleGetCurrentMidiProgram (VstOpCodeArguments)\r
\r
pointer_sized_int handleGetSpeakerConfiguration (VstOpCodeArguments args)\r
{\r
- auto** pluginInput = reinterpret_cast<Vst2::VstSpeakerArrangement**> (args.value);\r
- auto** pluginOutput = reinterpret_cast<Vst2::VstSpeakerArrangement**> (args.ptr);\r
+ auto** pluginInput = reinterpret_cast<VstSpeakerConfiguration**> (args.value);\r
+ auto** pluginOutput = reinterpret_cast<VstSpeakerConfiguration**> (args.ptr);\r
\r
if (pluginHasSidechainsOrAuxs() || processor->isMidiEffect())\r
return false;\r
auto inputLayout = processor->getChannelLayoutOfBus (true, 0);\r
auto outputLayout = processor->getChannelLayoutOfBus (false, 0);\r
\r
- auto speakerBaseSize = sizeof (Vst2::VstSpeakerArrangement) - (sizeof (Vst2::VstSpeakerProperties) * 8);\r
+ auto speakerBaseSize = sizeof (VstSpeakerConfiguration) - (sizeof (VstIndividualSpeakerInfo) * 8);\r
\r
- cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
- cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
+ cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (VstSpeakerConfiguration)), 1);\r
+ cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (VstSpeakerConfiguration)), 1);\r
\r
*pluginInput = cachedInArrangement. getData();\r
*pluginOutput = cachedOutArrangement.getData();\r
{\r
if (processor != nullptr)\r
{\r
- processor->setProcessingPrecision ((args.value == Vst2::kVstProcessPrecision64\r
+ processor->setProcessingPrecision ((args.value == vstProcessingSampleTypeDouble\r
&& processor->supportsDoublePrecisionProcessing())\r
? AudioProcessor::doublePrecision\r
: AudioProcessor::singlePrecision);\r
\r
pointer_sized_int handleSetContentScaleFactor (float scale)\r
{\r
- #if ! JUCE_MAC\r
- if (! approximatelyEqual (scale, editorScaleFactor))\r
+ if (editorScaleFactor != scale)\r
{\r
editorScaleFactor = scale;\r
\r
+ #if ! (JUCE_MAC || JUCE_IOS)\r
if (editorComp != nullptr)\r
- #if JUCE_WINDOWS && ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
+ {\r
if (auto* ed = editorComp->getEditorComp())\r
- ed->setScaleFactor (scale);\r
- #else\r
- editorComp->updateWindowSize (true);\r
- #endif\r
+ ed->setScaleFactor (editorScaleFactor);\r
+\r
+ if (editorComp != nullptr)\r
+ editorComp->updateWindowSize (true);\r
+ }\r
+ #endif\r
}\r
- #else\r
- ignoreUnused (scale);\r
- #endif\r
\r
return 1;\r
}\r
#endif\r
}\r
\r
- //==============================================================================\r
- Vst2::audioMasterCallback hostCallback;\r
- AudioProcessor* processor = {};\r
- double sampleRate = 44100.0;\r
- int32 blockSize = 1024;\r
- Vst2::AEffect vstEffect;\r
- juce::MemoryBlock chunkMemory;\r
- juce::uint32 chunkMemoryTime = 0;\r
- std::unique_ptr<EditorCompWrapper> editorComp;\r
- Vst2::ERect editorBounds;\r
- MidiBuffer midiEvents;\r
- VSTMidiEventList outgoingEvents;\r
-\r
- #if ! JUCE_MAC\r
- float editorScaleFactor = 1.0f;\r
- #endif\r
-\r
- LegacyAudioParametersWrapper juceParameters;\r
-\r
- bool isProcessing = false, isBypassed = false, hasShutdown = false;\r
- bool firstProcessCallback = true, shouldDeleteEditor = false;\r
-\r
- #if JUCE_64BIT\r
- bool useNSView = true;\r
- #else\r
- bool useNSView = false;\r
- #endif\r
-\r
- VstTempBuffers<float> floatTempBuffers;\r
- VstTempBuffers<double> doubleTempBuffers;\r
- int maxNumInChannels = 0, maxNumOutChannels = 0;\r
-\r
- HeapBlock<Vst2::VstSpeakerArrangement> cachedInArrangement, cachedOutArrangement;\r
-\r
- ThreadLocalValue<bool> inParameterChangedCallback;\r
-\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVSTWrapper)\r
};\r
//==============================================================================\r
namespace\r
{\r
- Vst2::AEffect* pluginEntryPoint (Vst2::audioMasterCallback audioMaster)\r
+ VstEffectInterface* pluginEntryPoint (VstHostCallback audioMaster)\r
{\r
JUCE_AUTORELEASEPOOL\r
{\r
\r
try\r
{\r
- if (audioMaster (0, Vst2::audioMasterVersion, 0, 0, 0, 0) != 0)\r
+ if (audioMaster (0, hostOpcodeVstVersion, 0, 0, 0, 0) != 0)\r
{\r
#if JUCE_LINUX\r
MessageManagerLock mmLock;\r
\r
auto* processor = createPluginFilterOfType (AudioProcessor::wrapperType_VST);\r
auto* wrapper = new JuceVSTWrapper (audioMaster, processor);\r
- auto* aEffect = wrapper->getAEffect();\r
-\r
- if (auto* callbackHandler = dynamic_cast<VSTCallbackHandler*> (processor))\r
- {\r
- callbackHandler->handleVstHostCallbackAvailable ([audioMaster, aEffect](int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
- {\r
- return audioMaster (aEffect, opcode, index, value, ptr, opt);\r
- });\r
- }\r
-\r
- return aEffect;\r
+ return wrapper->getVstEffectInterface();\r
}\r
}\r
catch (...)\r
// Mac startup code..\r
#if JUCE_MAC\r
\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster);\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
return pluginEntryPoint (audioMaster);\r
}\r
\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster);\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster)\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* main_macho (VstHostCallback audioMaster);\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* main_macho (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
// Linux startup code..\r
#elif JUCE_LINUX\r
\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster);\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
return pluginEntryPoint (audioMaster);\r
}\r
\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster) asm ("main");\r
- JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster)\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* main_plugin (VstHostCallback audioMaster) asm ("main");\r
+ JUCE_EXPORTED_FUNCTION VstEffectInterface* main_plugin (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
// Win32 startup code..\r
#else\r
\r
- extern "C" __declspec (dllexport) Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
+ extern "C" __declspec (dllexport) VstEffectInterface* VSTPluginMain (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
}\r
\r
#ifndef JUCE_64BIT // (can't compile this on win64, but it's not needed anyway with VST2.4)\r
- extern "C" __declspec (dllexport) int main (Vst2::audioMasterCallback audioMaster)\r
+ extern "C" __declspec (dllexport) int main (VstHostCallback audioMaster)\r
{\r
PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
\r
#endif\r
\r
#if JUCE_VST3_CAN_REPLACE_VST2\r
-namespace Vst2\r
-{\r
-#include "pluginterfaces/vst2.x/vstfxstore.h"\r
-}\r
+#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
#endif\r
\r
#ifndef JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS\r
\r
extern JUCE_API void* attachComponentToWindowRefVST (Component*, void* parentWindowOrView, bool isNSView);\r
extern JUCE_API void detachComponentFromWindowRefVST (Component*, void* nsWindow, bool isNSView);\r
+ extern JUCE_API void setNativeHostWindowSizeVST (void* window, Component*, int newWidth, int newHeight, bool isNSView);\r
#endif\r
\r
//==============================================================================\r
return getParamForVSTParamID (bypassParamID);\r
}\r
\r
- static Vst::UnitID getUnitID (const AudioProcessorParameterGroup* group)\r
- {\r
- return group == nullptr ? Vst::kRootUnitId : group->getID().hashCode();\r
- }\r
-\r
int getNumParameters() const noexcept { return vstParamIDs.size(); }\r
bool isUsingManagedParameters() const noexcept { return juceParameters.isUsingManagedParameters(); }\r
\r
struct Param : public Vst::Parameter\r
{\r
Param (JuceVST3EditController& editController, AudioProcessorParameter& p,\r
- Vst::ParamID vstParamID, Vst::UnitID vstUnitID,\r
- bool isBypassParameter, bool forceLegacyParamIDs)\r
+ Vst::ParamID vstParamID, bool isBypassParameter, bool forceLegacyParamIDs)\r
: owner (editController), param (p)\r
{\r
info.id = vstParamID;\r
- info.unitId = vstUnitID;\r
\r
toString128 (info.title, param.getName (128));\r
toString128 (info.shortTitle, param.getName (8));\r
\r
info.defaultNormalizedValue = param.getDefaultValue();\r
jassert (info.defaultNormalizedValue >= 0 && info.defaultNormalizedValue <= 1.0f);\r
+ info.unitId = Vst::kRootUnitId;\r
\r
// Is this a meter?\r
if (((param.getCategory() & 0xffff0000) >> 16) == 2)\r
\r
//==============================================================================\r
Atomic<int> vst3IsPlaying { 0 };\r
- float lastScaleFactorReceived = 1.0f;\r
\r
void setupParameters()\r
{\r
{\r
auto vstParamID = audioProcessor->getVSTParamIDForIndex (i);\r
auto* juceParam = audioProcessor->getParamForVSTParamID (vstParamID);\r
- auto* parameterGroup = pluginInstance->parameterTree.getGroupsForParameter (juceParam).getLast();\r
- auto unitID = JuceAudioProcessor::getUnitID (parameterGroup);\r
\r
- parameters.addParameter (new Param (*this, *juceParam, vstParamID, unitID,\r
+ parameters.addParameter (new Param (*this, *juceParam, vstParamID,\r
(vstParamID == audioProcessor->bypassParamID), forceLegacyParamIDs));\r
}\r
\r
: Vst::EditorView (&ec, nullptr),\r
owner (&ec), pluginInstance (p)\r
{\r
- editorScaleFactor = ec.lastScaleFactorReceived;\r
-\r
component.reset (new ContentWrapperComponent (*this, p));\r
}\r
\r
macHostWindow = juce::attachComponentToWindowRefVST (component.get(), parent, isNSView);\r
#endif\r
\r
- #if ! JUCE_MAC\r
- setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) editorScaleFactor);\r
- #endif\r
-\r
component->resizeHostWindow();\r
systemWindow = parent;\r
attachedToParent();\r
\r
if (component != nullptr)\r
{\r
- auto w = rect.getWidth();\r
- auto h = rect.getHeight();\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- w = roundToInt (w / editorScaleFactor);\r
- h = roundToInt (h / editorScaleFactor);\r
- #endif\r
-\r
- component->setSize (w, h);\r
+ component->setSize (rect.getWidth(), rect.getHeight());\r
\r
if (auto* peer = component->getPeer())\r
peer->updateBounds();\r
{\r
if (size != nullptr && component != nullptr)\r
{\r
- auto w = component->getWidth();\r
- auto h = component->getHeight();\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- w = roundToInt (w * editorScaleFactor);\r
- h = roundToInt (h * editorScaleFactor);\r
- #endif\r
-\r
- *size = ViewRect (0, 0, w, h);\r
-\r
+ *size = ViewRect (0, 0, component->getWidth(), component->getHeight());\r
return kResultTrue;\r
}\r
\r
{\r
if (auto* editor = component->pluginEditor.get())\r
{\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- auto juceRect = editor->getLocalArea (component.get(),\r
- Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top,\r
- rectToCheck->right, rectToCheck->bottom) / editorScaleFactor);\r
- #else\r
- auto juceRect = editor->getLocalArea (component.get(),\r
- { rectToCheck->left, rectToCheck->top, rectToCheck->right, rectToCheck->bottom });\r
- #endif\r
-\r
+ // checkSizeConstraint\r
+ auto juceRect = editor->getLocalArea (component.get(), Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top,\r
+ rectToCheck->right, rectToCheck->bottom));\r
if (auto* constrainer = editor->getConstrainer())\r
{\r
Rectangle<int> limits (0, 0, constrainer->getMaximumWidth(), constrainer->getMaximumHeight());\r
-\r
- auto currentRect = editor->getBounds();\r
-\r
- constrainer->checkBounds (juceRect, currentRect, limits,\r
- juceRect.getY() != currentRect.getY() && juceRect.getBottom() == currentRect.getBottom(),\r
- juceRect.getX() != currentRect.getX() && juceRect.getRight() == currentRect.getRight(),\r
- juceRect.getY() == currentRect.getY() && juceRect.getBottom() != currentRect.getBottom(),\r
- juceRect.getX() == currentRect.getX() && juceRect.getRight() != currentRect.getRight());\r
+ constrainer->checkBounds (juceRect, editor->getBounds(), limits, false, false, false, false);\r
\r
juceRect = component->getLocalArea (editor, juceRect);\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- rectToCheck->right = rectToCheck->left + roundToInt (juceRect.getWidth() * editorScaleFactor);\r
- rectToCheck->bottom = rectToCheck->top + roundToInt (juceRect.getHeight() * editorScaleFactor);\r
- #else\r
- rectToCheck->right = rectToCheck->left + juceRect.getWidth();\r
- rectToCheck->bottom = rectToCheck->top + juceRect.getHeight();\r
- #endif\r
+ rectToCheck->right = rectToCheck->left + juceRect.getWidth();\r
+ rectToCheck->bottom = rectToCheck->top + juceRect.getHeight();\r
}\r
}\r
\r
\r
tresult PLUGIN_API setContentScaleFactor (Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override\r
{\r
- #if ! JUCE_MAC\r
- if (! approximatelyEqual ((float) factor, editorScaleFactor))\r
+ #if (JUCE_MAC || JUCE_IOS)\r
+ ignoreUnused (factor);\r
+ #else\r
+ if (auto* editor = component->pluginEditor.get())\r
{\r
- editorScaleFactor = (float) factor;\r
-\r
- if (auto* o = owner.get())\r
- o->lastScaleFactorReceived = editorScaleFactor;\r
-\r
- if (component == nullptr)\r
- return kResultFalse;\r
-\r
- #if JUCE_WINDOWS && ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (auto* ed = component->pluginEditor.get())\r
- ed->setScaleFactor ((float) factor);\r
- #endif\r
-\r
- component->resizeHostWindow();\r
-\r
- if (getHostType().isBitwigStudio())\r
- {\r
- component->setTopLeftPosition (0, 0);\r
- component->repaint();\r
- }\r
+ editor->setScaleFactor (factor);\r
+ return kResultTrue;\r
}\r
+ #endif\r
\r
- return kResultTrue;\r
- #else\r
- ignoreUnused (factor);\r
return kResultFalse;\r
- #endif\r
}\r
\r
private:\r
struct ContentWrapperComponent : public Component\r
{\r
ContentWrapperComponent (JuceVST3Editor& editor, AudioProcessor& plugin)\r
- : pluginEditor (plugin.createEditorIfNeeded()),\r
- owner (editor)\r
+ : pluginEditor (plugin.createEditorIfNeeded()),\r
+ owner (editor)\r
{\r
setOpaque (true);\r
setBroughtToFrontOnMouseClick (true);\r
}\r
}\r
\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- void checkScaleFactorIsCorrect()\r
- {\r
- if (auto* peer = pluginEditor->getPeer())\r
- {\r
- auto peerScaleFactor = (float) peer->getPlatformScaleFactor();\r
-\r
- if (! approximatelyEqual (peerScaleFactor, owner.editorScaleFactor))\r
- owner.setContentScaleFactor (peerScaleFactor);\r
- }\r
- }\r
- #endif\r
-\r
void resized() override\r
{\r
if (pluginEditor != nullptr)\r
{\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- checkScaleFactorIsCorrect();\r
- #endif\r
-\r
if (! isResizingParentToFitChild)\r
{\r
lastBounds = getLocalBounds();\r
\r
#if JUCE_WINDOWS\r
setSize (w, h);\r
+ #else\r
+ if (owner.macHostWindow != nullptr && ! (host.isWavelab() || host.isReaper() || host.isBitwigStudio()))\r
+ juce::setNativeHostWindowSizeVST (owner.macHostWindow, this, w, h, owner.isNSView);\r
#endif\r
\r
if (owner.plugFrame != nullptr)\r
{\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- w = roundToInt (w * owner.editorScaleFactor);\r
- h = roundToInt (h * owner.editorScaleFactor);\r
- #endif\r
-\r
ViewRect newSize (0, 0, w, h);\r
-\r
- {\r
- const ScopedValueSetter<bool> resizingParentSetter (isResizingParentToFitChild, true);\r
- owner.plugFrame->resizeView (&owner, &newSize);\r
- }\r
+ isResizingParentToFitChild = true;\r
+ owner.plugFrame->resizeView (&owner, &newSize);\r
+ isResizingParentToFitChild = false;\r
\r
#if JUCE_MAC\r
if (host.isWavelab() || host.isReaper())\r
bool isNSView = false;\r
#endif\r
\r
- float editorScaleFactor = 1.0f;\r
-\r
#if JUCE_WINDOWS\r
WindowsHooks hooks;\r
#endif\r
// and not AudioChannelSet::discreteChannels (2) etc.\r
jassert (checkBusFormatsAreNotDiscrete());\r
\r
- parameterGroups = pluginInstance->parameterTree.getSubgroups (true);\r
-\r
comPluginInstance = new JuceAudioProcessor (pluginInstance);\r
\r
zerostruct (processContext);\r
\r
bool loadVST2CcnKBlock (const char* data, int size)\r
{\r
- auto bank = (const Vst2::fxBank*) data;\r
+ auto bank = (const vst2FxBank*) data;\r
\r
- jassert ('CcnK' == htonl (bank->chunkMagic));\r
- jassert ('FBCh' == htonl (bank->fxMagic));\r
- jassert (htonl (bank->version) == 1 || htonl (bank->version) == 2);\r
+ jassert ('CcnK' == htonl (bank->magic1));\r
+ jassert ('FBCh' == htonl (bank->magic2));\r
+ jassert (htonl (bank->version1) == 1 || htonl (bank->version1) == 2);\r
jassert (JucePlugin_VSTUniqueID == htonl (bank->fxID));\r
\r
- setStateInformation (bank->content.data.chunk,\r
- jmin ((int) (size - (bank->content.data.chunk - data)),\r
- (int) htonl (bank->content.data.size)));\r
+ setStateInformation (bank->chunk,\r
+ jmin ((int) (size - (bank->chunk - data)),\r
+ (int) htonl (bank->chunkSize)));\r
return true;\r
}\r
\r
return status;\r
\r
const int bankBlockSize = 160;\r
- Vst2::fxBank bank;\r
+ vst2FxBank bank;\r
\r
zerostruct (bank);\r
- bank.chunkMagic = (int32) htonl ('CcnK');\r
- bank.byteSize = (int32) htonl (bankBlockSize - 8 + (unsigned int) mem.getSize());\r
- bank.fxMagic = (int32) htonl ('FBCh');\r
- bank.version = (int32) htonl (2);\r
- bank.fxID = (int32) htonl (JucePlugin_VSTUniqueID);\r
- bank.fxVersion = (int32) htonl (JucePlugin_VersionCode);\r
- bank.content.data.size = (int32) htonl ((unsigned int) mem.getSize());\r
+ bank.magic1 = (int32) htonl ('CcnK');\r
+ bank.size = (int32) htonl (bankBlockSize - 8 + (unsigned int) mem.getSize());\r
+ bank.magic2 = (int32) htonl ('FBCh');\r
+ bank.version1 = (int32) htonl (2);\r
+ bank.fxID = (int32) htonl (JucePlugin_VSTUniqueID);\r
+ bank.version2 = (int32) htonl (JucePlugin_VersionCode);\r
+ bank.chunkSize = (int32) htonl ((unsigned int) mem.getSize());\r
\r
status = state->write (&bank, bankBlockSize);\r
\r
//==============================================================================\r
Steinberg::int32 PLUGIN_API getUnitCount() override\r
{\r
- return parameterGroups.size() + 1;\r
+ return 1;\r
}\r
\r
tresult PLUGIN_API getUnitInfo (Steinberg::int32 unitIndex, Vst::UnitInfo& info) override\r
return kResultTrue;\r
}\r
\r
- if (auto* group = parameterGroups[unitIndex - 1])\r
- {\r
- info.id = JuceAudioProcessor::getUnitID (group);\r
- info.parentUnitId = JuceAudioProcessor::getUnitID (group->getParent());\r
- info.programListId = Vst::kNoProgramListId;\r
-\r
- toString128 (info.name, group->getName());\r
-\r
- return kResultTrue;\r
- }\r
-\r
+ zerostruct (info);\r
return kResultFalse;\r
}\r
\r
if (tailLengthSeconds <= 0.0 || processSetup.sampleRate <= 0.0)\r
return Vst::kNoTail;\r
\r
- if (tailLengthSeconds == std::numeric_limits<double>::infinity())\r
- return Vst::kInfiniteTail;\r
-\r
return (Steinberg::uint32) roundToIntAccurate (tailLengthSeconds * processSetup.sampleRate);\r
}\r
\r
}\r
\r
private:\r
+ //==============================================================================\r
+ Atomic<int> refCount { 1 };\r
+\r
+ AudioProcessor* pluginInstance;\r
+ ComSmartPtr<Vst::IHostApplication> host;\r
+ ComSmartPtr<JuceAudioProcessor> comPluginInstance;\r
+ ComSmartPtr<JuceVST3EditController> juceVST3EditController;\r
+\r
+ /**\r
+ Since VST3 does not provide a way of knowing the buffer size and sample rate at any point,\r
+ this object needs to be copied on every call to process() to be up-to-date...\r
+ */\r
+ Vst::ProcessContext processContext;\r
+ Vst::ProcessSetup processSetup;\r
+\r
+ MidiBuffer midiBuffer;\r
+ Array<float*> channelListFloat;\r
+ Array<double*> channelListDouble;\r
+\r
+ AudioBuffer<float> emptyBufferFloat;\r
+ AudioBuffer<double> emptyBufferDouble;\r
+\r
+ #if JucePlugin_WantsMidiInput\r
+ bool isMidiInputBusEnabled = true;\r
+ #else\r
+ bool isMidiInputBusEnabled = false;\r
+ #endif\r
+\r
+ #if JucePlugin_ProducesMidiOutput\r
+ bool isMidiOutputBusEnabled = true;\r
+ #else\r
+ bool isMidiOutputBusEnabled = false;\r
+ #endif\r
+\r
+ ScopedJuceInitialiser_GUI libraryInitialiser;\r
+ static const char* kJucePrivateDataIdentifier;\r
+\r
//==============================================================================\r
template <typename FloatType>\r
void processAudio (Vst::ProcessData& data, Array<FloatType*>& channelList)\r
\r
p.setRateAndBufferSizeDetails (sampleRate, bufferSize);\r
p.prepareToPlay (sampleRate, bufferSize);\r
-\r
- midiBuffer.ensureSize (2048);\r
- midiBuffer.clear();\r
}\r
\r
//==============================================================================\r
- Atomic<int> refCount { 1 };\r
-\r
- AudioProcessor* pluginInstance;\r
- ComSmartPtr<Vst::IHostApplication> host;\r
- ComSmartPtr<JuceAudioProcessor> comPluginInstance;\r
- ComSmartPtr<JuceVST3EditController> juceVST3EditController;\r
-\r
- /**\r
- Since VST3 does not provide a way of knowing the buffer size and sample rate at any point,\r
- this object needs to be copied on every call to process() to be up-to-date...\r
- */\r
- Vst::ProcessContext processContext;\r
-\r
- Vst::ProcessSetup processSetup;\r
-\r
- MidiBuffer midiBuffer;\r
- Array<float*> channelListFloat;\r
- Array<double*> channelListDouble;\r
-\r
- AudioBuffer<float> emptyBufferFloat;\r
- AudioBuffer<double> emptyBufferDouble;\r
-\r
- #if JucePlugin_WantsMidiInput\r
- bool isMidiInputBusEnabled = true;\r
- #else\r
- bool isMidiInputBusEnabled = false;\r
- #endif\r
-\r
- #if JucePlugin_ProducesMidiOutput\r
- bool isMidiOutputBusEnabled = true;\r
- #else\r
- bool isMidiOutputBusEnabled = false;\r
- #endif\r
-\r
- ScopedJuceInitialiser_GUI libraryInitialiser;\r
- static const char* kJucePrivateDataIdentifier;\r
-\r
- Array<const AudioProcessorParameterGroup*> parameterGroups;\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component)\r
};\r
\r
\r
//==============================================================================\r
/** This typedef represents VST3's createInstance() function signature */\r
-using CreateFunction = FUnknown* (*)(Vst::IHostApplication*);\r
+typedef FUnknown* (*CreateFunction) (Vst::IHostApplication*);\r
\r
static FUnknown* createComponentInstance (Vst::IHostApplication* host)\r
{\r
\r
ID: juce_audio_plugin_client\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE audio plugin wrapper classes\r
description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.\r
website: http://www.juce.com/juce\r
#include <juce_audio_basics/juce_audio_basics.h>\r
#include <juce_audio_processors/juce_audio_processors.h>\r
\r
-/** Config: JUCE_VST3_CAN_REPLACE_VST2\r
-\r
- Enable this if you want your VST3 plug-in to load and save VST2 compatible\r
- state. This allows hosts to replace VST2 plug-ins with VST3 plug-ins. If\r
- you change this option then your VST3 plug-in will be incompatible with\r
- previous versions.\r
-*/\r
-#ifndef JUCE_VST3_CAN_REPLACE_VST2\r
- #define JUCE_VST3_CAN_REPLACE_VST2 1\r
-#endif\r
-\r
/** Config: JUCE_FORCE_USE_LEGACY_PARAM_IDS\r
\r
Enable this if you want to force JUCE to use a continuous parameter\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#include "Unity/juce_Unity_Wrapper.cpp"\r
#if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \\r
|| JucePlugin_Build_AU || JucePlugin_Build_AUv3 \\r
||JucePlugin_Build_RTAS || JucePlugin_Build_AAX \\r
- || JucePlugin_Build_Standalone || JucePlugin_Build_LV2 \\r
- || JucePlugin_Build_Unity)\r
+ || JucePlugin_Build_Standalone || JucePlugin_Build_LV2)\r
#error "You need to enable at least one plugin format!"\r
#endif\r
\r
#undef JucePlugin_Build_AAX\r
#define JucePlugin_Build_AAX 0\r
#endif\r
+\r
+//==============================================================================\r
+#if JucePlugin_Build_VST\r
+\r
+ #if JucePlugin_VersionCode < 0x010000 // Major < 0\r
+\r
+ #if (JucePlugin_VersionCode & 0x00FF00) > (9 * 0x100) // check if Minor number exceeeds 9\r
+ #warning When version has "major" = 0, VST2 has trouble displaying "minor" exceeding 9\r
+ #endif\r
+\r
+ #if (JucePlugin_VersionCode & 0xFF) > 9 // check if Bugfix number exceeeds 9\r
+ #warning When version has "major" = 0, VST2 has trouble displaying "bugfix" exceeding 9\r
+ #endif\r
+\r
+ #elif JucePlugin_VersionCode >= 0x650000 // Major >= 101\r
+\r
+ #if (JucePlugin_VersionCode & 0x00FF00) > (99 * 0x100) // check if Minor number exceeeds 99\r
+ #warning When version has "major" > 100, VST2 has trouble displaying "minor" exceeding 99\r
+ #endif\r
+\r
+ #if (JucePlugin_VersionCode & 0xFF) > 99 // check if Bugfix number exceeeds 99\r
+ #warning When version has "major" > 100, VST2 has trouble displaying "bugfix" exceeding 99\r
+ #endif\r
+\r
+ #endif // JucePlugin_VersionCode\r
+\r
+#endif // JucePlugin_Build_VST\r
DigitalPerformer, /**< Represents Digital Performer. */\r
FinalCut, /**< Represents Apple Final Cut Pro. */\r
FruityLoops, /**< Represents Fruity Loops. */\r
- JUCEPluginHost, /**< Represents the JUCE AudioPluginHost */\r
MagixSamplitude, /**< Represents Magix Samplitude. */\r
- MagixSequoia, /**< Represents Magix Sequoia. */\r
MergingPyramix, /**< Represents Merging Pyramix. */\r
MuseReceptorGeneric, /**< Represents Muse Receptor. */\r
Reaper, /**< Represents Cockos Reaper. */\r
bool isFruityLoops() const noexcept { return type == FruityLoops; }\r
/** Returns true if the host is Apple GarageBand. */\r
bool isGarageBand() const noexcept { return type == AppleGarageBand; }\r
- /** Returns true if the host is the JUCE AudioPluginHost */\r
- bool isJUCEPluginHost() const noexcept { return type == JUCEPluginHost; }\r
/** Returns true if the host is Apple Logic Pro. */\r
bool isLogic() const noexcept { return type == AppleLogic; }\r
/** Returns true if the host is Apple MainStage. */\r
bool isSADiE() const noexcept { return type == SADiE; }\r
/** Returns true if the host is Magix Samplitude. */\r
bool isSamplitude() const noexcept { return type == MagixSamplitude; }\r
- /** Returns true if the host is Magix Sequoia. */\r
- bool isSequoia() const noexcept { return type == MagixSequoia; }\r
/** Returns true if the host is any version of Cakewalk Sonar. */\r
bool isSonar() const noexcept { return type == CakewalkSonar8 || type == CakewalkSonarGeneric; }\r
/** Returns true if the host is Steinberg's VST3 Test Host. */\r
case DigitalPerformer: return "DigitalPerformer";\r
case FinalCut: return "Final Cut";\r
case FruityLoops: return "FruityLoops";\r
- case JUCEPluginHost: return "JUCE AudioPluginHost";\r
case MagixSamplitude: return "Magix Samplitude";\r
- case MagixSequoia: return "Magix Sequoia";\r
case MergingPyramix: return "Pyramix";\r
case MuseReceptorGeneric: return "Muse Receptor";\r
case Reaper: return "Reaper";\r
if (hostFilename.containsIgnoreCase ("Renoise")) return Renoise;\r
if (hostFilename.containsIgnoreCase ("Resolve")) return DaVinciResolve;\r
if (hostFilename.startsWith ("Bitwig")) return BitwigStudio;\r
- if (hostFilename.containsIgnoreCase ("OsxFL")) return FruityLoops;\r
- if (hostFilename.containsIgnoreCase ("AudioPluginHost")) return JUCEPluginHost;\r
\r
#elif JUCE_WINDOWS\r
if (hostFilename.containsIgnoreCase ("Live 6.")) return AbletonLive6;\r
if (hostFilename.containsIgnoreCase ("VST_Scanner")) return VBVSTScanner;\r
if (hostPath.containsIgnoreCase ("Merging Technologies")) return MergingPyramix;\r
if (hostFilename.startsWithIgnoreCase ("Sam")) return MagixSamplitude;\r
- if (hostFilename.startsWithIgnoreCase ("Sequoia")) return MagixSequoia;\r
if (hostFilename.containsIgnoreCase ("Renoise")) return Renoise;\r
if (hostFilename.containsIgnoreCase ("Resolve")) return DaVinciResolve;\r
if (hostPath.containsIgnoreCase ("Bitwig Studio")) return BitwigStudio;\r
if (hostFilename.containsIgnoreCase ("Sadie")) return SADiE;\r
- if (hostFilename.containsIgnoreCase ("AudioPluginHost")) return JUCEPluginHost;\r
\r
#elif JUCE_LINUX\r
if (hostFilename.containsIgnoreCase ("Ardour")) return Ardour;\r
if (hostFilename.startsWithIgnoreCase ("Waveform")) return TracktionWaveform;\r
if (hostFilename.containsIgnoreCase ("Tracktion")) return TracktionGeneric;\r
if (hostFilename.startsWith ("Bitwig")) return BitwigStudio;\r
- if (hostFilename.containsIgnoreCase ("AudioPluginHost")) return JUCEPluginHost;\r
\r
#elif JUCE_IOS\r
#elif JUCE_ANDROID\r
\r
AudioProcessor::WrapperType PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Undefined;\r
\r
-#if JucePlugin_Build_Unity\r
- bool juce_isRunningInUnity() { return PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Unity; }\r
-#endif\r
-\r
#ifndef JUCE_VST3_CAN_REPLACE_VST2\r
#define JUCE_VST3_CAN_REPLACE_VST2 1\r
#endif\r
: instance (inInstance), error (inError), compCallback (inCompletion), owner (invoker)\r
{}\r
\r
- void messageCallback() override { compCallback->completionCallback (instance.release(), error); }\r
+ void messageCallback() override { compCallback->completionCallback (instance, error); }\r
\r
//==============================================================================\r
- std::unique_ptr<AudioPluginInstance> instance;\r
+ AudioPluginInstance* instance;\r
String error;\r
std::unique_ptr<AudioPluginFormat::InstantiationCompletionCallback> compCallback;\r
std::unique_ptr<CallbackInvoker> owner;\r
AudioPluginFormat::InstantiationCompletionCallback* callback)\r
{\r
jassert (callback != nullptr);\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
//==============================================================================\r
\r
\r
AudioPluginFormat() noexcept;\r
\r
- using PluginCreationCallback = void (*) (void*, AudioPluginInstance*, const String&);\r
-\r
/** Implementors must override this function. This is guaranteed to be called on\r
the message thread. You may call the callback on any thread.\r
*/\r
virtual void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
int initialBufferSize, void* userData,\r
- PluginCreationCallback) = 0;\r
+ void (*callback) (void*, AudioPluginInstance*, const String&)) = 0;\r
\r
virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept = 0;\r
\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-This license applies only to files referencing this license,\r
-for other files of the Software Development Kit the respective embedded license text\r
-is applicable. The license can be found at: www.steinberg.net/sdklicenses_vst3\r
-\r
-This Software Development Kit is licensed under the terms of the Steinberg VST3 License,\r
-or alternatively under the terms of the General Public License (GPL) Version 3.\r
-You may use the Software Development Kit according to either of these licenses as it is\r
-most appropriate for your project on a case-by-case basis (commercial or not).\r
-\r
-a) Proprietary Steinberg VST3 License\r
-The Software Development Kit may not be distributed in parts or its entirety\r
-without prior written agreement by Steinberg Media Technologies GmbH.\r
-The SDK must not be used to re-engineer or manipulate any technology used\r
-in any Steinberg or Third-party application or software module,\r
-unless permitted by law.\r
-Neither the name of the Steinberg Media Technologies GmbH nor the names of its\r
-contributors may be used to endorse or promote products derived from this\r
-software without specific prior written permission.\r
-Before publishing a software under the proprietary license, you need to obtain a copy\r
-of the License Agreement signed by Steinberg Media Technologies GmbH.\r
-The Steinberg VST SDK License Agreement can be found at:\r
-www.steinberg.net/en/company/developers.html\r
-\r
-THE SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-IN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLE FOR ANY DIRECT,\r
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-b) General Public License (GPL) Version 3\r
-Details of these licenses can be found at: www.gnu.org/licenses/gpl-3.0.html\r
-//----------------------------------------------------------------------------------\r
+++ /dev/null
-# Welcome to VST SDK 3.6.9\r
-\r
-## Table Of Contents\r
-1. [The VST SDK package](#100)\r
-1. [System requirements](#200)\r
-1. [About VST Plug-ins in general](#300)\r
-1. [About VST 3](#400)\r
-1. [How to build VST 3](#How_to_build_VST_3)\r
-1. [License & Usage guidelines](#license_&_usage_guidelines)\r
-\r
-<div id='100'/>\r
-\r
-## The VST SDK package contains:\r
-- The VST 3 API\r
-- VST 3 Implementation Helper Classes\r
-- AAX, AU and VST 2 wrappers\r
-- VST 3 Plug-ins Examples\r
-\r
-The full VST 3 SDK is available [here!](https://www.steinberg.net/en/company/developers.html). It contains a VST 3 Plug-in Test Host Application/Validator.\r
-\r
-<div id='200'/>\r
-\r
-## System requirements\r
-\r
-Supported OS:\r
-\r
-- Microsoft Windows 7-10\r
-- Apple OSX 10.7-10.13\r
-- Apple iOS 8-9\r
-- Linux (Beta version)\r
-\r
-Supported IDE:\r
-- Visual Studio 2015/2017\r
-- minimum Xcode 7\r
-- Qt Creator\r
-\r
----\r
-<div id='300'/>\r
-\r
-## About VST Plug-ins in general\r
-A VST Plug-in is an audio processing component that is utilized within a host application. This host application provides the audio or/and event streams that are processed by the Plug-in's code. Generally speaking, a VST Plug-in can take a stream of audio data, apply a process to the audio, and return the result to the host application. A VST Plug-in performs its process normally using the processor of the computer. The audio stream is broken down into a series of blocks. The host supplies the blocks in sequence. The host and its current environment control the block-size. The VST Plug-in maintains the status of all its own parameters relating to the running process: The host does not maintain any information about what the Plug-in did with the last block of data it processed.\r
-\r
-From the host application's point of view, a VST Plug-in is a black box with an arbitrary number of inputs, outputs (Event (MIDI) or Audio), and associated parameters. The host needs no implicit knowledge of the Plug-in's process to be able to use it. The Plug-in process can use whatever parameters it wishes, internally to the process, but depending on the capabilities of the host, it can allow the changes to user parameters to be automated by the host.\r
-\r
-The source code of a VST Plug-in is platform independent, but the delivery system depends on the platform architecture:\r
-- On **Windows**, a VST Plug-in is a multi-threaded DLL (Dynamic Link Library).\r
-- On **Mac OS X**, a VST Plug-in is a Mach-O Bundle\r
-- On **Linux**, a VST Plug-in is a package\r
-\r
-To learn more about VST you can subscribe to the [VST Developer Forum](https://sdk.steinberg.net) - check the 3rd Party Developer Support section at [www.steinberg.net](http://www.steinberg.net). \r
- \r
- ---\r
-<div id='400'/>\r
-\r
-## About VST 3\r
-VST 3 is a general rework of the long-serving VST Plug-in interface. It is not compatible with the older VST versions, but it includes some new features and possibilities. We have redesigned the API to make it not only far easier and more reliable for developers to work with, but have also provided completely new possibilities for Plug-ins. These include:\r
-\r
-### 1. Improved Performance with the Silence Flag \r
-Processing can optionally be applied to Plug-ins only when audio signals are present on their respective inputs, so VST 3 Plug-ins can apply their processing economically and only when it is needed. \r
-\r
-### 2. Multiple Dynamic I/Os \r
-VST 3 Plug-ins are no longer limited to a fixed number of inputs and outputs, and their I/O configuration can dynamically adapt to the channel configuration. Side-chains are also very easily realizable. This includes the possibility to deactivate unused buses after loading and even reactivate those when needed. This cleans up the mixer and further helps to reduce CPU load. \r
-\r
-### 3. Sample-accurate Automation \r
-VST 3 also features vastly improved parameter automation with sample accuracy and support for ramped automation data, allowing completely accurate and rapid parameter automation changes. \r
-\r
-### 4. Logical Parameter Organization \r
-The VST 3 Plug-in parameters are displayed in a tree structure. Parameters are grouped into sections which represent the structure of the Plug-in. Plug-ins can communicate their internal structure for the purpose of overview, but also for some associated functionality (eg. program-lists). \r
-\r
-### 5. Resizeable UI Editor \r
-VST 3 defines a way to allow resizing of the Plug-in editor by a user. \r
-\r
-### 6. Mouse Over Support \r
-The Host could ask the Plug-in which parameter is under the mouse. \r
-\r
-### 7. Context Menu Support\r
-VST 3 defines a way to allow the host to add its own entries in the Plug-in context menu of a specific parameter.\r
-\r
-### 8. Channel Context Information\r
-A VST 3 Plug-in could access some channel information where it is instantiated: name, color,...\r
-\r
-### 9. Note Expression \r
-VST 3 defines with Note Expression a new way of event controller editing. The Plug-in is able to break free from the limitations of MIDI controller events by providing access to new VST 3 controller events that circumvent the laws of MIDI and provide articulation information for each individual note (event) in a polyphonic arrangement according to its noteId. \r
-\r
-### 10. 3D Support\r
-VST 3 supports new speaker configurations like Ambisonic, Atmos, Auro 3D or 22.2.\r
-\r
-### 11. Factory Concept \r
-VST 3 Plug-in library could export multiple Plug-ins and in this way replaces the shell concept of VST 2 (kPlugCategShell).\r
-\r
-### 12. Support Remote control Representation\r
-VST 3 Plug-in can deliver a specific parameter mapping for remote controls like Nuage.\r
-\r
-### 13. Others\r
-While designing VST 3, we performed a careful analysis of the existing functionality of VST and rewrote the interfaces from scratch. In doing so, we focused a lot on providing clear interfaces and their documentation in order to avoid usage errors from the deepest possible layer.\r
-Some more features implemented specifically for developers include:\r
-- More stable technical Host/Plug-in environment\r
-- Advanced technical definition of the standard\r
-- Modular approach\r
-- Separation of UI and processing\r
-- Advanced Preset System\r
-- Multiple Plug-ins per Library\r
-- Test Host included\r
-- Automated Testing Environment\r
-- Validator (small command line Test Host) and Plug-in examples code included\r
-\r
----\r
-<div id='500'/>\r
-\r
-## How to build\r
-\r
-### Get the source code from GitHub\r
-<pre>git clone --recursive https://github.com/steinbergmedia/vst3sdk.git\r
-</pre>\r
-\r
-### Build the examples on Linux\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake ../vst3sdk\r
-make (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build the examples on macOS\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake -GXcode ../vst3sdk\r
-xcodebuild (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build the examples on Windows\r
-<pre>\r
-mkdir build\r
-cd build\r
-cmake.exe -G"Visual Studio 15 2017 Win64" ../vst3sdk\r
-msbuild.exe vstsdk.sln (or alternatively cmake --build .)\r
-</pre>\r
-\r
-### Build using cmake-gui\r
-<pre>\r
-* start the cmake-gui Application\r
-* "Browse Source...": select the folder VST3_SDK\r
-* "Browse Build...": select a folder where the outputs (projects/...) will be created. Typically a folder named "build"\r
-* you can check the SMTG Options\r
-* Press "Configure"\r
-* Press "Generate" and the project will be created\r
-\r
-</pre>\r
----\r
-\r
-## License & Usage guidelines\r
-More details are found at [www.steinberg.net/sdklicenses_vst3](http://www.steinberg.net/sdklicenses_vst3)
\ No newline at end of file
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-// \r
-// * Redistributions of source code must retain the above copyright notice, \r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation \r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this \r
-// software without specific prior written permission.\r
-// \r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/baseidds.cpp\r
-// Created by : Steinberg, 01/2008\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/istringresult.h"\r
-#include "pluginterfaces/base/ipersistent.h"\r
-\r
-\r
-namespace Steinberg {\r
-\r
-DEF_CLASS_IID (IString)\r
-DEF_CLASS_IID (IStringResult)\r
-\r
-DEF_CLASS_IID (IPersistent)\r
-DEF_CLASS_IID (IAttributes)\r
-DEF_CLASS_IID (IAttributes2)\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/classfactoryhelpers.h\r
-// Created by : Steinberg, 03/2017\r
-// Description : Class factory\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//------------------------------------------------------------------------------\r
-// Helper Macros. Not intended for direct use.\r
-// Use:\r
-// META_CLASS(className),\r
-// META_CLASS_IFACE(className,Interface),\r
-// META_CLASS_SINGLE(className,Interface)\r
-// instead.\r
-//------------------------------------------------------------------------------\r
-#define META_CREATE_FUNC(funcName) static FUnknown* funcName ()\r
-\r
-#define CLASS_CREATE_FUNC(className) \\r
- namespace Meta { \\r
- META_CREATE_FUNC (make##className) { return (NEW className)->unknownCast (); } \\r
- }\r
-\r
-#define SINGLE_CREATE_FUNC(className) \\r
- namespace Meta { \\r
- META_CREATE_FUNC (make##className) { return className::instance ()->unknownCast (); } \\r
- }\r
-\r
-#define _META_CLASS(className) \\r
- namespace Meta { \\r
- static Steinberg::MetaClass meta##className ((#className), Meta::make##className); \\r
- }\r
-\r
-#define _META_CLASS_IFACE(className, Interface) \\r
- namespace Meta { \\r
- static Steinberg::MetaClass meta##Interface##className ((#className), Meta::make##className, \\r
- Interface##_iid); \\r
- }\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS(className) \\r
- CLASS_CREATE_FUNC (className) \\r
- _META_CLASS (className)\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS_IFACE(className, Interface) \\r
- CLASS_CREATE_FUNC (className) \\r
- _META_CLASS_IFACE (className, Interface)\r
-\r
-/** TODO\r
- */\r
-#define META_CLASS_SINGLE(className, Interface) \\r
- SINGLE_CREATE_FUNC (className) \\r
- _META_CLASS_IFACE (className, Interface)\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fbuffer.cpp\r
-// Created by : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fbuffer.h"\r
-#include "base/source/fstring.h"\r
-#include <stdlib.h>\r
-\r
-namespace Steinberg {\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer ()\r
-: buffer (0)\r
-, memSize (0)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (uint32 s, uint8 initVal)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{\r
- if (memSize == 0)\r
- return;\r
- buffer = (int8*)::malloc (memSize);\r
- if (buffer)\r
- memset (buffer, initVal, memSize);\r
- else\r
- memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (uint32 s)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (0)\r
-, delta (defaultDelta)\r
-{\r
- if (memSize == 0)\r
- return;\r
- buffer = (int8*)::malloc (memSize);\r
- if (!buffer)\r
- memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (const void* b , uint32 s)\r
-: buffer (0)\r
-, memSize (s)\r
-, fillSize (s)\r
-, delta (defaultDelta)\r
-{\r
- if (memSize == 0)\r
- return;\r
- buffer = (int8*)::malloc (memSize);\r
- if (buffer)\r
- memcpy (buffer, b, memSize);\r
- else\r
- {\r
- memSize = 0;\r
- fillSize = 0;\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::Buffer (const Buffer& bufferR)\r
-: buffer (0)\r
-, memSize (bufferR.memSize)\r
-, fillSize (bufferR.fillSize)\r
-, delta (bufferR.delta)\r
-{\r
- if (memSize == 0)\r
- return;\r
-\r
- buffer = (int8*)::malloc (memSize);\r
- if (buffer)\r
- memcpy (buffer, bufferR.buffer, memSize);\r
- else\r
- memSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-Buffer::~Buffer ()\r
-{\r
- if (buffer)\r
- ::free (buffer);\r
- buffer = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::operator = (const Buffer& b2)\r
-{\r
- if (&b2 != this)\r
- {\r
- setSize (b2.memSize);\r
- if (b2.memSize > 0 && buffer)\r
- memcpy (buffer, b2.buffer, b2.memSize);\r
- fillSize = b2.fillSize;\r
- delta = b2.delta;\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::operator == (const Buffer& b2)const\r
-{\r
- if (&b2 == this)\r
- return true;\r
- if (b2.getSize () != getSize ())\r
- return false;\r
- return memcmp (this->int8Ptr (), b2.int8Ptr (), getSize ()) == 0 ? true : false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-uint32 Buffer::get (void* b, uint32 size)\r
-{\r
- uint32 maxGet = memSize - fillSize;\r
- if (size > maxGet)\r
- size = maxGet;\r
- if (size > 0)\r
- memcpy (b, buffer + fillSize, size);\r
- fillSize += size;\r
- return size;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (char16 c)\r
-{\r
- return put ((const void*)&c, sizeof (c));\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (uint8 byte)\r
-{\r
- if (grow (fillSize + 1) == false)\r
- return false;\r
-\r
- buffer [fillSize++] = byte;\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (char c)\r
-{\r
- if (grow (fillSize + 1) == false)\r
- return false;\r
-\r
- buffer [fillSize++] = c;\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (const void* toPut, uint32 s)\r
-{\r
- if (!toPut)\r
- return false;\r
-\r
- if (grow (fillSize + s) == false)\r
- return false;\r
-\r
- memcpy (buffer + fillSize, toPut, s);\r
- fillSize += s;\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::put (const String& str)\r
-{\r
- return put ((const void*)str.text () , (str.length () + 1) * sizeof (tchar));\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::appendString8 (const char8* s)\r
-{\r
- if (!s)\r
- return false;\r
-\r
- uint32 len = (uint32) strlen (s);\r
- return put (s, len);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::appendString16 (const char16* s)\r
-{\r
- if (!s)\r
- return false;\r
- ConstString str (s);\r
- uint32 len = (uint32) str.length () * sizeof (char16);\r
- return put (s, len);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString8 (const char8* s)\r
-{\r
- if (!s)\r
- return false;\r
-\r
- uint32 len = (uint32) strlen (s);\r
-\r
- if (len > 0)\r
- {\r
- shiftStart (len);\r
- memcpy (buffer, s, len);\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString16 (const char16* s)\r
-{\r
- if (!s)\r
- return false;\r
-\r
- ConstString str (s);\r
- uint32 len = (uint32) str.length () * sizeof (char16);\r
-\r
- if (len > 0)\r
- {\r
- shiftStart (len);\r
- memcpy (buffer, s, len);\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString8 (char8 c)\r
-{\r
- shiftStart (sizeof (char));\r
- char* b = (char*)buffer;\r
- b [0] = c;\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::prependString16 (char16 c)\r
-{\r
- shiftStart (sizeof (char16));\r
- char16* b = (char16*)buffer;\r
- b [0] = c;\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::copy (uint32 from, uint32 to, uint32 bytes)\r
-{\r
- if (from + bytes > memSize || bytes == 0)\r
- return false;\r
-\r
- if (to + bytes > memSize)\r
- setSize (to + bytes);\r
-\r
- if (from + bytes > to && from < to)\r
- { // overlap\r
- Buffer tmp (buffer + from, bytes);\r
- memcpy (buffer + to, tmp, bytes);\r
- }\r
- else\r
- memcpy (buffer + to, buffer + from, bytes);\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::makeHexString (String& result)\r
-{\r
- unsigned char* data = uint8Ptr ();\r
- uint32 bytes = getSize ();\r
-\r
- if (data == 0 || bytes == 0)\r
- return false;\r
-\r
- char8* stringBuffer = (char8*)malloc ((bytes * 2) + 1);\r
- if (!stringBuffer)\r
- return false;\r
-\r
- int32 count = 0;\r
- while (bytes > 0)\r
- {\r
- unsigned char t1 = ((*data) >> 4) & 0x0F;\r
- unsigned char t2 = (*data) & 0x0F;\r
- if (t1 < 10)\r
- t1 += '0';\r
- else\r
- t1 = t1 - 10 + 'A';\r
- if (t2 < 10)\r
- t2 += '0';\r
- else\r
- t2 = t2 - 10 + 'A';\r
-\r
- stringBuffer [count++] = t1;\r
- stringBuffer [count++] = t2;\r
- data++;\r
- bytes--;\r
- }\r
- stringBuffer [count] = 0;\r
-\r
- result.take ((void*)stringBuffer, false);\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::fromHexString (const char8* string)\r
-{\r
- flush ();\r
- if (string == 0)\r
- return false;\r
-\r
- int32 len = strlen8 (string);\r
- if (len == 0 || ((len & 1) == 1)/*odd number*/ )\r
- return false;\r
-\r
- setSize (len / 2);\r
- unsigned char* data = uint8Ptr ();\r
-\r
- bool upper = true;\r
- int32 count = 0;\r
- while (count < len)\r
- {\r
- char c = string [count];\r
-\r
- unsigned char d = 0;\r
- if (c >= '0' && c <= '9') d += c - '0';\r
- else if (c >= 'A' && c <= 'F') d += c - 'A' + 10;\r
- else if (c >= 'a' && c <= 'f') d += c - 'a' + 10;\r
- else return false; // no hex string\r
-\r
- if (upper)\r
- data [count >> 1] = d << 4;\r
- else\r
- data [count >> 1] += d;\r
-\r
- upper = !upper;\r
- count++;\r
- }\r
- setFillSize (len / 2);\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Buffer::set (uint8 value)\r
-{\r
- if (buffer)\r
- memset (buffer, value, memSize);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::setFillSize (uint32 c)\r
-{\r
- if (c <= memSize)\r
- {\r
- fillSize = c;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::truncateToFillSize ()\r
-{\r
- if (fillSize < memSize)\r
- setSize (fillSize);\r
-\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::grow (uint32 newSize)\r
-{\r
- if (newSize > memSize)\r
- {\r
- if (delta == 0)\r
- delta = defaultDelta;\r
- uint32 s = ((newSize + delta - 1) / delta) * delta;\r
- return setSize (s);\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Buffer::shiftAt (uint32 position, int32 amount)\r
-{\r
- if (amount > 0)\r
- {\r
- if (grow (fillSize + amount))\r
- {\r
- if (position < fillSize)\r
- memmove (buffer + amount + position, buffer + position, fillSize - position);\r
-\r
- fillSize += amount;\r
- }\r
- }\r
- else if (amount < 0 && fillSize > 0)\r
- {\r
- uint32 toRemove = -amount;\r
-\r
- if (toRemove < fillSize)\r
- {\r
- if (position < fillSize)\r
- memmove (buffer + position, buffer + toRemove + position, fillSize - position - toRemove);\r
- fillSize -= toRemove;\r
- }\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::move (int32 amount, uint8 initVal)\r
-{\r
- if (memSize == 0)\r
- return;\r
-\r
- if (amount > 0)\r
- {\r
- if ((uint32)amount < memSize)\r
- {\r
- memmove (buffer + amount, buffer, memSize - amount);\r
- memset (buffer, initVal, amount);\r
- }\r
- else\r
- memset (buffer, initVal, memSize);\r
- }\r
- else\r
- {\r
- uint32 toRemove = -amount;\r
- if (toRemove < memSize)\r
- {\r
- memmove (buffer, buffer + toRemove, memSize - toRemove);\r
- memset (buffer + memSize - toRemove, initVal, toRemove);\r
- }\r
- else\r
- memset (buffer, initVal, memSize);\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::setSize (uint32 newSize)\r
-{\r
- if (memSize != newSize)\r
- {\r
- if (buffer)\r
- {\r
- if (newSize > 0)\r
- {\r
- int8* newBuffer = (int8*) ::realloc (buffer, newSize);\r
- if (newBuffer == 0)\r
- {\r
- newBuffer = (int8*)::malloc (newSize);\r
- if (newBuffer)\r
- {\r
- uint32 tmp = newSize;\r
- if (tmp > memSize)\r
- tmp = memSize;\r
- memcpy (newBuffer, buffer, tmp);\r
- ::free (buffer);\r
- buffer = newBuffer;\r
- }\r
- else\r
- {\r
- ::free (buffer);\r
- buffer = 0;\r
- }\r
- }\r
- else\r
- buffer = newBuffer;\r
- }\r
- else\r
- {\r
- ::free (buffer);\r
- buffer = 0;\r
- }\r
- }\r
- else\r
- buffer = (int8*)::malloc (newSize);\r
-\r
- if (newSize > 0 && !buffer)\r
- memSize = 0;\r
- else\r
- memSize = newSize;\r
- if (fillSize > memSize)\r
- fillSize = memSize;\r
- }\r
-\r
- return (newSize > 0) == (buffer != 0);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::fillup (uint8 value)\r
-{\r
- if (getFree () > 0)\r
- memset (buffer + fillSize, value, getFree ());\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-int8* Buffer::operator + (uint32 i)\r
-{\r
- if (i < memSize)\r
- return buffer + i;\r
- else\r
- {\r
- static int8 eof;\r
- eof = 0;\r
- return &eof;\r
- }\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::swap (int16 swapSize)\r
-{\r
- return swap (buffer, memSize, swapSize);\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::swap (void* buffer, uint32 bufferSize, int16 swapSize)\r
-{\r
- if (swapSize != kSwap16 && swapSize != kSwap32 && swapSize != kSwap64)\r
- return false;\r
-\r
- if (swapSize == kSwap16)\r
- {\r
- for (uint32 count = 0 ; count < bufferSize ; count += 2)\r
- {\r
- SWAP_16 ( * (((int16*)buffer) + count) );\r
- }\r
- }\r
- else if (swapSize == kSwap32)\r
- {\r
- for (uint32 count = 0 ; count < bufferSize ; count += 4)\r
- {\r
- SWAP_32 ( * (((int32*)buffer) + count) );\r
- }\r
- }\r
- else if (swapSize == kSwap64)\r
- {\r
- for (uint32 count = 0 ; count < bufferSize ; count += 8)\r
- {\r
- SWAP_64 ( * (((int64*)buffer) + count) );\r
- }\r
- }\r
-\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-void Buffer::take (Buffer& from)\r
-{\r
- setSize (0);\r
- memSize = from.memSize;\r
- fillSize = from.fillSize;\r
- buffer = from.buffer;\r
- from.buffer = 0;\r
- from.memSize = 0;\r
- from.fillSize = 0;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-int8* Buffer::pass ()\r
-{\r
- int8* res = buffer;\r
- buffer = 0;\r
- memSize = 0;\r
- fillSize = 0;\r
- return res;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::toWideString (int32 sourceCodePage)\r
-{\r
- if (getFillSize () > 0)\r
- {\r
- if (str8 () [getFillSize () - 1] != 0) // multiByteToWideString only works with 0-terminated strings\r
- endString8 ();\r
-\r
- Buffer dest (getFillSize () * sizeof (char16));\r
- int32 result = String::multiByteToWideString (dest.str16 (), buffer, dest.getFree () / sizeof (char16), sourceCodePage);\r
- if (result > 0)\r
- {\r
- dest.setFillSize ((result - 1) * sizeof (char16));\r
- take (dest);\r
- return true;\r
- }\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------\r
-bool Buffer::toMultibyteString (int32 destCodePage)\r
-{\r
- if (getFillSize () > 0)\r
- {\r
- int32 textLength = getFillSize () / sizeof (char16); // wideStringToMultiByte only works with 0-terminated strings\r
- if (str16 () [textLength - 1] != 0)\r
- endString16 ();\r
-\r
- Buffer dest (getFillSize ());\r
- int32 result = String::wideStringToMultiByte (dest.str8 (), str16 (), dest.getFree (), destCodePage);\r
- if (result > 0)\r
- {\r
- dest.setFillSize (result - 1);\r
- take (dest);\r
- return true;\r
- }\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fbuffer.h\r
-// Created by : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include <cstring>\r
-\r
-namespace Steinberg {\r
-class String;\r
-\r
-//------------------------------------------------------------------------\r
-/** Buffer.\r
-@ingroup adt\r
-\r
-A Buffer is an object-oriented wrapper for a piece of memory.\r
-It adds several utility functions, e.g. for managing the size of the Buffer,\r
-appending or prepending values or strings to it.\r
-Internally it uses the standard memory functions malloc(), free(), etc. */\r
-//------------------------------------------------------------------------\r
-class Buffer\r
-{\r
-public:\r
-//---------------------------------------------------------------------\r
-\r
- /** Default constructor, allocates no memory at all.\r
- */\r
- Buffer ();\r
-\r
- /** Constructor - creates a new Buffer with a given size and copies contents from optional memory pointer.\r
- \param[in] b : optional memory pointer with the size of at least the given size\r
- \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
- */\r
- Buffer (const void* b, uint32 size);\r
-\r
- /** Constructor - creates a new Buffer with a given size and fills it all with a given value.\r
- \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
- \param[in] initVal : the initial value the Buffer will be completely filled with\r
- */\r
- Buffer (uint32 size, uint8 initVal);\r
-\r
- /** Constructor - creates a new Buffer with a given size.\r
- \param[in] size : the size of the new Buffer to be allocated, in bytes.\r
- */\r
- Buffer (uint32 size);\r
-\r
- /** Copy constructor - creates a new Buffer from a given Buffer.\r
- \param[in] buff : the Buffer from which all memory will be copied to the new one\r
- */\r
- Buffer (const Buffer& buff);\r
-\r
- /** Destructor - deallocates the internal memory.\r
- */\r
- ~Buffer ();\r
-\r
- /** Assignment operator - copies contents from a given Buffer and increases the size if necessary.\r
- \param[in] buff : the Buffer from which all memory will be copied\r
- */\r
- void operator = (const Buffer& buff);\r
-\r
- /** Comparison operator - copies contents from a given Buffer and increases the size if necessary.\r
- \param[in] buff : the Buffer to be compared to\r
- \return true, if the given Buffer's content is equal to this one, else false\r
- */\r
- bool operator == (const Buffer& buff)const;\r
-\r
- uint32 getSize () const {return memSize;} ///< \return the actual size of the Buffer's memory, in bytes.\r
-\r
- /** Sets a new size for this Buffer, keeping as much content as possible.\r
- \param[in] newSize : the new size for the Buffer, in bytes, newSize maybe zero\r
- \return true, if the new size could be adapted, else false\r
- */\r
- bool setSize (uint32 newSize);\r
-\r
- /** Increases the Buffer to the next block, block size given by delta.\r
- \param[in] memSize : the new minimum size of the Buffer, newSize maybe zero\r
- \return true, if the Buffer could be grown successfully, else false\r
- */\r
- bool grow (uint32 memSize);\r
- bool setMaxSize (uint32 size) {return grow (size);} ///< see \ref grow()\r
-\r
- void fillup (uint8 initVal = 0); ///< set from fillSize to end\r
- uint32 getFillSize ()const {return fillSize;} ///< \return the actual fill size\r
- bool setFillSize (uint32 c); ///< sets a new fill size, does not change any memory\r
- inline void flush () {setFillSize (0);} ///< sets fill size to zero\r
- bool truncateToFillSize (); ///< \return always true, truncates the size of the Buffer to the actual fill size\r
-\r
- bool isFull () const { return (fillSize == memSize); } ///< \return true, if all memory is filled up, else false\r
- uint32 getFree () const { return (memSize - fillSize); }///< \return remaining memory\r
-\r
- inline void shiftStart (int32 amount) {return shiftAt (0, amount);} ///< moves all memory by given amount, grows the Buffer if necessary\r
- void shiftAt (uint32 position, int32 amount); ///< moves memory starting at the given position\r
- void move (int32 amount, uint8 initVal = 0); ///< shifts memory at start without growing the buffer, so data is lost and initialized with init val\r
-\r
- bool copy (uint32 from, uint32 to, uint32 bytes); ///< copies a number of bytes from one position to another, the size may be adapted\r
- uint32 get (void* b, uint32 size); ///< copy to buffer from fillSize, and shift fillSize\r
-\r
- void setDelta (uint32 d) {delta = d;} ///< define the block size by which the Buffer grows, see \ref grow()\r
-\r
- bool put (uint8); ///< append value at end, grows Buffer if necessary\r
- bool put (char16 c); ///< append value at end, grows Buffer if necessary\r
- bool put (char c); ///< append value at end, grows Buffer if necessary\r
- bool put (const void* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (void* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (uint8* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (char8* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (const uint8* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (const char8* , uint32 size); ///< append bytes from a given buffer, grows Buffer if necessary\r
- bool put (const String&); ///< append String at end, grows Buffer if necessary\r
-\r
- void set (uint8 value); ///< fills complete Buffer with given value\r
-\r
- // strings ----------------\r
- bool appendString (const tchar* s);\r
- bool appendString (tchar* s);\r
- bool appendString (tchar c) { return put (c); }\r
-\r
- bool appendString8 (const char8* s);\r
- bool appendString16 (const char16* s);\r
-\r
- bool appendString8 (char8* s) { return appendString8 ((const char8*)s); }\r
- bool appendString8 (unsigned char* s) { return appendString8 ((const char8*)s); }\r
- bool appendString8 (const unsigned char* s) { return appendString8 ((const char8*)s); }\r
-\r
- bool appendString8 (char8 c) { return put ((uint8)c); }\r
- bool appendString8 (unsigned char c) { return put (c); }\r
- bool appendString16 (char16 c) { return put (c); }\r
- bool appendString16 (char16* s) { return appendString16 ((const char16*)s); }\r
-\r
- bool prependString (const tchar* s);\r
- bool prependString (tchar* s);\r
- bool prependString (tchar c);\r
-\r
- bool prependString8 (const char8* s);\r
- bool prependString16 (const char16* s);\r
-\r
- bool prependString8 (char8 c);\r
- bool prependString8 (unsigned char c) { return prependString8 ((char8)c); }\r
- bool prependString8 (char8* s) { return prependString8 ((const char8*)s); }\r
- bool prependString8 (unsigned char* s) { return prependString8((const char8*)s); }\r
- bool prependString8 (const unsigned char* s) { return prependString8 ((const char8*)s); }\r
- bool prependString16 (char16 c);\r
- bool prependString16 (char16* s) { return prependString16 ((const char16*)s); }\r
-\r
- bool operator+= (const char* s) { return appendString8 (s); }\r
- bool operator+= (char c) { return appendString8 (c); }\r
- bool operator+= (const char16* s) { return appendString16 (s); }\r
- bool operator+= (char16 c) { return appendString16 (c); }\r
-\r
- bool operator= (const char* s) { flush (); return appendString8 (s); }\r
- bool operator= (const char16* s) { flush (); return appendString16 (s); }\r
- bool operator= (char8 c) { flush (); return appendString8 (c); }\r
- bool operator= (char16 c) { flush (); return appendString16 (c); }\r
-\r
- void endString () {put (tchar (0));}\r
- void endString8 () {put (char8 (0));}\r
- void endString16 () {put (char16 (0));}\r
-\r
- bool makeHexString (String& result);\r
- bool fromHexString (const char8* string);\r
-\r
- // conversion\r
- operator void* () const { return (void*)buffer; } ///< conversion\r
- inline tchar* str () const {return (tchar*)buffer;} ///< conversion\r
- inline char8* str8 () const {return (char8*)buffer;} ///< conversion\r
- inline char16* str16 () const {return (char16*)buffer;} ///< conversion\r
- inline int8* int8Ptr () const {return (int8*)buffer;} ///< conversion\r
- inline uint8* uint8Ptr () const {return (uint8*)buffer; } ///< conversion\r
- inline int16* int16Ptr () const {return (int16*)buffer; } ///< conversion\r
- inline uint16* uint16Ptr () const {return (uint16*)buffer; } ///< conversion\r
- inline int32* int32Ptr () const {return (int32*)buffer; } ///< conversion\r
- inline uint32* uint32Ptr () const {return (uint32*)buffer; } ///< conversion\r
- inline float* floatPtr () const {return (float*)buffer; } ///< conversion\r
- inline double* doublePtr () const {return (double*)buffer; } ///< conversion\r
- inline char16* wcharPtr () const {return (char16*)buffer;} ///< conversion\r
-\r
- int8* operator + (uint32 i); ///< \return the internal Buffer's address plus the given offset i, zero if offset is out of range\r
-\r
- int32 operator ! () { return buffer == 0; }\r
-\r
- enum swapSize\r
- {\r
- kSwap16 = 2,\r
- kSwap32 = 4,\r
- kSwap64 = 8\r
- };\r
- bool swap (int16 swapSize); ///< swap all bytes of this Buffer by the given swapSize\r
- static bool swap (void* buffer, uint32 bufferSize, int16 swapSize); ///< utility, swap given number of bytes in given buffer by the given swapSize\r
-\r
- void take (Buffer& from); ///< takes another Buffer's memory, frees the current Buffer's memory\r
- int8* pass (); ///< pass the current Buffer's memory\r
-\r
- /** Converts a Buffer's content to UTF-16 from a given multi-byte code page, Buffer must contain char8 of given encoding.\r
- \param[in] sourceCodePage : the actual code page of the Buffer's content\r
- \return true, if the conversion was successful, else false\r
- */\r
- virtual bool toWideString (int32 sourceCodePage); // Buffer contains char8 of given encoding -> utf16\r
-\r
- /** Converts a Buffer's content from UTF-16 to a given multi-byte code page, Buffer must contain UTF-16 encoded characters.\r
- \param[in] destCodePage : the desired code page to convert the Buffer's content to\r
- \return true, if the conversion was successful, else false\r
- */\r
- virtual bool toMultibyteString (int32 destCodePage); // Buffer contains utf16 -> char8 of given encoding\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- static const uint32 defaultDelta = 0x1000; // 0x1000\r
-\r
- int8* buffer;\r
- uint32 memSize;\r
- uint32 fillSize;\r
- uint32 delta;\r
-};\r
-\r
-inline bool Buffer::put (void* p, uint32 count) { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (uint8 * p, uint32 count) { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (char8* p, uint32 count) { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (const uint8* p, uint32 count) { return put ((const void*)p , count ); }\r
-inline bool Buffer::put (const char8* p, uint32 count) { return put ((const void*)p , count ); }\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::appendString (const tchar* s)\r
-{\r
-#ifdef UNICODE\r
- return appendString16 (s);\r
-#else\r
- return appendString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::appendString (tchar* s)\r
-{\r
-#ifdef UNICODE\r
- return appendString16 (s);\r
-#else\r
- return appendString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (const tchar* s)\r
-{\r
-#ifdef UNICODE\r
- return prependString16 (s);\r
-#else\r
- return prependString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (tchar* s)\r
-{\r
-#ifdef UNICODE\r
- return prependString16 (s);\r
-#else\r
- return prependString8 (s);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool Buffer::prependString (tchar c)\r
-{\r
-#ifdef UNICODE\r
- return prependString16 (c);\r
-#else\r
- return prependString8 (c);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fdebug.cpp\r
-// Created by : Steinberg, 1995\r
-// Description : There are 2 levels of debugging messages:\r
-// DEVELOPMENT During development\r
-// RELEASE Program is shipping.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fdebug.h"\r
-\r
-#if DEVELOPMENT\r
-\r
-#include <assert.h>\r
-#include <cstdarg>\r
-#include <cstdio>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifndef _WIN32_WINNT\r
-#define _WIN32_WINNT 0x0400\r
-#endif\r
-#include <intrin.h>\r
-#include <windows.h>\r
-#define vsnprintf _vsnprintf\r
-#define snprintf _snprintf\r
-\r
-#elif SMTG_OS_MACOS\r
-#include <errno.h>\r
-#include <mach/mach_init.h>\r
-#include <mach/mach_time.h>\r
-#include <new>\r
-#include <signal.h>\r
-#include <stdbool.h>\r
-#include <sys/sysctl.h>\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-\r
-static bool AmIBeingDebugged (void);\r
-\r
-#define THREAD_ALLOC_WATCH 0 // check allocations on specific threads\r
-\r
-#if THREAD_ALLOC_WATCH\r
-mach_port_t watchThreadID = 0;\r
-#endif\r
-\r
-#endif\r
-\r
-AssertionHandler gAssertionHandler = nullptr;\r
-AssertionHandler gPreAssertionHook = nullptr;\r
-DebugPrintLogger gDebugPrintLogger = nullptr;\r
-\r
-namespace boost {\r
-// Define the boost assertion handler to redirect to our assertion handler,\r
-// otherwise it just calls abort(). Note that we don't need to include any boost\r
-// headers for this, it just provides the handler.\r
-void assertion_failed (char const* expr, char const* function, char const* file, long line)\r
-{\r
-#if DEVELOPMENT\r
- char message[512];\r
- snprintf (message, 512, "%s at %s, %s:%ld", expr, function, file, line);\r
- if (gAssertionHandler)\r
- {\r
- FDebugBreak (message);\r
- }\r
- else\r
- {\r
- assert (!(const char *)message);\r
- }\r
-#endif\r
-}\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-static const int kDebugPrintfBufferSize = 10000;\r
-static bool neverDebugger = false; // so I can switch it off in the debugger...\r
-\r
-//--------------------------------------------------------------------------\r
-static void printDebugString (const char* string)\r
-{\r
- if (!string)\r
- return;\r
-\r
- if (gDebugPrintLogger)\r
- {\r
- gDebugPrintLogger (string);\r
- }\r
- else\r
- {\r
-#if SMTG_OS_MACOS\r
- fprintf (stderr, "%s", string);\r
-#elif SMTG_OS_WINDOWS\r
- OutputDebugStringA (string);\r
-#endif\r
- }\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-// printf style debugging output\r
-//--------------------------------------------------------------------------\r
-void FDebugPrint (const char* format, ...)\r
-{\r
- char string[kDebugPrintfBufferSize];\r
- va_list marker;\r
- va_start (marker, format);\r
- vsnprintf (string, kDebugPrintfBufferSize, format, marker);\r
-\r
- printDebugString (string);\r
-}\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define AmIBeingDebugged IsDebuggerPresent\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
-#include <signal.h>\r
-#include <sys/types.h>\r
-#include <unistd.h>\r
-//--------------------------------------------------------------------------\r
-static inline bool AmIBeingDebugged ()\r
-{\r
- // TODO: check if GDB or LLDB is attached\r
- return true;\r
-}\r
-#endif\r
-\r
-//--------------------------------------------------------------------------\r
-// printf style debugging output\r
-//--------------------------------------------------------------------------\r
-void FDebugBreak (const char* format, ...)\r
-{\r
- char string[kDebugPrintfBufferSize];\r
- va_list marker;\r
- va_start (marker, format);\r
- vsnprintf (string, kDebugPrintfBufferSize, format, marker);\r
-\r
- printDebugString (string);\r
-\r
- // The Pre-assertion hook is always called, even if we're not running in the debugger,\r
- // so that we can log asserts without displaying them\r
- if (gPreAssertionHook)\r
- {\r
- gPreAssertionHook (string);\r
- }\r
-\r
- if (neverDebugger)\r
- return;\r
- if (AmIBeingDebugged ())\r
- {\r
- // do not crash if no debugger present\r
- // If there is an assertion handler defined then let this override the UI\r
- // and tell us whether we want to break into the debugger\r
- bool breakIntoDebugger = true;\r
- if (gAssertionHandler && gAssertionHandler (string) == false)\r
- {\r
- breakIntoDebugger = false;\r
- }\r
-\r
- if (breakIntoDebugger)\r
- {\r
-#if SMTG_OS_WINDOWS\r
- __debugbreak (); // intrinsic version of DebugBreak()\r
-#elif __ppc64__ || __ppc__ || __arm__\r
- kill (getpid (), SIGINT);\r
-#elif __i386__ || __x86_64__\r
- {\r
- __asm__ volatile ("int3");\r
- }\r
-#endif\r
- }\r
- }\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-void FPrintLastError (const char* file, int line)\r
-{\r
-#if SMTG_OS_WINDOWS\r
- LPVOID lpMessageBuffer;\r
- FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,\r
- GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
- (LPSTR)&lpMessageBuffer, 0, NULL);\r
- FDebugPrint ("%s(%d) : %s\n", file, line, lpMessageBuffer);\r
- LocalFree (lpMessageBuffer);\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#if !__MACH__\r
- extern int errno;\r
-#endif\r
- FDebugPrint ("%s(%d) : Errno %d\n", file, line, errno);\r
-#endif\r
-}\r
-\r
-#if SMTG_OS_MACOS\r
-\r
-//------------------------------------------------------------------------\r
-void* operator new (size_t size, int, const char* file, int line)\r
-{\r
-#if THREAD_ALLOC_WATCH\r
- mach_port_t threadID = mach_thread_self ();\r
- if (watchThreadID == threadID)\r
- {\r
- FDebugPrint ("Watched Thread Allocation : %s (Line:%d)\n", file ? file : "Unknown", line);\r
- }\r
-#endif\r
- try\r
- {\r
- return ::operator new (size);\r
- }\r
- catch (std::bad_alloc exception)\r
- {\r
- FDebugPrint ("bad_alloc exception : %s (Line:%d)", file ? file : "Unknown", line);\r
- }\r
- return (void*)-1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void* operator new[] (size_t size, int, const char* file, int line)\r
-{\r
-#if THREAD_ALLOC_WATCH\r
- mach_port_t threadID = mach_thread_self ();\r
- if (watchThreadID == threadID)\r
- {\r
- FDebugPrint ("Watched Thread Allocation : %s (Line:%d)\n", file ? file : "Unknown", line);\r
- }\r
-#endif\r
- try\r
- {\r
- return ::operator new[] (size);\r
- }\r
- catch (std::bad_alloc exception)\r
- {\r
- FDebugPrint ("bad_alloc exception : %s (Line:%d)", file ? file : "Unknown", line);\r
- }\r
- return (void*)-1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void operator delete (void* p, int, const char* file, int line)\r
-{\r
- ::operator delete (p);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void operator delete[] (void* p, int, const char* file, int line)\r
-{\r
- ::operator delete[] (p);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// from Technical Q&A QA1361 (http://developer.apple.com/qa/qa2004/qa1361.html)\r
-//------------------------------------------------------------------------\r
-bool AmIBeingDebugged (void)\r
-// Returns true if the current process is being debugged (either\r
-// running under the debugger or has a debugger attached post facto).\r
-{\r
- int mib[4];\r
- struct kinfo_proc info;\r
- size_t size;\r
-\r
- // Initialize the flags so that, if sysctl fails for some bizarre\r
- // reason, we get a predictable result.\r
-\r
- info.kp_proc.p_flag = 0;\r
-\r
- // Initialize mib, which tells sysctl the info we want, in this case\r
- // we're looking for information about a specific process ID.\r
-\r
- mib[0] = CTL_KERN;\r
- mib[1] = KERN_PROC;\r
- mib[2] = KERN_PROC_PID;\r
- mib[3] = getpid ();\r
-\r
- // Call sysctl.\r
-\r
- size = sizeof (info);\r
- sysctl (mib, sizeof (mib) / sizeof (*mib), &info, &size, NULL, 0);\r
-\r
- // We're being debugged if the P_TRACED flag is set.\r
- return ((info.kp_proc.p_flag & P_TRACED) != 0);\r
-}\r
-\r
-#endif // SMTG_OS_MACOS\r
-\r
-#endif // DEVELOPMENT\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fdebug.h\r
-// Created by : Steinberg, 1995\r
-// Description : There are 2 levels of debugging messages:\r
-// DEVELOPMENT During development\r
-// RELEASE Program is shipping.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-/** @file base/source/fdebug.h\r
- Debugging tools.\r
-\r
- There are 2 levels of debugging messages:\r
- - DEVELOPMENT\r
- - During development\r
- - RELEASE\r
- - Program is shipping.\r
-*/\r
-//-----------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include <string.h>\r
-\r
-#if SMTG_OS_MACOS\r
-#include <new>\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-// development / release\r
-//-----------------------------------------------------------------------------\r
-#if !defined (DEVELOPMENT) && !defined (RELEASE)\r
- #ifdef _DEBUG\r
- #define DEVELOPMENT 1\r
- #elif defined (NDEBUG)\r
- #define RELEASE 1\r
- #else\r
- #error DEVELOPMENT, RELEASE, _DEBUG, or NDEBUG must be defined!\r
- #endif\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-\r
-/** Disable compiler warning:\r
- * C4291: "No matching operator delete found; memory will not be freed if initialization throws an\r
- * exception. A placement new is used for which there is no placement delete." */\r
-#if DEVELOPMENT && defined(_MSC_VER)\r
-#pragma warning(disable : 4291)\r
-#pragma warning(disable : 4985)\r
-#endif\r
-\r
-#endif // SMTG_OS_WINDOWS\r
-\r
-#if DEVELOPMENT\r
-//-----------------------------------------------------------------------------\r
-/** If "f" is not true and a debugger is present, send an error string to the debugger for display\r
- and cause a breakpoint exception to occur in the current process. SMTG_ASSERT is removed\r
- completely in RELEASE configuration. So do not pass methods calls to this macro that are expected\r
- to exist in the RELEASE build (for method calls that need to be present in a RELEASE build, use\r
- the VERIFY macros instead)*/\r
-#define SMTG_ASSERT(f) \\r
- if (!(f)) \\r
- FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** Send "comment" string to the debugger for display. */\r
-#define SMTG_WARNING(comment) FDebugPrint ("%s(%d) : %s\n", __FILE__, __LINE__, comment);\r
-\r
-/** Send the last error string to the debugger for display. */\r
-#define SMTG_PRINTSYSERROR FPrintLastError (__FILE__, __LINE__);\r
-\r
-/** If a debugger is present, send string "s" to the debugger for display and\r
- cause a breakpoint exception to occur in the current process. */\r
-#define SMTG_DEBUGSTR(s) FDebugBreak (s);\r
-\r
-/** Use VERIFY for calling methods "f" having a bool result (expecting them to return 'true')\r
- The call of "f" is not removed in RELEASE builds, only the result verification. eg: SMTG_VERIFY\r
- (isValid ()) */\r
-#define SMTG_VERIFY(f) SMTG_ASSERT (f)\r
-\r
-/** Use VERIFY_IS for calling methods "f" and expect a certain result "r".\r
- The call of "f" is not removed in RELEASE builds, only the result verification. eg:\r
- SMTG_VERIFY_IS (callMethod (), kResultOK) */\r
-#define SMTG_VERIFY_IS(f, r) \\r
- if ((f) != (r)) \\r
- FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** Use VERIFY_NOT for calling methods "f" and expect the result to be anything else but "r".\r
- The call of "f" is not removed in RELEASE builds, only the result verification. eg:\r
- SMTG_VERIFY_NOT (callMethod (), kResultError) */\r
-#define SMTG_VERIFY_NOT(f, r) \\r
- if ((f) == (r)) \\r
- FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f);\r
-\r
-/** @name Shortcut macros for sending strings to the debugger for display.\r
- First parameter is always the format string (printf like).\r
-*/\r
-\r
-///@{\r
-#define DBPRT0(a) FDebugPrint (a);\r
-#define DBPRT1(a, b) FDebugPrint (a, b);\r
-#define DBPRT2(a, b, c) FDebugPrint (a, b, c);\r
-#define DBPRT3(a, b, c, d) FDebugPrint (a, b, c, d);\r
-#define DBPRT4(a, b, c, d, e) FDebugPrint (a, b, c, d, e);\r
-#define DBPRT5(a, b, c, d, e, f) FDebugPrint (a, b, c, d, e, f);\r
-///@}\r
-\r
-/** @name Helper functions for the above defined macros.\r
-\r
- You shouldn't use them directly (if you do so, don't forget "#if DEVELOPMENT")!\r
- It is recommended to use the macros instead.\r
-*/\r
-///@{\r
-void FDebugPrint (const char* format, ...);\r
-void FDebugBreak (const char* format, ...);\r
-void FPrintLastError (const char* file, int line);\r
-///@}\r
-\r
-/** @name Provide a custom assertion handler and debug print handler, eg\r
- so that we can provide an assert with a custom dialog, or redirect\r
- the debug output to a file or stream.\r
-*/\r
-///@{\r
-typedef bool (*AssertionHandler) (const char* message);\r
-extern AssertionHandler gAssertionHandler;\r
-extern AssertionHandler gPreAssertionHook;\r
-typedef void (*DebugPrintLogger) (const char* message);\r
-extern DebugPrintLogger gDebugPrintLogger;\r
-///@}\r
-\r
-/** Definition of memory allocation macros:\r
- Use "NEW" to allocate storage for individual objects.\r
- Use "NEWVEC" to allocate storage for an array of objects. */\r
-#if SMTG_OS_MACOS\r
-void* operator new (size_t, int, const char*, int);\r
-void* operator new[] (size_t, int, const char*, int);\r
-void operator delete (void* p, int, const char* file, int line);\r
-void operator delete[] (void* p, int, const char* file, int line);\r
-#ifndef NEW\r
-#define NEW new (1, __FILE__, __LINE__)\r
-#define NEWVEC new (1, __FILE__, __LINE__)\r
-#endif\r
-\r
-#define DEBUG_NEW DEBUG_NEW_LEAKS\r
-\r
-#elif SMTG_OS_WINDOWS && defined(_MSC_VER)\r
-#ifndef NEW\r
-void* operator new (size_t, int, const char*, int);\r
-#define NEW new (1, __FILE__, __LINE__)\r
-#define NEWVEC new (1, __FILE__, __LINE__)\r
-#endif\r
-\r
-#else\r
-#ifndef NEW\r
-#define NEW new\r
-#define NEWVEC new\r
-#endif\r
-#endif\r
-\r
-#else\r
-/** if DEVELOPMENT is not set, these macros will do nothing. */\r
-#define SMTG_ASSERT(f)\r
-#define SMTG_WARNING(s)\r
-#define SMTG_PRINTSYSERROR\r
-#define SMTG_DEBUGSTR(s)\r
-#define SMTG_VERIFY(f) f;\r
-#define SMTG_VERIFY_IS(f, r) f;\r
-#define SMTG_VERIFY_NOT(f, r) f;\r
-\r
-#define DBPRT0(a)\r
-#define DBPRT1(a, b)\r
-#define DBPRT2(a, b, c)\r
-#define DBPRT3(a, b, c, d)\r
-#define DBPRT4(a, b, c, d, e)\r
-#define DBPRT5(a, b, c, d, e, f)\r
-\r
-#ifndef NEW\r
-#define NEW new\r
-#define NEWVEC new\r
-\r
-#endif\r
-#endif\r
-\r
-#if SMTG_CPPUNIT_TESTING\r
-#define SMTG_IS_TEST true\r
-#else\r
-#define SMTG_IS_TEST false\r
-#endif\r
-\r
-#if !SMTG_RENAME_ASSERT\r
-#if SMTG_OS_WINDOWS\r
-#undef ASSERT\r
-#endif\r
-\r
-#define ASSERT SMTG_ASSERT\r
-#define WARNING SMTG_WARNING\r
-#define DEBUGSTR SMTG_DEBUGSTR\r
-#define VERIFY SMTG_VERIFY\r
-#define VERIFY_IS SMTG_VERIFY_IS\r
-#define VERIFY_NOT SMTG_VERIFY_NOT\r
-#define PRINTSYSERROR SMTG_PRINTSYSERROR\r
-#endif\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fobject.cpp\r
-// Created by : Steinberg, 2008\r
-// Description : Basic Object implementing FUnknown\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/thread/include/flock.h"\r
-\r
-#include <vector>\r
-\r
-namespace Steinberg {\r
-\r
-IUpdateHandler* FObject::gUpdateHandler = 0;\r
-\r
-//------------------------------------------------------------------------\r
-const FUID FObject::iid;\r
-\r
-//------------------------------------------------------------------------\r
-struct FObjectIIDInitializer\r
-{\r
- // the object iid is always generated so that different components\r
- // only can cast to their own objects\r
- // this initializer must be after the definition of FObject::iid, otherwise\r
- // the default constructor of FUID will clear the generated iid\r
- FObjectIIDInitializer ()\r
- {\r
- const_cast<FUID&> (FObject::iid).generate ();\r
- }\r
-} gFObjectIidInitializer;\r
-\r
-//------------------------------------------------------------------------\r
-uint32 PLUGIN_API FObject::addRef ()\r
-{\r
- return FUnknownPrivate::atomicAdd (refCount, 1);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 PLUGIN_API FObject::release ()\r
-{\r
- if (FUnknownPrivate::atomicAdd (refCount, -1) == 0)\r
- {\r
- refCount = -1000;\r
- delete this;\r
- return 0;\r
- }\r
- return refCount;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FObject::queryInterface (const TUID _iid, void** obj)\r
-{\r
- QUERY_INTERFACE (_iid, obj, FUnknown::iid, FUnknown)\r
- QUERY_INTERFACE (_iid, obj, IDependent::iid, IDependent)\r
- QUERY_INTERFACE (_iid, obj, FObject::iid, FObject)\r
- *obj = 0;\r
- return kNoInterface;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::addDependent (IDependent* dep)\r
-{\r
- if (gUpdateHandler)\r
- gUpdateHandler->addDependent (unknownCast (), dep);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::removeDependent (IDependent* dep)\r
-{\r
- if (gUpdateHandler)\r
- gUpdateHandler->removeDependent (unknownCast (), dep);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::changed (int32 msg)\r
-{\r
- if (gUpdateHandler)\r
- gUpdateHandler->triggerUpdates (unknownCast (), msg);\r
- else\r
- updateDone (msg);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FObject::deferUpdate (int32 msg)\r
-{\r
- if (gUpdateHandler)\r
- gUpdateHandler->deferUpdates (unknownCast (), msg);\r
- else\r
- updateDone (msg);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Automatic creation and destruction of singleton instances. */\r
-//------------------------------------------------------------------------\r
-namespace Singleton\r
-{\r
- typedef std::vector<FObject**> ObjectVector;\r
- ObjectVector* singletonInstances = 0;\r
- bool singletonsTerminated = false;\r
- Steinberg::Base::Thread::FLock* singletonsLock;\r
-\r
- bool isTerminated () {return singletonsTerminated;}\r
-\r
- void lockRegister ()\r
- {\r
- if (!singletonsLock) // assume first call not from multiple threads\r
- singletonsLock = NEW Steinberg::Base::Thread::FLock;\r
- singletonsLock->lock ();\r
- }\r
- void unlockRegister ()\r
- {\r
- singletonsLock->unlock ();\r
- }\r
-\r
- void registerInstance (FObject** o)\r
- {\r
- SMTG_ASSERT (singletonsTerminated == false)\r
- if (singletonsTerminated == false)\r
- {\r
- if (singletonInstances == 0)\r
- singletonInstances = NEW std::vector<FObject**>;\r
- singletonInstances->push_back (o);\r
- }\r
- }\r
-\r
- struct Deleter\r
- {\r
- ~Deleter ()\r
- {\r
- singletonsTerminated = true;\r
- if (singletonInstances)\r
- {\r
- for (ObjectVector::iterator it = singletonInstances->begin (),\r
- end = singletonInstances->end ();\r
- it != end; ++it)\r
- {\r
- FObject** obj = (*it);\r
- (*obj)->release ();\r
- *obj = 0;\r
- obj = 0;\r
- }\r
-\r
- delete singletonInstances;\r
- singletonInstances = 0;\r
- }\r
- delete singletonsLock;\r
- singletonsLock = 0;\r
- }\r
- } deleter;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fobject.h\r
-// Created by : Steinberg, 2008\r
-// Description : Basic Object implementing FUnknown\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** @file base/source/fobject.h\r
- Basic Object implementing FUnknown. */\r
-//------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-//#include "base/source/basefwd.h"\r
-#include "base/source/fdebug.h" // NEW\r
-\r
-\r
-namespace Steinberg {\r
-\r
-//----------------------------------\r
-\r
-typedef FIDString FClassID;\r
-\r
-//------------------------------------------------------------------------\r
-// Basic FObject - implements FUnknown + IDependent\r
-//------------------------------------------------------------------------\r
-/** Implements FUnknown and IDependent.\r
-\r
-FObject is a polymorphic class that implements IDependent (of SKI module)\r
-and therefore derived from FUnknown, which is the most abstract base class of all.\r
-\r
-All COM-like virtual methods of FUnknown such as queryInterface(), addRef(), release()\r
-are implemented here. On top of that, dependency-related methods are implemented too.\r
-\r
-Pointer casting is done via the template methods FCast, either FObject to FObject or\r
-FUnknown to FObject.\r
-\r
-FObject supports a new singleton concept, therefore these objects are deleted automatically upon program termination.\r
-\r
-- Runtime type information: An object can be queried at runtime, of what class\r
-it is. To do this correctly, every class must override some methods. This\r
-is simplified by using the OBJ_METHODS macros\r
-\r
-\r
-@see\r
- - FUnknown\r
- - IDependent\r
- - IUpdateHandler\r
-*/\r
-//------------------------------------------------------------------------\r
-class FObject : public IDependent\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- FObject () : refCount (1) {} ///< default constructor...\r
- FObject (const FObject&) : refCount (1) {} ///< overloaded constructor...\r
- virtual ~FObject () {} ///< destructor...\r
- FObject& operator = (const FObject&) { return *this; } ///< overloads operator "=" as the reference assignment\r
-\r
- // OBJECT_METHODS\r
- static inline FClassID getFClassID () {return "FObject";} ///< return Class ID as an ASCII string (statically)\r
- virtual FClassID isA () const {return FObject::getFClassID ();} ///< a local alternative to getFClassID ()\r
- virtual bool isA (FClassID s) const {return isTypeOf (s, false);} ///< evaluates if the passed ID is of the FObject type\r
- virtual bool isTypeOf (FClassID s, bool /*askBaseClass*/ = true) const {return classIDsEqual (s, FObject::getFClassID ());}\r
- ///< evaluates if the passed ID is of the FObject type\r
- int32 getRefCount () {return refCount;} ///< returns the current interface reference count\r
- FUnknown* unknownCast () {return this;} ///< get FUnknown interface from object\r
-\r
- // FUnknown\r
- virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) SMTG_OVERRIDE; ///< please refer to FUnknown::queryInterface ()\r
- virtual uint32 PLUGIN_API addRef () SMTG_OVERRIDE; ///< please refer to FUnknown::addref ()\r
- virtual uint32 PLUGIN_API release () SMTG_OVERRIDE; ///< please refer to FUnknown::release ()\r
-\r
- // IDependent\r
- virtual void PLUGIN_API update (FUnknown* /*changedUnknown*/, int32 /*message*/) SMTG_OVERRIDE {}\r
- ///< empty virtual method that should be overridden by derived classes for data updates upon changes\r
- // IDependency\r
- virtual void addDependent (IDependent* dep); ///< adds dependency to the object\r
- virtual void removeDependent (IDependent* dep); ///< removes dependency from the object\r
- virtual void changed (int32 msg = kChanged); ///< Inform all dependents, that the object has changed.\r
- virtual void deferUpdate (int32 msg = kChanged); ///< Similar to triggerUpdates, except only delivered in idle (usefull in collecting updates).\r
- virtual void updateDone (int32 /* msg */) {} ///< empty virtual method that should be overridden by derived classes\r
- virtual bool isEqualInstance (FUnknown* d) {return this == d;}\r
-\r
- static void setUpdateHandler (IUpdateHandler* handler) {gUpdateHandler = handler;} ///< set method for the local attribute\r
- static IUpdateHandler* getUpdateHandler () {return gUpdateHandler;} ///< get method for the local attribute\r
-\r
- // static helper functions\r
- static inline bool classIDsEqual (FClassID ci1, FClassID ci2); ///< compares (evaluates) 2 class IDs\r
- static inline FObject* unknownToObject (FUnknown* unknown); ///< pointer conversion from FUnknown to FObject\r
-\r
- /** Special UID that is used to cast an FUnknown pointer to a FObject */\r
- static const FUID iid;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- int32 refCount; ///< COM-model local reference count\r
-\r
- static IUpdateHandler* gUpdateHandler;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// conversion from FUnknown to FObject\r
-//------------------------------------------------------------------------\r
-inline FObject* FObject::unknownToObject (FUnknown* unknown)\r
-{\r
- FObject* object = 0;\r
- if (unknown)\r
- {\r
- unknown->queryInterface (FObject::iid, (void**)&object);\r
- if (object)\r
- object->release (); // queryInterface has added ref\r
- }\r
- return object;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool FObject::classIDsEqual (FClassID ci1, FClassID ci2)\r
-{\r
- return (ci1 && ci2) ? (strcmp (ci1, ci2) == 0) : false;\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FCast overload 1 - FObject to FObject */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FCast (const FObject* object)\r
-{\r
- if (object && object->isTypeOf (C::getFClassID (), true))\r
- return (C*) object;\r
- return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FCast overload 2 - FUnknown to FObject */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FCast (FUnknown* unknown)\r
-{\r
- FObject* object = FObject::unknownToObject (unknown);\r
- return FCast<C> (object);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-/** FUCast - casting from FUnknown to Interface */\r
-//-----------------------------------------------------------------------\r
-template <class C>\r
-inline C* FUCast (FObject* object)\r
-{\r
- return FUnknownPtr<C> (object ? object->unknownCast () : 0);\r
-}\r
-\r
-template <class C>\r
-inline C* FUCast (FUnknown* object)\r
-{\r
- return FUnknownPtr<C> (object);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenience methods that call release or delete respectively\r
- on a pointer if it is non-zero, and then set the pointer to zero.\r
- Note: you should prefer using IPtr or OPtr instead of these methods\r
- whenever possible.\r
- <b>Examples:</b>\r
- @code\r
- ~Foo ()\r
- {\r
- // instead of ...\r
- if (somePointer)\r
- {\r
- somePointer->release ();\r
- somePointer = 0;\r
- }\r
- // ... just being lazy I write\r
- SafeRelease (somePointer)\r
- }\r
- @endcode\r
-*/\r
-///@{\r
-//-----------------------------------------------------------------------\r
-template <class I>\r
-inline void SafeRelease (I *& ptr)\r
-{\r
- if (ptr)\r
- {\r
- ptr->release ();\r
- ptr = 0;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class I>\r
-inline void SafeRelease (IPtr<I> & ptr)\r
-{\r
- ptr = 0;\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeDelete (T *& ptr)\r
-{\r
- if (ptr)\r
- {\r
- delete ptr;\r
- ptr = 0;\r
- }\r
-}\r
-///@}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignShared (T*& dest, T* newPtr)\r
-{\r
- if (dest == newPtr)\r
- return;\r
-\r
- if (dest)\r
- dest->release ();\r
- dest = newPtr;\r
- if (dest)\r
- dest->addRef ();\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignSharedDependent (IDependent* _this, T*& dest, T* newPtr)\r
-{\r
- if (dest == newPtr)\r
- return;\r
-\r
- if (dest)\r
- dest->removeDependent (_this);\r
- AssignShared (dest, newPtr);\r
- if (dest)\r
- dest->addDependent (_this);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void AssignSharedDependent (IDependent* _this, IPtr<T>& dest, T* newPtr)\r
-{\r
- if (dest == newPtr)\r
- return;\r
-\r
- if (dest)\r
- dest->removeDependent (_this);\r
- dest = newPtr;\r
- if (dest)\r
- dest->addDependent (_this);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeReleaseDependent (IDependent* _this, T*& dest)\r
-{\r
- if (dest)\r
- dest->removeDependent (_this);\r
- SafeRelease (dest);\r
-}\r
-\r
-//-----------------------------------------------------------------------\r
-template <class T>\r
-inline void SafeReleaseDependent (IDependent* _this, IPtr<T>& dest)\r
-{\r
- if (dest)\r
- dest->removeDependent (_this);\r
- SafeRelease (dest);\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Automatic creation and destruction of singleton instances. */\r
-namespace Singleton {\r
- /** registers an instance (type FObject) */\r
- void registerInstance (FObject** o);\r
-\r
- /** Returns true when singleton instances were already released. */\r
- bool isTerminated ();\r
-\r
- /** lock and unlock the singleton registration for multi-threading safety */\r
- void lockRegister ();\r
- void unlockRegister ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-//-----------------------------------------------------------------------\r
-#define SINGLETON(ClassName) \\r
- static ClassName* instance (bool create = true) \\r
- { \\r
- static Steinberg::FObject* inst = nullptr; \\r
- if (inst == nullptr && create && Steinberg::Singleton::isTerminated () == false) \\r
- { \\r
- Steinberg::Singleton::lockRegister (); \\r
- if (inst == nullptr) \\r
- { \\r
- inst = NEW ClassName; \\r
- Steinberg::Singleton::registerInstance (&inst); \\r
- } \\r
- Steinberg::Singleton::unlockRegister (); \\r
- } \\r
- return (ClassName*)inst; \\r
- }\r
-\r
-//-----------------------------------------------------------------------\r
-#define OBJ_METHODS(className, baseClass) \\r
- static inline Steinberg::FClassID getFClassID () {return (#className);} \\r
- virtual Steinberg::FClassID isA () const SMTG_OVERRIDE {return className::getFClassID ();} \\r
- virtual bool isA (Steinberg::FClassID s) const SMTG_OVERRIDE {return isTypeOf (s, false);} \\r
- virtual bool isTypeOf (Steinberg::FClassID s, bool askBaseClass = true) const SMTG_OVERRIDE \\r
- { return (classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); }\r
-\r
-//------------------------------------------------------------------------\r
-/** Delegate refcount functions to BaseClass.\r
- BaseClase must implement ref counting.\r
-*/\r
-//------------------------------------------------------------------------\r
-#define REFCOUNT_METHODS(BaseClass) \\r
-virtual Steinberg::uint32 PLUGIN_API addRef ()SMTG_OVERRIDE{ return BaseClass::addRef (); } \\r
-virtual Steinberg::uint32 PLUGIN_API release ()SMTG_OVERRIDE{ return BaseClass::release (); }\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Macros to implement FUnknown::queryInterface ().\r
-\r
- <b>Examples:</b>\r
- @code\r
- class Foo : public FObject, public IFoo2, public IFoo3\r
- {\r
- ...\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IFoo2)\r
- DEF_INTERFACE (IFoo3)\r
- END_DEFINE_INTERFACES (FObject)\r
- REFCOUNT_METHODS(FObject)\r
- // Implement IFoo2 interface ...\r
- // Implement IFoo3 interface ...\r
- ...\r
- };\r
- @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-/** Start defining interfaces. */\r
-//------------------------------------------------------------------------\r
-#define DEFINE_INTERFACES \\r
-Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID iid, void** obj) SMTG_OVERRIDE \\r
-{\r
-\r
-//------------------------------------------------------------------------\r
-/** Add a interfaces. */\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACE(InterfaceName) \\r
- QUERY_INTERFACE (iid, obj, InterfaceName::iid, InterfaceName)\r
-\r
-//------------------------------------------------------------------------\r
-/** End defining interfaces. */\r
-//------------------------------------------------------------------------\r
-#define END_DEFINE_INTERFACES(BaseClass) \\r
- return BaseClass::queryInterface (iid, obj); \\r
-}\r
-///@}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenient macros to implement Steinberg::FUnknown::queryInterface ().\r
- <b>Examples:</b>\r
- @code\r
- class Foo : public FObject, public IFoo2, public IFoo3\r
- {\r
- ...\r
- DEF_INTERFACES_2(IFoo2,IFoo3,FObject)\r
- REFCOUNT_METHODS(FObject)\r
- ...\r
- };\r
- @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_1(InterfaceName,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName1) \\r
-DEF_INTERFACE (InterfaceName2) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-DEFINE_INTERFACES \\r
-DEF_INTERFACE (InterfaceName1) \\r
-DEF_INTERFACE (InterfaceName2) \\r
-DEF_INTERFACE (InterfaceName3) \\r
-END_DEFINE_INTERFACES (BaseClass)\r
-\r
-//------------------------------------------------------------------------\r
-#define DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
- DEFINE_INTERFACES \\r
- DEF_INTERFACE (InterfaceName1) \\r
- DEF_INTERFACE (InterfaceName2) \\r
- DEF_INTERFACE (InterfaceName3) \\r
- DEF_INTERFACE (InterfaceName4) \\r
- END_DEFINE_INTERFACES (BaseClass)\r
-///@}\r
-\r
-//------------------------------------------------------------------------\r
-/** @name Convenient macros to implement Steinberg::FUnknown methods.\r
- <b>Examples:</b>\r
- @code\r
- class Foo : public FObject, public IFoo2, public IFoo3\r
- {\r
- ...\r
- FUNKNOWN_METHODS2(IFoo2,IFoo3,FObject)\r
- ...\r
- };\r
- @endcode\r
-*/\r
-///@{\r
-#define FUNKNOWN_METHODS(InterfaceName,BaseClass) \\r
-DEF_INTERFACES_1(InterfaceName,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS2(InterfaceName1,InterfaceName2,BaseClass) \\r
-DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-\r
-#define FUNKNOWN_METHODS4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
-DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \\r
-REFCOUNT_METHODS(BaseClass)\r
-///@}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-//------------------------------------------------------------------------\r
-/** @name Macros to implement IUnknown interfaces with FObject.\r
- <b>Examples:</b>\r
- @code\r
- class MyEnumFormat : public FObject, IEnumFORMATETC\r
- {\r
- ...\r
- COM_UNKNOWN_METHODS (IEnumFORMATETC, IUnknown)\r
- ...\r
- };\r
- @endcode\r
-*/\r
-///@{\r
-//------------------------------------------------------------------------\r
-#define IUNKNOWN_REFCOUNT_METHODS(BaseClass) \\r
-STDMETHOD_ (ULONG, AddRef) (void) {return BaseClass::addRef ();} \\r
-STDMETHOD_ (ULONG, Release) (void) {return BaseClass::release ();}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_QUERY_INTERFACE(iid, obj, InterfaceName) \\r
-if (riid == __uuidof(InterfaceName)) \\r
-{ \\r
- addRef (); \\r
- *obj = (InterfaceName*)this; \\r
- return kResultOk; \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass) \\r
-STDMETHOD (QueryInterface) (REFIID riid, void** object) \\r
-{ \\r
- COM_QUERY_INTERFACE (riid, object, InterfaceName) \\r
- return BaseClass::queryInterface ((FIDString)&riid, object); \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define COM_UNKNOWN_METHODS(InterfaceName,BaseClass) \\r
-COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass) \\r
-IUNKNOWN_REFCOUNT_METHODS(BaseClass)\r
-///@}\r
-\r
-#endif // COM_COMPATIBLE\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fstreamer.cpp\r
-// Created by : Steinberg, 15.12.2005\r
-// Description : Extract of typed stream i/o methods from FStream\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "fstreamer.h"\r
-\r
-#include "base/source/fstring.h"\r
-#include "base/source/fbuffer.h"\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-#ifndef UNICODE\r
-#include "pluginterfaces/base/futils.h"\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-// IBStreamer\r
-//------------------------------------------------------------------------\r
-IBStreamer::IBStreamer (IBStream* stream, int16 _byteOrder)\r
-: FStreamer (_byteOrder)\r
-, stream (stream)\r
-{}\r
-\r
-//------------------------------------------------------------------------\r
-TSize IBStreamer::readRaw (void* buffer, TSize size)\r
-{\r
- int32 numBytesRead = 0;\r
- stream->read (buffer, (int32)size, &numBytesRead);\r
- return numBytesRead;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize IBStreamer::writeRaw (const void* buffer, TSize size)\r
-{\r
- int32 numBytesWritten = 0;\r
- stream->write ((void*)buffer, (int32)size, &numBytesWritten);\r
- return numBytesWritten;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int64 IBStreamer::seek (int64 pos, FSeekMode mode)\r
-{\r
- int64 result = -1;\r
- stream->seek (pos, mode, &result);\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int64 IBStreamer::tell ()\r
-{\r
- int64 pos = 0;\r
- stream->tell (&pos);\r
- return pos;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamSizeHolder Implementation\r
-//------------------------------------------------------------------------\r
-FStreamSizeHolder::FStreamSizeHolder (FStreamer &s)\r
-: stream (s), sizePos (-1)\r
-{}\r
-\r
-//------------------------------------------------------------------------\r
-void FStreamSizeHolder::beginWrite ()\r
-{\r
- sizePos = stream.tell ();\r
- stream.writeInt32 (0L);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamSizeHolder::endWrite ()\r
-{\r
- if (sizePos < 0)\r
- return 0;\r
-\r
- int64 currentPos = stream.tell ();\r
-\r
- stream.seek (sizePos, kSeekSet);\r
- int32 size = int32 (currentPos - sizePos - sizeof (int32));\r
- stream.writeInt32 (size);\r
-\r
- stream.seek (currentPos, kSeekSet);\r
- return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamSizeHolder::beginRead ()\r
-{\r
- sizePos = stream.tell ();\r
- int32 size = 0;\r
- stream.readInt32 (size);\r
- sizePos += size + sizeof (int32);\r
- return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FStreamSizeHolder::endRead ()\r
-{\r
- if (sizePos >= 0)\r
- stream.seek (sizePos, kSeekSet);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamer\r
-//------------------------------------------------------------------------\r
-FStreamer::FStreamer (int16 _byteOrder)\r
-: byteOrder (_byteOrder)\r
-{}\r
-\r
-// int8 / char -----------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeChar8 (char8 c)\r
-{\r
- return writeRaw ((void*)&c, sizeof (char8)) == sizeof (char8);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readChar8 (char8& c)\r
-{\r
- return readRaw ((void*)&c, sizeof (char8)) == sizeof (char8);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeUChar8 (unsigned char c)\r
-{\r
- return writeRaw ((void*)&c, sizeof (unsigned char)) == sizeof (unsigned char);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readUChar8 (unsigned char& c)\r
-{\r
- return readRaw ((void*)&c, sizeof (unsigned char)) == sizeof (unsigned char);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeChar16 (char16 c)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (c);\r
- return writeRaw ((void*)&c, sizeof (char16)) == sizeof (char16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readChar16 (char16& c)\r
-{\r
- if (readRaw ((void*)&c, sizeof (char16)) == sizeof (char16))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (c);\r
- return true;\r
- }\r
- c = 0;\r
- return false;\r
-}\r
-\r
-// int16 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16 (int16 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (i);\r
- return writeRaw ((void*)&i, sizeof (int16)) == sizeof (int16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16 (int16& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (int16)) == sizeof (int16))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16Array (const int16* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt16 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16Array (int16* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt16 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16u (uint16 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (i);\r
- return writeRaw ((void*)&i, sizeof (uint16)) == sizeof (uint16);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16u (uint16& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (uint16)) == sizeof (uint16))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_16 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt16uArray (const uint16* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt16u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt16uArray (uint16* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt16u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-// int32 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32 (int32 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (i);\r
- return writeRaw ((void*)&i, sizeof (int32)) == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32 (int32& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (int32)) == sizeof (int32))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32Array (const int32* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt32 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32Array (int32* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt32 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32u (uint32 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (i);\r
- return writeRaw ((void*)&i, sizeof (uint32)) == sizeof (uint32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32u (uint32& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (uint32)) == sizeof (uint32))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt32uArray (const uint32* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt32u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt32uArray (uint32* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt32u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-// int64 -----------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64 (int64 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (i);\r
- return writeRaw ((void*)&i, sizeof (int64)) == sizeof (int64);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64 (int64& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (int64)) == sizeof (int64))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64Array (const int64* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt64 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64Array (int64* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt64 (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64u (uint64 i)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (i);\r
- return writeRaw ((void*)&i, sizeof (uint64)) == sizeof (uint64);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64u (uint64& i)\r
-{\r
- if (readRaw ((void*)&i, sizeof (uint64)) == sizeof (uint64))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (i);\r
- return true;\r
- }\r
- i = 0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeInt64uArray (const uint64* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeInt64u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readInt64uArray (uint64* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readInt64u (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-// float / double --------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeFloat (float f)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (f);\r
- return writeRaw ((void*)&f, sizeof (float)) == sizeof (float);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readFloat (float& f)\r
-{\r
- if (readRaw ((void*)&f, sizeof (float)) == sizeof (float))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_32 (f);\r
- return true;\r
- }\r
- f = 0.f;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeFloatArray (const float* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeFloat (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readFloatArray (float* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readFloat (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeDouble (double d)\r
-{\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (d);\r
- return writeRaw ((void*)&d, sizeof (double)) == sizeof (double);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readDouble (double& d)\r
-{\r
- if (readRaw ((void*)&d, sizeof (double)) == sizeof (double))\r
- {\r
- if (BYTEORDER != byteOrder)\r
- SWAP_64 (d);\r
- return true;\r
- }\r
- d = 0.0;\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeDoubleArray (const double* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!writeDouble (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readDoubleArray (double* array, int32 count)\r
-{\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- if (!readDouble (array[i]))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::readBool (bool& b)\r
-{\r
- int16 v = 0;\r
- bool res = readInt16 (v);\r
- b = (v != 0);\r
- return res;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeBool (bool b)\r
-{\r
- return writeInt16 ((int16)b);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize FStreamer::writeString8 (const char8* ptr, bool terminate)\r
-{\r
- TSize size = strlen (ptr);\r
- if (terminate) // write \0\r
- size++;\r
-\r
- return writeRaw ((void*)ptr, size);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize FStreamer::readString8 (char8* ptr, TSize size)\r
-{\r
- TSize i = 0;\r
- char8 c = 0;\r
- while (i < size)\r
- {\r
- if (readRaw ((void*)&c, sizeof (char)) != sizeof (char))\r
- break;\r
- ptr[i] = c;\r
- i++;\r
- if (c == '\n' || c == '\0')\r
- break;\r
- }\r
- if (c == '\n' && ptr[i - 2] == '\r')\r
- ptr[i - 2] = 0;\r
- if (i < size)\r
- ptr[i] = 0;\r
- else\r
- ptr[size - 1] = 0;\r
-\r
- return strlen (ptr);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeStringUtf8 (const tchar* ptr)\r
-{\r
- bool isUtf8 = false;\r
-\r
- String str (ptr);\r
- if (str.isAsciiString () == false)\r
- {\r
- str.toMultiByte (kCP_Utf8);\r
- isUtf8 = true;\r
- }\r
- else\r
- {\r
- str.toMultiByte ();\r
- }\r
-\r
- if (isUtf8)\r
- if (writeRaw (kBomUtf8, kBomUtf8Length) != kBomUtf8Length)\r
- return false;\r
-\r
- TSize size = str.length () + 1;\r
- if (writeRaw (str.text8 (), size) != size)\r
- return false;\r
-\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamer::readStringUtf8 (tchar* ptr, int32 nChars)\r
-{\r
- char8 c = 0;\r
-\r
- ptr [0] = 0;\r
-\r
- Buffer tmp;\r
- tmp.setDelta (1024);\r
-\r
- while (true)\r
- {\r
- if (readRaw ((void*)&c, sizeof (char)) != sizeof (char))\r
- break;\r
- tmp.put (c);\r
- if (c == '\0')\r
- break;\r
- }\r
-\r
- char8* source = tmp.int8Ptr ();\r
- uint32 codePage = kCP_Default; // for legacy take default page if no utf8 bom is present...\r
- if (tmp.getFillSize () > 2)\r
- {\r
- if (memcmp (source, kBomUtf8, kBomUtf8Length) == 0)\r
- {\r
- codePage = kCP_Utf8;\r
- source += 3;\r
- }\r
- }\r
-\r
- if (tmp.getFillSize () > 1)\r
- {\r
-#ifdef UNICODE\r
- ConstString::multiByteToWideString (ptr, source, nChars, codePage);\r
-#else\r
- if (codePage == kCP_Utf8)\r
- {\r
- Buffer wideBuffer (tmp.getFillSize () * 3);\r
- ConstString::multiByteToWideString (wideBuffer.wcharPtr (), source, wideBuffer.getSize () / 2, kCP_Utf8);\r
- ConstString::wideStringToMultiByte (ptr, wideBuffer.wcharPtr (), nChars);\r
- }\r
- else\r
- {\r
- memcpy (ptr, source, Min<TSize> (nChars, tmp.getFillSize ()));\r
- }\r
-#endif\r
- }\r
-\r
- ptr[nChars - 1] = 0;\r
- return ConstString (ptr).length ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::writeStr8 (const char8* s)\r
-{\r
- int32 length = (s) ? (int32) strlen (s) + 1 : 0;\r
- if (!writeInt32 (length))\r
- return false;\r
-\r
- if (length > 0)\r
- return writeRaw (s, sizeof (char8) * length) == static_cast<TSize>(sizeof (char8) * length);\r
-\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 FStreamer::getStr8Size (const char8* s)\r
-{\r
- return sizeof (int32) + (int32)strlen (s) + 1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char8* FStreamer::readStr8 ()\r
-{\r
- int32 length;\r
- if (!readInt32 (length))\r
- return 0;\r
-\r
- // check corruption\r
- if (length > 262144)\r
- return 0;\r
-\r
- char8* s = (length > 0) ? NEWVEC char8[length] : 0;\r
- if (s)\r
- readRaw (s, length * sizeof (char8));\r
- return s;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::skip (uint32 bytes)\r
-{\r
- int8 tmp;\r
- while (bytes-- > 0)\r
- {\r
- if (readInt8 (tmp) == false)\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FStreamer::pad (uint32 bytes)\r
-{\r
- while (bytes-- > 0)\r
- {\r
- if (writeInt8 (0) == false)\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fstreamer.h\r
-// Created by : Steinberg, 12/2005\r
-// Description : Extract of typed stream i/o methods from FStream\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-enum FSeekMode\r
-{\r
- kSeekSet,\r
- kSeekCurrent,\r
- kSeekEnd\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// FStreamer\r
-//------------------------------------------------------------------------\r
-/** Byteorder-aware base class for typed stream i/o. */\r
-//------------------------------------------------------------------------\r
-class FStreamer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- FStreamer (int16 byteOrder = BYTEORDER);\r
- virtual ~FStreamer () {}\r
-\r
- /** @name Implementing class must override. */\r
- ///@{\r
- virtual TSize readRaw (void*, TSize) = 0; ///< Read one buffer of size.\r
- virtual TSize writeRaw (const void*, TSize) = 0; ///< Write one buffer of size.\r
- virtual int64 seek (int64, FSeekMode) = 0; ///< Set file position for stream.\r
- virtual int64 tell () = 0; ///< Return current file position.\r
- ///@}\r
-\r
- /** @name Streams are byteOrder aware. */\r
- ///@{\r
- inline void setByteOrder (int32 e) { byteOrder = (int16)e; }\r
- inline int32 getByteOrder () { return byteOrder; }\r
- ///@}\r
-\r
- /** @name read and write int8 and char. */\r
- ///@{\r
- bool writeChar8 (char8);\r
- bool readChar8 (char8&);\r
- bool writeUChar8 (unsigned char);\r
- bool readUChar8 (unsigned char&);\r
- bool writeChar16 (char16 c);\r
- bool readChar16 (char16& c);\r
-\r
- bool writeInt8 (int8 c){return writeChar8 (c);}\r
- bool readInt8 (int8& c){return readChar8 (c);}\r
- bool writeInt8u (uint8 c){return writeUChar8 (c);}\r
- bool readInt8u (uint8& c){return readUChar8 (c);}\r
- ///@}\r
-\r
- /** @name read and write int16. */\r
- ///@{\r
- bool writeInt16 (int16);\r
- bool readInt16 (int16&);\r
- bool writeInt16Array (const int16* array, int32 count);\r
- bool readInt16Array (int16* array, int32 count);\r
- bool writeInt16u (uint16);\r
- bool readInt16u (uint16&);\r
- bool writeInt16uArray (const uint16* array, int32 count);\r
- bool readInt16uArray (uint16* array, int32 count);\r
- ///@}\r
-\r
- /** @name read and write int32. */\r
- ///@{\r
- bool writeInt32 (int32);\r
- bool readInt32 (int32&);\r
- bool writeInt32Array (const int32* array, int32 count);\r
- bool readInt32Array (int32* array, int32 count);\r
- bool writeInt32u (uint32);\r
- bool readInt32u (uint32&);\r
- bool writeInt32uArray (const uint32* array, int32 count);\r
- bool readInt32uArray (uint32* array, int32 count);\r
- ///@}\r
-\r
- /** @name read and write int64. */\r
- ///@{\r
- bool writeInt64 (int64);\r
- bool readInt64 (int64&);\r
- bool writeInt64Array (const int64* array, int32 count);\r
- bool readInt64Array (int64* array, int32 count);\r
- bool writeInt64u (uint64);\r
- bool readInt64u (uint64&);\r
- bool writeInt64uArray (const uint64* array, int32 count);\r
- bool readInt64uArray (uint64* array, int32 count);\r
- ///@}\r
-\r
- /** @name read and write float and float array. */\r
- ///@{\r
- bool writeFloat (float);\r
- bool readFloat (float&);\r
- bool writeFloatArray (const float* array, int32 count);\r
- bool readFloatArray (float* array, int32 count);\r
- ///@}\r
-\r
- /** @name read and write double and double array. */\r
- ///@{\r
- bool writeDouble (double);\r
- bool readDouble (double&);\r
- bool writeDoubleArray (const double* array, int32 count);\r
- bool readDoubleArray (double* array, int32 count);\r
- ///@}\r
-\r
- /** @name read and write Boolean. */\r
- ///@{\r
- bool writeBool (bool); ///< Write one boolean\r
- bool readBool (bool&); ///< Read one bool.\r
- ///@}\r
-\r
- /** @name read and write Strings. */\r
- ///@{\r
- TSize writeString8 (const char8* ptr, bool terminate = false); ///< a direct output function writing only one string (ascii 8bit)\r
- TSize readString8 (char8* ptr, TSize size); ///< a direct input function reading only one string (ascii) (ended by a \n or \0 or eof)\r
-\r
- bool writeStr8 (const char8* ptr); ///< write a string length (strlen) and string itself\r
- char8* readStr8 (); ///< read a string length and string text (The return string must be deleted when use is finished)\r
-\r
- static int32 getStr8Size (const char8* ptr); ///< returns the size of a saved string\r
-\r
- bool writeStringUtf8 (const tchar* ptr); ///< always terminated, converts to utf8 if non ascii characters are in string\r
- int32 readStringUtf8 (tchar* ptr, int32 maxSize); ///< read a UTF8 string\r
- ///@}\r
-\r
- bool skip (uint32 bytes);\r
- bool pad (uint32 bytes);\r
-\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- int16 byteOrder;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** FStreamSizeHolder Declaration\r
- remembers size of stream chunk for backward compatibility.\r
-\r
- <b>Example:</b>\r
- @code\r
- externalize (a)\r
- {\r
- FStreamSizeHolder sizeHolder;\r
- sizeHolder.beginWrite (); // sets start mark, writes dummy size\r
- a << ....\r
- sizeHolder.endWrite (); // jumps to start mark, updates size, jumps back here\r
- }\r
-\r
- internalize (a)\r
- {\r
- FStreamSizeHolder sizeHolder;\r
- sizeHolder.beginRead (); // reads size, mark\r
- a >> ....\r
- sizeHolder.endRead (); // jumps forward if new version has larger size\r
- }\r
- @endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class FStreamSizeHolder\r
-{\r
-public:\r
- FStreamSizeHolder (FStreamer &s);\r
-\r
- void beginWrite (); ///< remembers position and writes 0\r
- int32 endWrite (); ///< writes and returns size (since the start marker)\r
- int32 beginRead (); ///< returns size\r
- void endRead (); ///< jump to end of chunk\r
-\r
-protected:\r
- FStreamer &stream;\r
- int64 sizePos;\r
-};\r
-\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-// IBStreamer\r
-//------------------------------------------------------------------------\r
-/** Wrapper class for typed reading/writing from or to IBStream.\r
- Can be used framework-independent in Plug-ins. */\r
-//------------------------------------------------------------------------\r
-class IBStreamer: public FStreamer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Constructor for a given IBSTream and a byteOrder. */\r
- IBStreamer (IBStream* stream, int16 byteOrder = BYTEORDER);\r
-\r
- IBStream* getStream () { return stream; } ///< Returns the associated IBStream.\r
-\r
- // FStreamer overrides:\r
- TSize readRaw (void*, TSize) SMTG_OVERRIDE; ///< Read one buffer of size.\r
- TSize writeRaw (const void*, TSize) SMTG_OVERRIDE; ///< Write one buffer of size.\r
- int64 seek (int64, FSeekMode) SMTG_OVERRIDE; ///< Set file position for stream.\r
- int64 tell () SMTG_OVERRIDE; ///< Return current file position.\r
-//------------------------------------------------------------------------\r
-protected:\r
- IBStream* stream;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fstring.cpp\r
-// Created by : Steinberg, 2008\r
-// Description : String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/fstring.h"\r
-#include "base/source/fdebug.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include "pluginterfaces/base/fvariant.h"\r
-\r
-#include <cstdlib>\r
-#include <ctype.h>\r
-#include <cstdio>\r
-#include <stdarg.h>\r
-#include <utility>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <windows.h>\r
-#pragma warning (disable : 4244)\r
-#pragma warning (disable : 4267)\r
-#pragma warning (disable : 4996)\r
-\r
-#if DEVELOPMENT\r
-#include <crtdbg.h>\r
-\r
-#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)\r
-#define realloc(p,s) _realloc_dbg(p,s, _NORMAL_BLOCK, __FILE__, __LINE__)\r
-#define free(p) _free_dbg(p, _NORMAL_BLOCK)\r
-\r
-#endif\r
-\r
-#endif\r
-\r
-#ifndef kPrintfBufferSize\r
-#define kPrintfBufferSize 4096\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-#include <CoreFoundation/CFString.h>\r
-#include <CoreFoundation/CFStringEncodingExt.h>\r
-#include <wchar.h>\r
-\r
-#if defined (__GNUC__) && (__GNUC__ >= 4) && !__LP64__\r
-// on 32 bit Mac OS X we can safely ignore the format warnings as sizeof(int) == sizeof(long)\r
-#pragma GCC diagnostic ignored "-Wformat"\r
-#endif\r
-\r
-#define SMTG_ENABLE_DEBUG_CFALLOCATOR 0\r
-#define SMTG_DEBUG_CFALLOCATOR (DEVELOPMENT && SMTG_ENABLE_DEBUG_CFALLOCATOR)\r
-\r
-#if SMTG_DEBUG_CFALLOCATOR\r
-#include <libkern/OSAtomic.h>\r
-#include <dlfcn.h>\r
-#endif\r
-\r
-namespace Steinberg {\r
-#if SMTG_DEBUG_CFALLOCATOR\r
-static CFAllocatorRef kCFAllocator = NULL;\r
-\r
-struct CFStringDebugAllocator : CFAllocatorContext\r
-{\r
- CFStringDebugAllocator ()\r
- {\r
- version = 0;\r
- info = this;\r
- retain = nullptr;\r
- release = nullptr;\r
- copyDescription = nullptr;\r
- allocate = allocateCallBack;\r
- reallocate = reallocateCallBack;\r
- deallocate = deallocateCallBack;\r
- preferredSize = preferredSizeCallBack;\r
-\r
- numAllocations = allocationSize = numDeallocations = 0;\r
- cfAllocator = CFAllocatorCreate (kCFAllocatorUseContext, this);\r
-\r
- Dl_info info;\r
- if (dladdr ((const void*)CFStringDebugAllocator::allocateCallBack, &info))\r
- {\r
- moduleName = info.dli_fname;\r
- }\r
- kCFAllocator = cfAllocator;\r
- }\r
-\r
- ~CFStringDebugAllocator ()\r
- {\r
- kCFAllocator = kCFAllocatorDefault;\r
- CFRelease (cfAllocator);\r
- FDebugPrint ("CFStringDebugAllocator (%s):\n", moduleName.text8 ());\r
- FDebugPrint ("\tNumber of allocations : %u\n", numAllocations);\r
- FDebugPrint ("\tNumber of deallocations: %u\n", numDeallocations);\r
- FDebugPrint ("\tAllocated Bytes : %u\n", allocationSize);\r
- }\r
-\r
- String moduleName;\r
- CFAllocatorRef cfAllocator;\r
- volatile int64_t numAllocations;\r
- volatile int64_t numDeallocations;\r
- volatile int64_t allocationSize;\r
-\r
- void* doAllocate (CFIndex allocSize, CFOptionFlags hint)\r
- {\r
- void* ptr = CFAllocatorAllocate (kCFAllocatorDefault, allocSize, hint);\r
- OSAtomicIncrement64 (&numAllocations);\r
- OSAtomicAdd64 (allocSize, &allocationSize);\r
- return ptr;\r
- }\r
- void* doReallocate (void* ptr, CFIndex newsize, CFOptionFlags hint)\r
- {\r
- void* newPtr = CFAllocatorReallocate (kCFAllocatorDefault, ptr, newsize, hint);\r
- return newPtr;\r
- }\r
- void doDeallocate (void* ptr)\r
- {\r
- CFAllocatorDeallocate (kCFAllocatorDefault, ptr);\r
- OSAtomicIncrement64 (&numDeallocations);\r
- }\r
- CFIndex getPreferredSize (CFIndex size, CFOptionFlags hint)\r
- {\r
- return CFAllocatorGetPreferredSizeForSize (kCFAllocatorDefault, size, hint);\r
- }\r
-\r
- static void* allocateCallBack (CFIndex allocSize, CFOptionFlags hint, void* info)\r
- {\r
- return static_cast<CFStringDebugAllocator*> (info)->doAllocate (allocSize, hint);\r
- }\r
- static void* reallocateCallBack (void* ptr, CFIndex newsize, CFOptionFlags hint, void* info)\r
- {\r
- return static_cast<CFStringDebugAllocator*> (info)->doReallocate (ptr, newsize, hint);\r
- }\r
-\r
- static void deallocateCallBack (void* ptr, void* info)\r
- {\r
- static_cast<CFStringDebugAllocator*> (info)->doDeallocate (ptr);\r
- }\r
- static CFIndex preferredSizeCallBack (CFIndex size, CFOptionFlags hint, void* info)\r
- {\r
- return static_cast<CFStringDebugAllocator*> (info)->getPreferredSize (size, hint);\r
- }\r
-};\r
-static CFStringDebugAllocator gDebugAllocator;\r
-#else\r
-\r
-static const CFAllocatorRef kCFAllocator = ::kCFAllocatorDefault;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static void* toCFStringRef (const Steinberg::char8* source, Steinberg::uint32 encoding)\r
-{\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingASCII;\r
- if (source)\r
- return (void*)CFStringCreateWithCString (Steinberg::kCFAllocator, source, encoding);\r
- else\r
- return (void*)CFStringCreateWithCString (Steinberg::kCFAllocator, "", encoding);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static bool fromCFStringRef (Steinberg::char8* dest, Steinberg::int32 destSize, const void* cfStr, Steinberg::uint32 encoding)\r
-{\r
- CFIndex usedBytes;\r
- CFRange range = {0, CFStringGetLength ((CFStringRef)cfStr)};\r
- bool result = CFStringGetBytes ((CFStringRef)cfStr, range, encoding, '?', false, (UInt8*)dest, destSize, &usedBytes);\r
- dest[usedBytes] = 0;\r
- return result;\r
-}\r
-#endif // SMTG_OS_MACOS\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define stricmp16 wcsicmp\r
-#define strnicmp16 wcsnicmp\r
-#define strrchr16 wcsrchr\r
-#define sprintf16 swprintf\r
-#define snprintf16 snwprintf\r
-#define vsnprintf16 vsnwprintf\r
-#define vsprintf16 wvsprintf\r
-#define vfprintf16 vfwprintf\r
-#define sscanf16 swscanf\r
-#define toupper16 towupper\r
-#define tolower16 towlower\r
-#define isupper16 iswupper\r
-#define islower16 iswlower\r
-#define isspace16 iswspace\r
-#define isalpha16 iswalpha\r
-#define isdigit16 iswdigit\r
-#define isalnum16 iswalnum\r
-\r
-#define stricmp _stricmp\r
-#define strnicmp _strnicmp\r
-#define snprintf _snprintf\r
-#define vsnprintf _vsnprintf\r
-#define snwprintf _snwprintf\r
-#define vsnwprintf _vsnwprintf\r
-\r
-#define wtoi _wtoi\r
-#define wtol _wtol\r
-#define wtof _wtof\r
-\r
-#elif SMTG_OS_LINUX\r
-#include <codecvt>\r
-#include <locale>\r
-#include <cstring>\r
-#include <string>\r
-#include <limits>\r
-#include <cassert>\r
-#include <wchar.h>\r
-\r
-using ConverterFacet = std::codecvt_utf8_utf16<char16_t>;\r
-using Converter = std::wstring_convert<ConverterFacet, char16_t>;\r
-\r
-//------------------------------------------------------------------------\r
-static ConverterFacet& converterFacet ()\r
-{\r
- static ConverterFacet gFacet;\r
- return gFacet;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static Converter& converter ()\r
-{\r
- static Converter gConverter;\r
- return gConverter;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int stricasecmp (const Steinberg::char8* s1, const Steinberg::char8* s2)\r
-{\r
- return ::strcasecmp (s1, s2);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int strnicasecmp (const Steinberg::char8* s1, const Steinberg::char8* s2, size_t n)\r
-{\r
- return ::strncasecmp (s1, s2, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int stricmp16 (const Steinberg::char16* s1, const Steinberg::char16* s2)\r
-{\r
- auto str1 = converter ().to_bytes (s1);\r
- auto str2 = converter ().to_bytes (s2);\r
- return stricasecmp (str1.data (), str2.data ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int strnicmp16 (const Steinberg::char16* s1, const Steinberg::char16* s2, int n)\r
-{\r
- auto str1 = converter ().to_bytes (s1);\r
- auto str2 = converter ().to_bytes (s2);\r
- return strnicasecmp (str1.data (), str2.data (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int sprintf16 (Steinberg::char16* wcs, const Steinberg::char16* format, ...)\r
-{\r
-#warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline int vsnwprintf (Steinberg::char16* wcs, size_t maxlen,\r
- const Steinberg::char16* format, va_list args)\r
-{\r
- Steinberg::char8 str8[kPrintfBufferSize];\r
- auto format_utf8 = converter ().to_bytes(format);\r
- auto len = vsnprintf (str8, kPrintfBufferSize, format_utf8.data (), args);\r
-\r
- auto tmp_str = converter ().from_bytes (str8, str8 + len);\r
- auto target_len = std::min (tmp_str.size (), maxlen - 1);\r
- tmp_str.copy (wcs, target_len);\r
- wcs[target_len] = '\0';\r
-\r
- return tmp_str.size ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::char16* strrchr16 (const Steinberg::char16* str, Steinberg::char16 c)\r
-{\r
-#warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- return nullptr;\r
-}\r
-\r
-#elif SMTG_OS_MACOS\r
-#define tstrtoi64 strtoll\r
-#define stricmp strcasecmp\r
-#define strnicmp strncasecmp\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 strnicmp16 (const Steinberg::char16* str1, const Steinberg::char16* str2, size_t size)\r
-{\r
- if (size == 0)\r
- return 0;\r
-\r
- CFIndex str1Len = Steinberg::strlen16 (str1);\r
- CFIndex str2Len = Steinberg::strlen16 (str2);\r
- if (size < str2Len) // range is not applied to second string\r
- str2Len = size;\r
- CFStringRef cfStr1 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str1, str1Len, kCFAllocatorNull);\r
- CFStringRef cfStr2 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str2, str2Len, kCFAllocatorNull);\r
- CFComparisonResult result = CFStringCompareWithOptions (cfStr1, cfStr2, CFRangeMake (0, size), kCFCompareCaseInsensitive);\r
- CFRelease (cfStr1);\r
- CFRelease (cfStr2);\r
- switch (result)\r
- {\r
- case kCFCompareEqualTo: return 0;\r
- case kCFCompareLessThan: return -1;\r
- case kCFCompareGreaterThan:\r
- default: return 1;\r
- };\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::char16* str1, CFIndex str1Len, const Steinberg::char16* str2, CFIndex str2Len)\r
-{\r
- CFStringRef cfStr1 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str1, str1Len, kCFAllocatorNull);\r
- CFStringRef cfStr2 = CFStringCreateWithCharactersNoCopy (Steinberg::kCFAllocator, (UniChar*)str2, str2Len, kCFAllocatorNull);\r
- CFComparisonResult result = CFStringCompare (cfStr1, cfStr2, kCFCompareCaseInsensitive);\r
- CFRelease (cfStr1);\r
- CFRelease (cfStr2);\r
- switch (result)\r
- {\r
- case kCFCompareEqualTo: return 0;\r
- case kCFCompareLessThan: return -1;\r
- case kCFCompareGreaterThan:\r
- default: return 1;\r
- };\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::ConstString& str1, const Steinberg::ConstString& str2)\r
-{\r
- return stricmp16 (str1.text16 (), str1.length (), str2.text16 (), str2.length ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 stricmp16 (const Steinberg::char16* str1, const Steinberg::char16* str2)\r
-{\r
- CFIndex str1Len = Steinberg::strlen16 (str1);\r
- CFIndex str2Len = Steinberg::strlen16 (str2);\r
- return stricmp16 (str1, str1Len, str2, str2Len);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::char16* strrchr16 (const Steinberg::char16* str, Steinberg::char16 c)\r
-{\r
- Steinberg::int32 len = Steinberg::ConstString (str).length ();\r
- while (len > 0)\r
- {\r
- if (str[len] == c)\r
- return const_cast<Steinberg::char16*>(str + len);\r
- len--;\r
- }\r
- return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 vsnwprintf (Steinberg::char16* str, Steinberg::int32 size, const Steinberg::char16* format, va_list ap)\r
-{\r
- // wrapped using CoreFoundation's CFString\r
- CFMutableStringRef formatString = (CFMutableStringRef)Steinberg::ConstString (format).toCFStringRef (0xFFFF, true);\r
- CFStringFindAndReplace (formatString, CFSTR("%s"), CFSTR("%S"), CFRangeMake (0, CFStringGetLength (formatString)), 0);\r
- CFStringRef resultString = CFStringCreateWithFormatAndArguments (Steinberg::kCFAllocator, 0, formatString, ap);\r
- CFRelease (formatString);\r
- if (resultString)\r
- {\r
- Steinberg::String res;\r
- res.fromCFStringRef (resultString);\r
- res.copyTo16 (str, 0, size);\r
- CFRelease (resultString);\r
- return 0;\r
- }\r
- return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline Steinberg::int32 sprintf16 (Steinberg::char16* str, const Steinberg::char16* format, ...)\r
-{\r
- va_list marker;\r
- va_start (marker, format);\r
- return vsnwprintf (str, -1, format, marker);\r
-}\r
-\r
-#endif\r
-\r
-/*\r
-UTF-8 EF BB BF\r
-UTF-16 Big Endian FE FF\r
-UTF-16 Little Endian FF FE\r
-UTF-32 Big Endian 00 00 FE FF\r
-UTF-32 Little Endian FF FE 00 00\r
-*/\r
-\r
-namespace Steinberg {\r
-\r
-//-----------------------------------------------------------------------------\r
-static inline bool isCaseSensitive (ConstString::CompareMode mode)\r
-{\r
- return mode == ConstString::kCaseSensitive;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-// ConstString\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const char8* str, int32 length)\r
-: buffer8 ((char8*)str)\r
-, len (length < 0 ? (str ? static_cast<uint32> (strlen (str)) : 0) : length)\r
-, isWide (0)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const char16* str, int32 length)\r
-: buffer16 ((char16*)str)\r
-, len (length < 0 ? (str ? strlen16 (str) : 0) : length)\r
-, isWide (1)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const ConstString& str, int32 offset, int32 length)\r
-: buffer (str.buffer)\r
-, len (length < 0 ? (str.len - (offset > 0 ? offset : 0)) : length)\r
-, isWide (str.isWide)\r
-{\r
- if (offset > 0)\r
- {\r
- if (isWide)\r
- buffer16 += offset;\r
- else\r
- buffer8 += offset;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString (const FVariant& var)\r
-: buffer (0)\r
-, len (0)\r
-, isWide (0)\r
-{\r
- switch (var.getType ())\r
- {\r
- case FVariant::kString8:\r
- buffer8 = (char8*)var.getString8 ();\r
- len = buffer8 ? strlen8 (buffer8) : 0;\r
- isWide = false;\r
- break;\r
-\r
- case FVariant::kString16:\r
- buffer16 = (char16*)var.getString16 ();\r
- len = buffer16 ? strlen16 (buffer16) : 0;\r
- isWide = true;\r
- break;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-ConstString::ConstString ()\r
-: buffer (0)\r
-, len (0)\r
-, isWide (0)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::testChar8 (uint32 index, char8 c) const\r
-{\r
- if (index >= len)\r
- return c == 0;\r
- if (isWide)\r
- {\r
- // make c wide\r
- char8 src[] = {c, 0};\r
- char16 dest[2] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- return buffer16[index] == dest[0];\r
- return false;\r
- }\r
- return buffer8[index] == c;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::testChar16 (uint32 index, char16 c) const\r
-{\r
- if (index >= len)\r
- return c == 0;\r
- if (!isWide)\r
- {\r
- // make c ansi\r
- char16 src[] = {c, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- return buffer8[index] == dest[0];\r
- return false;\r
- }\r
- return buffer16[index] == c;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::extract (String& result, uint32 idx, int32 n) const\r
-{\r
- if (len == 0|| idx >= len)\r
- return false;\r
-\r
- if ((idx + n > len) || n < 0)\r
- n = len - idx;\r
-\r
- if (isWide)\r
- result.assign (buffer16 + idx, n);\r
- else\r
- result.assign (buffer8 + idx, n);\r
-\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo8 (char8* str, uint32 idx, int32 n) const\r
-{\r
- if (!str)\r
- return 0;\r
-\r
- if (isWide)\r
- {\r
- String tmp (text16 ());\r
- if (tmp.toMultiByte () == false)\r
- return 0;\r
- return tmp.copyTo8 (str, idx, n);\r
- }\r
-\r
- if (isEmpty () || idx >= len || !buffer8)\r
- {\r
- str[0] = 0;\r
- return 0;\r
- }\r
-\r
- if ((idx + n > len) || n < 0)\r
- n = len - idx;\r
-\r
- memcpy (str, &(buffer8[idx]), n * sizeof (char8));\r
- str[n] = 0;\r
- return n;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo16 (char16* str, uint32 idx, int32 n) const\r
-{\r
- if (!str)\r
- return 0;\r
-\r
- if (!isWide)\r
- {\r
- String tmp (text8 ());\r
- if (tmp.toWideString () == false)\r
- return 0;\r
- return tmp.copyTo16 (str, idx, n);\r
- }\r
-\r
- if (isEmpty () || idx >= len || !buffer16)\r
- {\r
- str[0] = 0;\r
- return 0;\r
- }\r
-\r
- if ((idx + n > len) || n < 0)\r
- n = len - idx;\r
-\r
- memcpy (str, &(buffer16[idx]), n * sizeof (char16));\r
- str[n] = 0;\r
- return n;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::copyTo (tchar* str, uint32 idx, int32 n) const\r
-{\r
-#ifdef UNICODE\r
- return copyTo16 (str, idx, n);\r
-#else\r
- return copyTo8 (str, idx, n);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::copyTo (IStringResult* result) const\r
-{\r
- if (isWideString () == false)\r
- {\r
- result->setText (text8 ());\r
- }\r
- else\r
- {\r
- FUnknownPtr<IString> iStr (result);\r
- if (iStr)\r
- {\r
- iStr->setText16 (text16 ());\r
- }\r
- else\r
- {\r
- String tmp (*this);\r
- tmp.toMultiByte ();\r
- result->setText (tmp.text8 ());\r
- }\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::copyTo (IString& string) const\r
-{\r
- if (isWideString ())\r
- string.setText16 (text16 ());\r
- else\r
- string.setText8 (text8 ());\r
-}\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compare (const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
- if (n == 0)\r
- return 0;\r
-\r
- if (str.isEmpty ())\r
- {\r
- if (isEmpty ())\r
- return 0;\r
- return 1;\r
- }\r
- else if (isEmpty ())\r
- return -1;\r
-\r
- if (!isWide && !str.isWide)\r
- {\r
- if (n < 0)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strcmp (*this, str);\r
- else\r
- return stricmp (*this, str);\r
- }\r
- else\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp (*this, str, n);\r
- else\r
- return strnicmp (*this, str, n);\r
- }\r
- }\r
- else if (isWide && str.isWide)\r
- {\r
- if (n < 0)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strcmp16 (*this, str);\r
- else\r
- return stricmp16 (*this, str);\r
- }\r
- else\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (*this, str, n);\r
- else\r
- return strnicmp16 (*this, str, n);\r
- }\r
- }\r
- return compareAt (0, str, n, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compare (const ConstString& str, CompareMode mode) const\r
-{\r
- return compare (str, -1, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::compareAt (uint32 index, const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
- if (n == 0)\r
- return 0;\r
-\r
- if (str.isEmpty ())\r
- {\r
- if (isEmpty ())\r
- return 0;\r
- return 1;\r
- }\r
- else if (isEmpty ())\r
- return -1;\r
-\r
- if (!isWide && !str.isWide)\r
- {\r
- char8* toCompare = buffer8;\r
- if (index > 0)\r
- {\r
- if (index >= len)\r
- {\r
- if (str.isEmpty ())\r
- return 0;\r
- return -1;\r
- }\r
- toCompare += index;\r
- }\r
-\r
- if (n < 0)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strcmp (toCompare, str);\r
- else\r
- return stricmp (toCompare, str);\r
- }\r
- else\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp (toCompare, str, n);\r
- else\r
- return strnicmp (toCompare, str, n);\r
- }\r
- }\r
- else if (isWide && str.isWide)\r
- {\r
- char16* toCompare = buffer16;\r
- if (index > 0)\r
- {\r
- if (index >= len)\r
- {\r
- if (str.isEmpty ())\r
- return 0;\r
- return -1;\r
- }\r
- toCompare += index;\r
- }\r
-\r
- if (n < 0)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strcmp16 (toCompare, str.text16 ());\r
- else\r
- return stricmp16 (toCompare, str.text16 ());\r
- }\r
- else\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (toCompare, str.text16 (), n);\r
- else\r
- return strnicmp16 (toCompare, str.text16 (), n);\r
- }\r
- }\r
- else\r
- {\r
- if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- if (tmp.toWideString () == false)\r
- return -1;\r
- return compareAt (index, tmp, n, mode);\r
- }\r
- else\r
- {\r
- String tmp (text8 ());\r
- if (tmp.toWideString () == false)\r
- return 1;\r
- return tmp.compareAt (index, str, n, mode);\r
- }\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Steinberg::int32 ConstString::naturalCompare (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
- if (str.isEmpty ())\r
- {\r
- if (isEmpty ())\r
- return 0;\r
- return 1;\r
- }\r
- else if (isEmpty ())\r
- return -1;\r
-\r
- if (!isWide && !str.isWide)\r
- return strnatcmp8 (buffer8, str.text8 (), isCaseSensitive (mode));\r
- else if (isWide && str.isWide)\r
- return strnatcmp16 (buffer16, str.text16 (), isCaseSensitive (mode));\r
- else\r
- {\r
- if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- tmp.toWideString ();\r
- return strnatcmp16 (buffer16, tmp.text16 (), isCaseSensitive (mode));\r
- }\r
- else\r
- {\r
- String tmp (text8 ());\r
- tmp.toWideString ();\r
- return strnatcmp16 (tmp.text16 (), str.text16 (), isCaseSensitive (mode));\r
- }\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::startsWith (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
- if (str.isEmpty ())\r
- {\r
- return isEmpty ();\r
- }\r
- else if (isEmpty ())\r
- {\r
- return false;\r
- }\r
- if (length () < str.length ())\r
- {\r
- return false;\r
- }\r
- if (!isWide && !str.isWide)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp (buffer8, str.buffer8, str.length ()) == 0;\r
- return strnicmp (buffer8, str.buffer8, str.length ()) == 0;\r
- }\r
- else if (isWide && str.isWide)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (buffer16, str.buffer16, str.length ()) == 0;\r
- return strnicmp16 (buffer16, str.buffer16, str.length ()) == 0;\r
- }\r
- else if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- tmp.toWideString ();\r
- if (tmp.length () > length ())\r
- return false;\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0;\r
- return strnicmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0;\r
- }\r
- else\r
- {\r
- String tmp (text8 ());\r
- tmp.toWideString ();\r
- if (str.length () > tmp.length ())\r
- return false;\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0;\r
- return strnicmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::endsWith (const ConstString& str, CompareMode mode /*= kCaseSensitive*/) const\r
-{\r
- if (str.isEmpty ())\r
- {\r
- return isEmpty ();\r
- }\r
- else if (isEmpty ())\r
- {\r
- return false;\r
- }\r
- if (length () < str.length ())\r
- {\r
- return false;\r
- }\r
- if (!isWide && !str.isWide)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0;\r
- return strnicmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0;\r
- }\r
- else if (isWide && str.isWide)\r
- {\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0;\r
- return strnicmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0;\r
- }\r
- else if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- tmp.toWideString ();\r
- if (tmp.length () > length ())\r
- return false;\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0;\r
- return strnicmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0;\r
- }\r
- else\r
- {\r
- String tmp (text8 ());\r
- tmp.toWideString ();\r
- if (str.length () > tmp.length ())\r
- return false;\r
- if (isCaseSensitive (mode))\r
- return strncmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0;\r
- return strnicmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::contains (const ConstString& str, CompareMode m) const\r
-{\r
- return findFirst (str, -1, m) != -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, const ConstString& str, int32 n, CompareMode mode, int32 endIndex) const\r
-{\r
- uint32 endLength = len;\r
- if (endIndex > -1 && (uint32)endIndex < len)\r
- endLength = endIndex + 1;\r
-\r
- if (isWide && str.isWide)\r
- {\r
- if (startIndex < 0)\r
- startIndex = 0;\r
-\r
- uint32 stringLength = str.length ();\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (n > 0)\r
- {\r
- uint32 i = 0;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- if (strncmp16 (buffer16 + i, str, n) == 0)\r
- return i;\r
- }\r
- else\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- if (strnicmp16 (buffer16 + i, str, n) == 0)\r
- return i;\r
- }\r
- }\r
- return -1;\r
- }\r
- else if (!isWide && !str.isWide)\r
- {\r
- uint32 stringLength = str.length ();\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (startIndex < 0)\r
- startIndex = 0;\r
-\r
- if (n > 0)\r
- {\r
- uint32 i = 0;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- if (strncmp (buffer8 + i, str, n) == 0)\r
- return i;\r
- }\r
- else\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- if (strnicmp (buffer8 + i, str, n) == 0)\r
- return i;\r
- }\r
- }\r
- return -1;\r
- }\r
- String tmp;\r
- if (isWide)\r
- {\r
- tmp = str.text8 ();\r
- tmp.toWideString ();\r
- return findNext (startIndex, tmp, n , mode, endIndex);\r
- }\r
- tmp = text8 ();\r
- tmp.toWideString ();\r
- return tmp.findNext (startIndex, str, n, mode, endIndex);\r
-}\r
-\r
-//------------------------------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, char8 c, CompareMode mode, int32 endIndex) const\r
-{\r
- uint32 endLength = len;\r
- if (endIndex > -1 && (uint32)endIndex < len)\r
- endLength = endIndex + 1;\r
-\r
- if (isWide)\r
- {\r
- char8 src[] = {c, 0};\r
- char16 dest[8] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- return findNext (startIndex, dest[0], mode, endIndex);\r
- return -1;\r
- }\r
-\r
- if (startIndex < 0)\r
- startIndex = 0;\r
- uint32 i;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- {\r
- if (buffer8[i] == c)\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- c = toLower (c);\r
- for (i = startIndex; i < endLength; i++)\r
- {\r
- if (toLower (buffer8[i]) == c)\r
- return i;\r
- }\r
- }\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findNext (int32 startIndex, char16 c, CompareMode mode, int32 endIndex) const\r
-{\r
- uint32 endLength = len;\r
- if (endIndex > -1 && (uint32)endIndex < len)\r
- endLength = endIndex + 1;\r
-\r
- if (!isWide)\r
- {\r
- char16 src[] = {c, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- return findNext (startIndex, dest[0], mode, endIndex);\r
-\r
- return -1;\r
- }\r
-\r
- uint32 i;\r
- if (startIndex < 0)\r
- startIndex = 0;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i < endLength; i++)\r
- {\r
- if (buffer16[i] == c)\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- c = toLower (c);\r
- for (i = startIndex; i < endLength; i++)\r
- {\r
- if (toLower (buffer16[i]) == c)\r
- return i;\r
- }\r
- }\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, char8 c, CompareMode mode) const\r
-{\r
- if (len == 0)\r
- return -1;\r
-\r
- if (isWide)\r
- {\r
- char8 src[] = {c, 0};\r
- char16 dest[8] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- return findPrev (startIndex, dest[0], mode);\r
- return -1;\r
- }\r
-\r
- if (startIndex < 0 || startIndex > (int32)len)\r
- startIndex = len;\r
-\r
- int32 i;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- {\r
- if (buffer8[i] == c)\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- c = toLower (c);\r
- for (i = startIndex; i >= 0; i--)\r
- {\r
- if (toLower (buffer8[i]) == c)\r
- return i;\r
- }\r
- }\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, char16 c, CompareMode mode) const\r
-{\r
- if (len == 0)\r
- return -1;\r
-\r
- if (!isWide)\r
- {\r
- char16 src[] = {c, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- return findPrev (startIndex, dest[0], mode);\r
-\r
- return -1;\r
- }\r
-\r
- if (startIndex < 0 || startIndex > (int32)len)\r
- startIndex = len;\r
-\r
- int32 i;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- {\r
- if (buffer16[i] == c)\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- c = toLower (c);\r
- for (i = startIndex; i >= 0; i--)\r
- {\r
- if (toLower (buffer16[i]) == c)\r
- return i;\r
- }\r
- }\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::findPrev (int32 startIndex, const ConstString& str, int32 n, CompareMode mode) const\r
-{\r
- if (isWide && str.isWide)\r
- {\r
- uint32 stringLength = str.length ();\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (startIndex < 0 || startIndex >= (int32)len)\r
- startIndex = len - 1;\r
-\r
- if (n > 0)\r
- {\r
- int32 i = 0;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- if (strncmp16 (buffer16 + i, str, n) == 0)\r
- return i;\r
- }\r
- else\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- if (strnicmp16 (buffer16 + i, str, n) == 0)\r
- return i;\r
- }\r
- }\r
- return -1;\r
- }\r
- else if (!isWide && !str.isWide)\r
- {\r
- uint32 stringLength = str.length ();\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (startIndex < 0 || startIndex >= (int32)len)\r
- startIndex = len - 1;\r
-\r
- if (n > 0)\r
- {\r
- int32 i = 0;\r
-\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- if (strncmp (buffer8 + i, str, n) == 0)\r
- return i;\r
- }\r
- else\r
- {\r
- for (i = startIndex; i >= 0; i--)\r
- if (strnicmp (buffer8 + i, str, n) == 0)\r
- return i;\r
- }\r
- }\r
- return -1;\r
- }\r
- if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- tmp.toWideString ();\r
- return findPrev (startIndex, tmp, n, mode);\r
- }\r
- String tmp (text8 ());\r
- tmp.toWideString ();\r
- return tmp.findPrev (startIndex, str, n, mode);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::countOccurences (char8 c, uint32 startIndex, CompareMode mode) const\r
-{\r
- if (isWide)\r
- {\r
- char8 src[] = {c, 0};\r
- char16 dest[8] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- return countOccurences (dest[0], startIndex, mode);\r
- return -1;\r
- }\r
-\r
- int32 result = 0;\r
- int32 next = startIndex;\r
- while (true)\r
- {\r
- next = findNext (next, c, mode);\r
- if (next >= 0)\r
- {\r
- next++;\r
- result++;\r
- }\r
- else\r
- break;\r
- }\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::countOccurences (char16 c, uint32 startIndex, CompareMode mode) const\r
-{\r
- if (!isWide)\r
- {\r
- char16 src[] = {c, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- return countOccurences (dest[0], startIndex, mode);\r
-\r
- return -1;\r
- }\r
- int32 result = 0;\r
- int32 next = startIndex;\r
- while (true)\r
- {\r
- next = findNext (next, c, mode);\r
- if (next >= 0)\r
- {\r
- next++;\r
- result++;\r
- }\r
- else\r
- break;\r
- }\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::getFirstDifferent (const ConstString& str, CompareMode mode) const\r
-{\r
- if (str.isWide != isWide)\r
- {\r
- if (isWide)\r
- {\r
- String tmp (str.text8 ());\r
- if (tmp.toWideString () == false)\r
- return -1;\r
- return getFirstDifferent (tmp, mode);\r
- }\r
- else\r
- {\r
- String tmp (text8 ());\r
- if (tmp.toWideString () == false)\r
- return -1;\r
- return tmp.getFirstDifferent (str, mode);\r
- }\r
- }\r
-\r
- uint32 len1 = len;\r
- uint32 len2 = str.len;\r
- uint32 i;\r
-\r
- if (isWide)\r
- {\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = 0; i <= len1 && i <= len2; i++)\r
- {\r
- if (buffer16[i] != str.buffer16[i])\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- for (i = 0; i <= len1 && i <= len2; i++)\r
- {\r
- if (toLower (buffer16[i]) != toLower (str.buffer16[i]))\r
- return i;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- if (isCaseSensitive (mode))\r
- {\r
- for (i = 0; i <= len1 && i <= len2; i++)\r
- {\r
- if (buffer8[i] != str.buffer8[i])\r
- return i;\r
- }\r
- }\r
- else\r
- {\r
- for (i = 0; i <= len1 && i <= len2; i++)\r
- {\r
- if (toLower (buffer8[i]) != toLower (str.buffer8[i]))\r
- return i;\r
- }\r
- }\r
- }\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64 (int64& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return scanInt64_16 (buffer16 + offset, value, scanToEnd);\r
- else\r
- return scanInt64_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64 (uint64& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return scanUInt64_16 (buffer16 + offset, value, scanToEnd);\r
- else\r
- return scanUInt64_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex (uint8& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return scanHex_16 (buffer16 + offset, value, scanToEnd);\r
- else\r
- return scanHex_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt32 (int32& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return scanInt32_16 (buffer16 + offset, value, scanToEnd);\r
- else\r
- return scanInt32_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt32 (uint32& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return scanUInt32_16 (buffer16 + offset, value, scanToEnd);\r
- else\r
- return scanUInt32_8 (buffer8 + offset, value, scanToEnd);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64_8 (const char8* text, int64& value, bool scanToEnd)\r
-{\r
- while (text && text[0])\r
- {\r
- if (sscanf (text, "%" FORMAT_INT64A, &value) == 1)\r
- return true;\r
- else if (scanToEnd == false)\r
- return false;\r
- text++;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64_16 (const char16* text, int64& value, bool scanToEnd)\r
-{\r
- if (text && text[0])\r
- {\r
- String str (text);\r
- str.toMultiByte (kCP_Default);\r
- return scanInt64_8 (str, value, scanToEnd);\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64_8 (const char8* text, uint64& value, bool scanToEnd)\r
-{\r
- while (text && text[0])\r
- {\r
- if (sscanf (text, "%" FORMAT_UINT64A, &value) == 1)\r
- return true;\r
- else if (scanToEnd == false)\r
- return false;\r
- text++;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64_16 (const char16* text, uint64& value, bool scanToEnd)\r
-{\r
- if (text && text[0])\r
- {\r
- String str (text);\r
- str.toMultiByte (kCP_Default);\r
- return scanUInt64_8 (str, value, scanToEnd);\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanInt64 (const tchar* text, int64& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
- return scanInt64_16 (text, value,scanToEnd);\r
-#else\r
- return scanInt64_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanUInt64 (const tchar* text, uint64& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
- return scanUInt64_16 (text, value, scanToEnd);\r
-#else\r
- return scanUInt64_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex_8 (const char8* text, uint8& value, bool scanToEnd)\r
-{\r
- while (text && text[0])\r
- {\r
- unsigned int v; // scanf expects an unsigned int for %x\r
- if (sscanf (text, "%x", &v) == 1)\r
- {\r
- value = (uint8)v;\r
- return true;\r
- }\r
- else if (scanToEnd == false)\r
- return false;\r
- text++;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex_16 (const char16* text, uint8& value, bool scanToEnd)\r
-{\r
- if (text && text[0])\r
- {\r
- String str (text);\r
- str.toMultiByte (kCP_Default); // scanf uses default codepage\r
- return scanHex_8 (str, value, scanToEnd);\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanHex (const tchar* text, uint8& value, bool scanToEnd)\r
-{\r
-#ifdef UNICODE\r
- return scanHex_16 (text, value, scanToEnd);\r
-#else\r
- return scanHex_8 (text, value, scanToEnd);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::scanFloat (double& value, uint32 offset, bool scanToEnd) const\r
-{\r
- if (isEmpty () || offset >= len)\r
- return false;\r
-\r
- String str (*this);\r
- int32 pos = -1;\r
- if (isWide)\r
- {\r
- if ((pos = str.findNext (offset, STR(','))) >= 0 && ((uint32)pos) >= offset)\r
- str.setChar (pos, STR('.'));\r
-\r
- str.toMultiByte (kCP_Default); // scanf uses default codepage\r
- }\r
- else\r
- {\r
- if ((pos = str.findNext (offset, ',')) >= 0 && ((uint32)pos) >= offset)\r
- str.setChar (pos, '.');\r
- }\r
-\r
- const char8* txt = str.text8 () + offset;\r
- while (txt && txt[0])\r
- {\r
- if (sscanf (txt, "%lf", &value) == 1)\r
- return true;\r
- else if (scanToEnd == false)\r
- return false;\r
- txt++;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char16 ConstString::toLower (char16 c)\r
-{\r
- #if SMTG_OS_WINDOWS\r
- WCHAR temp[2] = {c, 0};\r
- ::CharLowerW (temp);\r
- return temp[0];\r
- #elif SMTG_OS_MACOS\r
- // only convert characters which in lowercase are also single characters\r
- UniChar characters [2] = {0};\r
- characters[0] = c;\r
- CFMutableStringRef str = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, characters, 1, 2, kCFAllocatorNull);\r
- if (str)\r
- {\r
- CFStringLowercase (str, NULL);\r
- CFRelease (str);\r
- if (characters[1] == 0)\r
- return characters[0];\r
- }\r
- return c;\r
- #elif SMTG_OS_LINUX\r
- #warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- return c;\r
- #else\r
- return towlower (c);\r
- #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char16 ConstString::toUpper (char16 c)\r
-{\r
- #if SMTG_OS_WINDOWS\r
- WCHAR temp[2] = {c, 0};\r
- ::CharUpperW (temp);\r
- return temp[0];\r
- #elif SMTG_OS_MACOS\r
- // only convert characters which in uppercase are also single characters (don't translate a sharp-s which would result in SS)\r
- UniChar characters [2] = {0};\r
- characters[0] = c;\r
- CFMutableStringRef str = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, characters, 1, 2, kCFAllocatorNull);\r
- if (str)\r
- {\r
- CFStringUppercase (str, NULL);\r
- CFRelease (str);\r
- if (characters[1] == 0)\r
- return characters[0];\r
- }\r
- return c;\r
- #elif SMTG_OS_LINUX\r
- #warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- return c;\r
- #else\r
- return towupper (c);\r
- #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char8 ConstString::toLower (char8 c)\r
-{\r
- if ((c >= 'A') && (c <= 'Z'))\r
- return c + ('a' - 'A');\r
- #if SMTG_OS_WINDOWS\r
- CHAR temp[2] = {c, 0};\r
- ::CharLowerA (temp);\r
- return temp[0];\r
- #else\r
- return tolower (c);\r
- #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-char8 ConstString::toUpper (char8 c)\r
-{\r
- if ((c >= 'a') && (c <= 'z'))\r
- return c - ('a' - 'A');\r
- #if SMTG_OS_WINDOWS\r
- CHAR temp[2] = {c, 0};\r
- ::CharUpperA (temp);\r
- return temp[0];\r
- #else\r
- return toupper (c);\r
- #endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharSpace (const char8 character)\r
-{\r
- return isspace (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharSpace (const char16 character)\r
-{\r
- switch (character)\r
- {\r
- case 0x0020:\r
- case 0x00A0:\r
- case 0x2002:\r
- case 0x2003:\r
- case 0x2004:\r
- case 0x2005:\r
- case 0x2006:\r
- case 0x2007:\r
- case 0x2008:\r
- case 0x2009:\r
- case 0x200A:\r
- case 0x200B:\r
- case 0x202F:\r
- case 0x205F:\r
- case 0x3000:\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlpha (const char8 character)\r
-{\r
- return isalpha (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlpha (const char16 character)\r
-{\r
- return iswalpha (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlphaNum (const char8 character)\r
-{\r
- return isalnum (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAlphaNum (const char16 character)\r
-{\r
- return iswalnum (character) != 0; // this may not work on macOSX when another locale is set inside the c-lib\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharDigit (const char8 character)\r
-{\r
- return isdigit (character) != 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharDigit (const char16 character)\r
-{\r
- return iswdigit (character) != 0; // this may not work on macOSX when another locale is set inside the c-lib\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAscii (char8 character)\r
-{\r
- return character >= 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharAscii (char16 character)\r
-{\r
- return character < 128;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharUpper (char8 character)\r
-{\r
- return toUpper (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharUpper (char16 character)\r
-{\r
- return toUpper (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharLower (char8 character)\r
-{\r
- return toLower (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isCharLower (char16 character)\r
-{\r
- return toLower (character) == character;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isDigit (uint32 index) const\r
-{\r
- if (isEmpty () || index >= len)\r
- return false;\r
-\r
- if (isWide)\r
- return ConstString::isCharDigit (buffer16[index]);\r
- else\r
- return ConstString::isCharDigit (buffer8[index]);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::getTrailingNumberIndex (uint32 width) const\r
-{\r
- if (isEmpty ())\r
- return -1;\r
-\r
- int32 endIndex = len - 1;\r
- int32 i = endIndex;\r
- while (isDigit ((uint32) i) && i >= 0)\r
- i--;\r
-\r
- // now either all are digits or i is on the first non digit\r
- if (i < endIndex)\r
- {\r
- if (width > 0 && (endIndex - i != static_cast<int32> (width)))\r
- return -1;\r
-\r
- return i + 1;\r
- }\r
-\r
- return -1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int64 ConstString::getTrailingNumber (int64 fallback) const\r
-{\r
- int32 index = getTrailingNumberIndex ();\r
-\r
- int64 number = 0;\r
-\r
- if (index >= 0)\r
- if (scanInt64 (number, index))\r
- return number;\r
-\r
- return fallback;\r
-}\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-void ConstString::toVariant (FVariant& var) const\r
-{\r
- if (isWide)\r
- {\r
- var.setString16 (buffer16);\r
- }\r
- else\r
- {\r
- var.setString8 (buffer8);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isAsciiString () const\r
-{\r
- uint32 i;\r
- if (isWide)\r
- {\r
- for (i = 0; i < len; i++)\r
- if (ConstString::isCharAscii (buffer16 [i]) == false)\r
- return false;\r
- }\r
- else\r
- {\r
- for (i = 0; i < len; i++)\r
- if (ConstString::isCharAscii (buffer8 [i]) == false)\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-\r
-#if SMTG_OS_MACOS\r
-uint32 kDefaultSystemEncoding = kCFStringEncodingMacRoman;\r
-//-----------------------------------------------------------------------------\r
-static CFStringEncoding MBCodePageToCFStringEncoding (uint32 codePage)\r
-{\r
- switch (codePage)\r
- {\r
- case kCP_ANSI: return kDefaultSystemEncoding; // MacRoman or JIS\r
- case kCP_MAC_ROMAN: return kCFStringEncodingMacRoman;\r
- case kCP_ANSI_WEL: return kCFStringEncodingWindowsLatin1;\r
- case kCP_MAC_CEE: return kCFStringEncodingMacCentralEurRoman;\r
- case kCP_Utf8: return kCFStringEncodingUTF8;\r
- case kCP_ShiftJIS: return kCFStringEncodingShiftJIS_X0213_00;\r
- case kCP_US_ASCII: return kCFStringEncodingASCII;\r
- }\r
- return kCFStringEncodingASCII;\r
-}\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::multiByteToWideString (char16* dest, const char8* source, int32 charCount, uint32 sourceCodePage)\r
-{\r
- if (source == 0 || source[0] == 0)\r
- {\r
- if (dest && charCount > 0)\r
- {\r
- dest[0] = 0;\r
- }\r
- return 0;\r
- }\r
- int32 result = 0;\r
-#if SMTG_OS_WINDOWS\r
- result = MultiByteToWideChar (sourceCodePage, MB_ERR_INVALID_CHARS, source, -1, dest, charCount);\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
- CFStringRef cfStr =\r
- (CFStringRef)::toCFStringRef (source, MBCodePageToCFStringEncoding (sourceCodePage));\r
- if (cfStr)\r
- {\r
- CFRange range = {0, CFStringGetLength (cfStr)};\r
- CFIndex usedBytes;\r
- if (CFStringGetBytes (cfStr, range, kCFStringEncodingUnicode, ' ', false, (UInt8*)dest,\r
- charCount * 2, &usedBytes) > 0)\r
- {\r
- result = static_cast<int32> (usedBytes / 2 + 1);\r
- if (dest)\r
- dest[usedBytes / 2] = 0;\r
- }\r
-\r
- CFRelease (cfStr);\r
- }\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
- if (sourceCodePage == kCP_ANSI || sourceCodePage == kCP_Utf8)\r
- {\r
- if (dest == nullptr)\r
- {\r
- auto state = std::mbstate_t ();\r
- auto maxChars = charCount ? charCount : std::numeric_limits<int32>::max () - 1;\r
- result = converterFacet ().length (state, source, source + strlen (source), maxChars);\r
- }\r
- else\r
- {\r
- auto utf16Str = converter ().from_bytes (source);\r
- if (!utf16Str.empty ())\r
- {\r
- result = std::min<int32> (charCount, utf16Str.size ());\r
- memcpy (dest, utf16Str.data (), result * sizeof (char16));\r
- dest[result] = 0;\r
- }\r
- }\r
- }\r
- else\r
- {\r
-#warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- }\r
-\r
-#endif\r
-\r
- SMTG_ASSERT (result > 0)\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ConstString::wideStringToMultiByte (char8* dest, const char16* wideString, int32 charCount, uint32 destCodePage)\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return WideCharToMultiByte (destCodePage, 0, wideString, -1, dest, charCount, 0, 0);\r
-\r
-#elif SMTG_OS_MACOS\r
- int32 result = 0;\r
- if (wideString != 0)\r
- {\r
- if (dest)\r
- {\r
- CFStringRef cfStr = CFStringCreateWithCharactersNoCopy (kCFAllocator, (const UniChar*)wideString, strlen16 (wideString), kCFAllocatorNull);\r
- if (cfStr)\r
- {\r
- if (fromCFStringRef (dest, charCount, cfStr, MBCodePageToCFStringEncoding (destCodePage)))\r
- result = static_cast<int32> (strlen (dest) + 1);\r
- CFRelease (cfStr);\r
- }\r
- }\r
- else\r
- {\r
- return static_cast<int32> (CFStringGetMaximumSizeForEncoding (strlen16 (wideString), MBCodePageToCFStringEncoding (destCodePage)));\r
- }\r
- }\r
- return result;\r
-\r
-#elif SMTG_OS_LINUX\r
- int32 result = 0;\r
- if (destCodePage == kCP_Utf8)\r
- {\r
- if (dest == nullptr)\r
- {\r
- auto maxChars = charCount ? charCount : tstrlen (wideString);\r
- result = converterFacet ().max_length () * maxChars;\r
- }\r
- else\r
- {\r
- auto utf8Str = converter ().to_bytes (wideString);\r
- if (!utf8Str.empty ())\r
- {\r
- result = std::min<int32> (charCount, utf8Str.size ());\r
- memcpy (dest, utf8Str.data (), result * sizeof (char8));\r
- dest[result] = 0;\r
- }\r
- }\r
- }\r
- else if (destCodePage == kCP_ANSI)\r
- {\r
- if (dest == nullptr)\r
- {\r
- result = strlen16 (wideString) + 1;\r
- }\r
- else\r
- {\r
- int32 i = 0;\r
- for (; i < charCount; ++i)\r
- {\r
- if (wideString[i] == 0)\r
- break;\r
- if (wideString[i] <= 0x007F)\r
- dest[i] = wideString[i];\r
- else\r
- dest[i] = '_';\r
- }\r
- dest[i] = 0;\r
- result = i;\r
- }\r
- }\r
- else\r
- {\r
-#warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- }\r
- return result;\r
-\r
-#else\r
-#warning DEPRECATED No Linux implementation\r
- assert(false && "DEPRECATED No Linux implementation");\r
- return 0;\r
-#endif\r
-\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ConstString::isNormalized (UnicodeNormalization n)\r
-{\r
- if (isWide == false)\r
- return false;\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifdef UNICODE\r
- if (n != kUnicodeNormC)\r
- return false;\r
- uint32 normCharCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, 0, 0));\r
- return (normCharCount == len);\r
-#else\r
- return false;\r
-#endif\r
-\r
-#elif SMTG_OS_MACOS\r
- if (n != kUnicodeNormC)\r
- return false;\r
-\r
- CFStringRef cfStr = (CFStringRef)toCFStringRef ();\r
- CFIndex charCount = CFStringGetLength (cfStr);\r
- CFRelease (cfStr);\r
- return (charCount == len);\r
-#else\r
- return false;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-// String\r
-//-----------------------------------------------------------------------------\r
-String::String ()\r
-{\r
- isWide = kWideStringDefault ? 1 : 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char8* str, MBCodePage codePage, int32 n, bool isTerminated)\r
-{\r
- isWide = 0;\r
- if (str)\r
- {\r
- assign (str, n, isTerminated);\r
- toWideString (codePage);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char8* str, int32 n, bool isTerminated)\r
-{\r
- if (str)\r
- assign (str, n, isTerminated);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const char16* str, int32 n, bool isTerminated)\r
-{\r
- isWide = 1;\r
- if (str)\r
- assign (str, n, isTerminated);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const String& str, int32 n)\r
-{\r
- isWide = str.isWideString ();\r
- if (!str.isEmpty ())\r
- assign (str, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const ConstString& str, int32 n)\r
-{\r
- isWide = str.isWideString ();\r
- if (!str.isEmpty ())\r
- assign (str, n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (const FVariant& var)\r
-{\r
- isWide = kWideStringDefault ? 1 : 0;\r
- fromVariant (var);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::String (IString* str)\r
-{\r
- isWide = str->isWideString ();\r
- if (isWide)\r
- assign (str->getText16 ());\r
- else\r
- assign (str->getText8 ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String::~String ()\r
-{\r
- if (buffer)\r
- resize (0, false);\r
-}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-//-----------------------------------------------------------------------------\r
-String::String (String&& str)\r
-{\r
- *this = std::move (str);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::operator= (String&& str)\r
-{\r
- SMTG_ASSERT (buffer == 0 || buffer != str.buffer);\r
- tryFreeBuffer ();\r
-\r
- isWide = str.isWide;\r
- buffer = str.buffer;\r
- len = str.len;\r
- str.buffer = nullptr;\r
- str.len = 0;\r
- return *this;\r
-}\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::updateLength ()\r
-{\r
- if (isWide)\r
- len = strlen16 (text16 ());\r
- else\r
- len = strlen8 (text8 ());\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toWideString (uint32 sourceCodePage)\r
-{\r
- if (!isWide)\r
- {\r
- if (buffer8 && len > 0)\r
- {\r
- int32 bytesNeeded = multiByteToWideString (0, buffer8, 0, sourceCodePage) * sizeof (char16);\r
- if (bytesNeeded)\r
- {\r
- bytesNeeded += sizeof (char16);\r
- char16* newStr = (char16*) malloc (bytesNeeded);\r
- if (multiByteToWideString (newStr, buffer8, len + 1, sourceCodePage) <= 0)\r
- {\r
- free (newStr);\r
- return false;\r
- }\r
- free (buffer8);\r
- buffer16 = newStr;\r
- isWide = true;\r
- updateLength ();\r
- }\r
- else\r
- {\r
- return false;\r
- }\r
- }\r
- isWide = true;\r
- }\r
- return true;\r
-}\r
-\r
-#define SMTG_STRING_CHECK_CONVERSION 1\r
-#define SMTG_STRING_CHECK_CONVERSION_NO_BREAK 1\r
-\r
-#if SMTG_STRING_CHECK_CONVERSION_NO_BREAK\r
- #define SMTG_STRING_CHECK_MSG FDebugPrint\r
-#else\r
- #define SMTG_STRING_CHECK_MSG FDebugBreak\r
-#endif\r
-//-----------------------------------------------------------------------------\r
-bool String::checkToMultiByte (uint32 destCodePage) const\r
-{\r
- if (!isWide || isEmpty ())\r
- return true;\r
-\r
-#if DEVELOPMENT && SMTG_STRING_CHECK_CONVERSION\r
- int debugLen = length ();\r
- int debugNonASCII = 0;\r
- for (int32 i = 0; i < length (); i++)\r
- {\r
- if (buffer16[i] > 127)\r
- ++debugNonASCII;\r
- }\r
-\r
- String* backUp = nullptr;\r
- if (debugNonASCII > 0)\r
- backUp = NEW String (*this);\r
-#endif\r
-\r
- // this should be avoided, since it can lead to information loss\r
- bool result = const_cast <String&> (*this).toMultiByte (destCodePage);\r
-\r
-#if DEVELOPMENT && SMTG_STRING_CHECK_CONVERSION\r
- if (backUp)\r
- {\r
- String temp (*this);\r
- temp.toWideString (destCodePage);\r
-\r
- if (temp != *backUp)\r
- {\r
- backUp->toMultiByte (kCP_Utf8);\r
- SMTG_STRING_CHECK_MSG ("Indirect string conversion information loss ! %d/%d non ASCII chars: \"%s\" -> \"%s\"\n", debugNonASCII, debugLen, backUp->buffer8, buffer8);\r
- }\r
- else\r
- SMTG_STRING_CHECK_MSG ("Indirect string potential conversion information loss ! %d/%d non ASCII chars result: \"%s\"\n", debugNonASCII, debugLen, buffer8);\r
-\r
- delete backUp;\r
- }\r
-#endif\r
-\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toMultiByte (uint32 destCodePage)\r
-{\r
- if (isWide)\r
- {\r
- if (buffer16 && len > 0)\r
- {\r
- int32 numChars = wideStringToMultiByte (0, buffer16, 0, destCodePage) + sizeof (char8);\r
- char8* newStr = (char8*) malloc (numChars * sizeof (char8));\r
- if (wideStringToMultiByte (newStr, buffer16, numChars, destCodePage) <= 0)\r
- {\r
- free (newStr);\r
- return false;\r
- }\r
- free (buffer16);\r
- buffer8 = newStr;\r
- isWide = false;\r
- updateLength ();\r
- }\r
- isWide = false;\r
- }\r
- else if (destCodePage != kCP_Default)\r
- {\r
- if (toWideString () == false)\r
- return false;\r
- return toMultiByte (destCodePage);\r
- }\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::fromUTF8 (const char8* utf8String)\r
-{\r
- assign (utf8String);\r
- toWideString (kCP_Utf8);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::normalize (UnicodeNormalization n)\r
-{\r
- if (isWide == false)\r
- return false;\r
-\r
- if (buffer16 == 0)\r
- return true;\r
-\r
-#if SMTG_OS_WINDOWS\r
-#ifdef UNICODE\r
- if (n != kUnicodeNormC)\r
- return false;\r
-\r
- uint32 normCharCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, 0, 0));\r
- if (normCharCount == len)\r
- return true;\r
-\r
- char16* newString = (char16*)malloc ((normCharCount + 1) * sizeof (char16));\r
- uint32 converterCount = static_cast<uint32> (FoldString (MAP_PRECOMPOSED, buffer16, len, newString, normCharCount + 1));\r
- if (converterCount != normCharCount)\r
- {\r
- free (newString);\r
- return false;\r
- }\r
- newString [converterCount] = 0;\r
- free (buffer16);\r
- buffer16 = newString;\r
- updateLength ();\r
- return true;\r
-#else\r
- return false;\r
-#endif\r
-\r
-#elif SMTG_OS_MACOS\r
- CFMutableStringRef origStr = (CFMutableStringRef)toCFStringRef (0xFFFF, true);\r
- if (origStr)\r
- {\r
- CFStringNormalizationForm normForm = kCFStringNormalizationFormD;\r
- switch (n)\r
- {\r
- case kUnicodeNormC: normForm = kCFStringNormalizationFormC; break;\r
- case kUnicodeNormD: normForm = kCFStringNormalizationFormD; break;\r
- case kUnicodeNormKC: normForm = kCFStringNormalizationFormKC; break;\r
- case kUnicodeNormKD: normForm = kCFStringNormalizationFormKD; break;\r
- }\r
- CFStringNormalize (origStr, normForm);\r
- bool result = fromCFStringRef (origStr);\r
- CFRelease (origStr);\r
- return result;\r
- }\r
- return false;\r
-#else\r
- return false;\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::tryFreeBuffer ()\r
-{\r
- if (buffer)\r
- {\r
- free (buffer);\r
- buffer = 0;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::resize (uint32 newLength, bool wide, bool fill)\r
-{\r
- if (newLength == 0)\r
- {\r
- tryFreeBuffer ();\r
- len = 0;\r
- isWide = wide ? 1 : 0;\r
- }\r
- else\r
- {\r
- size_t newCharSize = wide ? sizeof (char16) : sizeof (char8);\r
- size_t oldCharSize = (isWide != 0) ? sizeof (char16) : sizeof (char8);\r
-\r
- size_t newBufferSize = (newLength + 1) * newCharSize;\r
- size_t oldBufferSize = (len + 1) * oldCharSize;\r
-\r
- isWide = wide ? 1 : 0;\r
-\r
- if (buffer)\r
- {\r
- if (newBufferSize != oldBufferSize)\r
- {\r
- void* newstr = realloc (buffer, newBufferSize);\r
- if (newstr == 0)\r
- return false;\r
- buffer = newstr;\r
- if (isWide)\r
- buffer16[newLength] = 0;\r
- else\r
- buffer8[newLength] = 0;\r
- }\r
- else if (wide && newCharSize != oldCharSize)\r
- buffer16[newLength] = 0;\r
- }\r
- else\r
- {\r
- void* newstr = malloc (newBufferSize);\r
- if (newstr == 0)\r
- return false;\r
- buffer = newstr;\r
- if (isWide)\r
- {\r
- buffer16[0] = 0;\r
- buffer16[newLength] = 0;\r
- }\r
- else\r
- {\r
- buffer8[0] = 0;\r
- buffer8[newLength] = 0;\r
- }\r
- }\r
-\r
- if (fill && len < newLength && buffer)\r
- {\r
- if (isWide)\r
- {\r
- char16 c = ' ';\r
- for (uint32 i = len; i < newLength; i++)\r
- buffer16 [i] = c;\r
- }\r
- else\r
- {\r
- memset (buffer8 + len, ' ', newLength - len);\r
- }\r
- }\r
- }\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::setChar8 (uint32 index, char8 c)\r
-{\r
- if (index == len && c == 0)\r
- return true;\r
-\r
- if (index >= len)\r
- {\r
- if (c == 0)\r
- {\r
- if (resize (index, isWide, true) == false)\r
- return false;\r
- len = index;\r
- return true;\r
- }\r
- else\r
- {\r
- if (resize (index + 1, isWide, true) == false)\r
- return false;\r
- len = index + 1;\r
- }\r
- }\r
-\r
- if (index < len && buffer)\r
- {\r
- if (isWide)\r
- {\r
- if (c == 0)\r
- buffer16[index] = 0;\r
- else\r
- {\r
- char8 src[] = {c, 0};\r
- char16 dest[8] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- buffer16[index] = dest[0];\r
- }\r
- SMTG_ASSERT (buffer16[len] == 0)\r
- }\r
- else\r
- {\r
- buffer8[index] = c;\r
- SMTG_ASSERT (buffer8[len] == 0)\r
- }\r
-\r
- if (c == 0)\r
- updateLength ();\r
-\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::setChar16 (uint32 index, char16 c)\r
-{\r
- if (index == len && c == 0)\r
- return true;\r
-\r
- if (index >= len)\r
- {\r
- if (c == 0)\r
- {\r
- if (resize (index, isWide, true) == false)\r
- return false;\r
- len = index;\r
- return true;\r
- }\r
- else\r
- {\r
- if (resize (index + 1, isWide, true) == false)\r
- return false;\r
- len = index + 1;\r
- }\r
- }\r
-\r
- if (index < len && buffer)\r
- {\r
- if (isWide)\r
- {\r
- buffer16[index] = c;\r
- SMTG_ASSERT (buffer16[len] == 0)\r
- }\r
- else\r
- {\r
- SMTG_ASSERT (buffer8[len] == 0)\r
- char16 src[] = {c, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- buffer8[index] = dest[0];\r
- else\r
- return false;\r
- }\r
-\r
- if (c == 0)\r
- updateLength ();\r
-\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const ConstString& str, int32 n)\r
-{\r
- if (str.isWideString ())\r
- return assign (str.text16 (), n < 0 ? str.length () : n);\r
- else\r
- return assign (str.text8 (), n < 0 ? str.length () : n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const char8* str, int32 n, bool isTerminated)\r
-{\r
- if (str == buffer8)\r
- return *this;\r
-\r
- if (isTerminated)\r
- {\r
- uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
- }\r
- else if (n < 0)\r
- return *this;\r
-\r
- if (resize (n, false))\r
- {\r
- if (buffer8 && n > 0)\r
- {\r
- memcpy (buffer8, str, n * sizeof (char8));\r
- SMTG_ASSERT (buffer8[n] == 0)\r
- }\r
- isWide = 0;\r
- len = n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (const char16* str, int32 n, bool isTerminated)\r
-{\r
- if (str == buffer16)\r
- return *this;\r
-\r
- if (isTerminated)\r
- {\r
- uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
- }\r
- else if (n < 0)\r
- return *this;\r
-\r
- if (resize (n, true))\r
- {\r
- if (buffer16 && n > 0)\r
- {\r
- memcpy (buffer16, str, n * sizeof (char16));\r
- SMTG_ASSERT (buffer16[n] == 0)\r
- }\r
- isWide = 1;\r
- len = n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (char8 c, int32 n)\r
-{\r
- if (resize (n, false))\r
- {\r
- if (buffer8 && n > 0)\r
- {\r
- memset (buffer8, c, n * sizeof (char8));\r
- SMTG_ASSERT (buffer8[n] == 0)\r
- }\r
- isWide = 0;\r
- len = n;\r
- }\r
- return *this;\r
-\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::assign (char16 c, int32 n)\r
-{\r
- if (resize (n, true))\r
- {\r
- if (buffer && n > 0)\r
- {\r
- for (int32 i = 0; i < n; i++)\r
- buffer16[i] = c;\r
- SMTG_ASSERT (buffer16[n] == 0)\r
- }\r
- isWide = 1;\r
- len = n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const ConstString& str, int32 n)\r
-{\r
- if (str.isWideString ())\r
- return append (str.text16 (), n);\r
- else\r
- return append (str.text8 (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char8* str, int32 n)\r
-{\r
- if (str == buffer8)\r
- return *this;\r
-\r
- if (len == 0)\r
- return assign (str, n);\r
-\r
- if (isWide)\r
- {\r
- String tmp (str);\r
- if (tmp.toWideString () == false)\r
- return *this;\r
-\r
- return append (tmp.buffer16, n);\r
- }\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (n > 0)\r
- {\r
- int32 newlen = n + len;\r
- if (!resize (newlen, false))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- memcpy (buffer8 + len, str, n * sizeof (char8));\r
- SMTG_ASSERT (buffer8[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char16* str, int32 n)\r
-{\r
- if (str == buffer16)\r
- return *this;\r
-\r
- if (len == 0)\r
- return assign (str, n);\r
-\r
- if (!isWide)\r
- {\r
- if (toWideString () == false)\r
- return *this;\r
- }\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (n > 0)\r
- {\r
- int32 newlen = n + len;\r
- if (!resize (newlen, true))\r
- return *this;\r
-\r
- if (buffer16)\r
- {\r
- memcpy (buffer16 + len, str, n * sizeof (char16));\r
- SMTG_ASSERT (buffer16[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char8 c, int32 n)\r
-{\r
- char8 str[] = {c, 0};\r
- if (n == 1)\r
- {\r
- return append (str, 1);\r
- }\r
- else if (n > 1)\r
- {\r
- if (isWide)\r
- {\r
- String tmp (str);\r
- if (tmp.toWideString () == false)\r
- return *this;\r
-\r
- return append (tmp.buffer16[0], n);\r
- }\r
-\r
- int32 newlen = n + len;\r
- if (!resize (newlen, false))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- memset (buffer8 + len, c, n * sizeof (char8));\r
- SMTG_ASSERT (buffer8[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::append (const char16 c, int32 n)\r
-{\r
- if (n == 1)\r
- {\r
- char16 str[] = {c, 0};\r
- return append (str, 1);\r
- }\r
- else if (n > 1)\r
- {\r
- if (!isWide)\r
- {\r
- if (toWideString () == false)\r
- return *this;\r
- }\r
-\r
- int32 newlen = n + len;\r
- if (!resize (newlen, true))\r
- return *this;\r
-\r
- if (buffer16)\r
- {\r
- for (int32 i = len; i < newlen; i++)\r
- buffer16[i] = c;\r
- SMTG_ASSERT (buffer16[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const ConstString& str, int32 n)\r
-{\r
- if (str.isWideString ())\r
- return insertAt (idx, str.text16 (), n);\r
- else\r
- return insertAt (idx, str.text8 (), n);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const char8* str, int32 n)\r
-{\r
- if (idx > len)\r
- return *this;\r
-\r
- if (isWide)\r
- {\r
- String tmp (str);\r
- if (tmp.toWideString () == false)\r
- return *this;\r
- return insertAt (idx, tmp.buffer16, n);\r
- }\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (n > 0)\r
- {\r
- int32 newlen = len + n;\r
- if (!resize (newlen, false))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- if (idx < len)\r
- memmove (buffer8 + idx + n, buffer8 + idx, (len - idx) * sizeof (char8));\r
- memcpy (buffer8 + idx, str, n * sizeof (char8));\r
- SMTG_ASSERT (buffer8[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::insertAt (uint32 idx, const char16* str, int32 n)\r
-{\r
- if (idx > len)\r
- return *this;\r
-\r
- if (!isWide)\r
- {\r
- if (toWideString () == false)\r
- return *this;\r
- }\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
- n = n < 0 ? stringLength : Min<uint32> (n, stringLength);\r
-\r
- if (n > 0)\r
- {\r
- int32 newlen = len + n;\r
- if (!resize (newlen, true))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- if (idx < len)\r
- memmove (buffer16 + idx + n, buffer16 + idx, (len - idx) * sizeof (char16));\r
- memcpy (buffer16 + idx, str, n * sizeof (char16));\r
- SMTG_ASSERT (buffer16[newlen] == 0)\r
- }\r
-\r
- len += n;\r
- }\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const ConstString& str, int32 n2)\r
-{\r
- if (str.isWideString ())\r
- return replace (idx, n1, str.text16 (), n2);\r
- else\r
- return replace (idx, n1, str.text8 (), n2);\r
-}\r
-\r
-// "replace" replaces n1 number of characters at the specified index with\r
-// n2 characters from the specified string.\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const char8* str, int32 n2)\r
-{\r
- if (idx > len || str == 0)\r
- return *this;\r
-\r
- if (isWide)\r
- {\r
- String tmp (str);\r
- if (tmp.toWideString () == false)\r
- return *this;\r
- if (tmp.length () == 0 || n2 == 0)\r
- return remove (idx, n1);\r
- return replace (idx, n1, tmp.buffer16, n2);\r
- }\r
-\r
- if (n1 < 0 || idx + n1 > len)\r
- n1 = len - idx;\r
- if (n1 == 0)\r
- return *this;\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen (str) : 0);\r
- n2 = n2 < 0 ? stringLength : Min<uint32> (n2, stringLength);\r
-\r
- uint32 newlen = len - n1 + n2;\r
- if (newlen > len)\r
- if (!resize (newlen, false))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- memmove (buffer8 + idx + n2, buffer8 + idx + n1, (len - (idx + n1)) * sizeof (char8));\r
- memcpy (buffer8 + idx, str, n2 * sizeof (char8));\r
- buffer8[newlen] = 0; // cannot be removed because resize is not called called in all cases (newlen > len)\r
- }\r
-\r
- len = newlen;\r
-\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::replace (uint32 idx, int32 n1, const char16* str, int32 n2)\r
-{\r
- if (idx > len || str == 0)\r
- return *this;\r
-\r
- if (!isWide)\r
- {\r
- if (toWideString () == false)\r
- return *this;\r
- }\r
-\r
- if (n1 < 0 || idx + n1 > len)\r
- n1 = len - idx;\r
- if (n1 == 0)\r
- return *this;\r
-\r
- uint32 stringLength = (uint32)((str) ? strlen16 (str) : 0);\r
- n2 = n2 < 0 ? stringLength : Min<uint32> (n2, stringLength);\r
-\r
- uint32 newlen = len - n1 + n2;\r
- if (newlen > len)\r
- if (!resize (newlen, true))\r
- return *this;\r
-\r
- if (buffer)\r
- {\r
- memmove (buffer16 + idx + n2, buffer16 + idx + n1, (len - (idx + n1)) * sizeof (char16));\r
- memcpy (buffer16 + idx, str, n2 * sizeof (char16));\r
- buffer16[newlen] = 0; // cannot be removed because resize is not called called in all cases (newlen > len)\r
- }\r
-\r
- len = newlen;\r
-\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 String::replace (const char8* toReplace, const char8* toReplaceWith, bool all, CompareMode m)\r
-{\r
- if (toReplace == 0 || toReplaceWith == 0)\r
- return 0;\r
-\r
- int32 result = 0;\r
-\r
- int32 idx = findFirst (toReplace, -1, m);\r
- if (idx > -1)\r
- {\r
- int32 toReplaceLen = static_cast<int32> (strlen (toReplace));\r
- int32 toReplaceWithLen = static_cast<int32> (strlen (toReplaceWith));\r
- while (idx > -1)\r
- {\r
- replace (idx, toReplaceLen, toReplaceWith, toReplaceWithLen);\r
- result++;\r
-\r
- if (all)\r
- idx = findNext (idx + toReplaceWithLen , toReplace, -1, m);\r
- else\r
- break;\r
- }\r
- }\r
-\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 String::replace (const char16* toReplace, const char16* toReplaceWith, bool all, CompareMode m)\r
-{\r
- if (toReplace == 0 || toReplaceWith == 0)\r
- return 0;\r
-\r
- int32 result = 0;\r
-\r
- int32 idx = findFirst (toReplace, -1, m);\r
- if (idx > -1)\r
- {\r
- int32 toReplaceLen = strlen16 (toReplace);\r
- int32 toReplaceWithLen = strlen16 (toReplaceWith);\r
- while (idx > -1)\r
- {\r
- replace (idx, toReplaceLen, toReplaceWith, toReplaceWithLen);\r
- result++;\r
-\r
- if (all)\r
- idx = findNext (idx + toReplaceWithLen, toReplace, -1, m);\r
- else\r
- break;\r
- }\r
- }\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T>\r
-static bool performReplace (T* str, const T* toReplace, T toReplaceBy)\r
-{\r
- bool anyReplace = false;\r
- T* p = str;\r
- while (*p)\r
- {\r
- const T* rep = toReplace;\r
- while (*rep)\r
- {\r
- if (*p == *rep)\r
- {\r
- *p = toReplaceBy;\r
- anyReplace = true;\r
- break;\r
- }\r
- rep++;\r
- }\r
- p++;\r
- }\r
- return anyReplace;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::replaceChars8 (const char8* toReplace, char8 toReplaceBy)\r
-{\r
- if (isEmpty ())\r
- return false;\r
-\r
- if (isWide)\r
- {\r
- String toReplaceW (toReplace);\r
- if (toReplaceW.toWideString () == false)\r
- return false;\r
-\r
- char8 src[] = {toReplaceBy, 0};\r
- char16 dest[2] = {0};\r
- if (multiByteToWideString (dest, src, 2) > 0)\r
- {\r
- return replaceChars16 (toReplaceW.text16 (), dest[0]);\r
- }\r
- return false;\r
- }\r
-\r
- if (toReplaceBy == 0)\r
- toReplaceBy = ' ';\r
-\r
- return performReplace<char8> (buffer8, toReplace, toReplaceBy);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::replaceChars16 (const char16* toReplace, char16 toReplaceBy)\r
-{\r
- if (isEmpty ())\r
- return false;\r
-\r
- if (!isWide)\r
- {\r
- String toReplaceA (toReplace);\r
- if (toReplaceA.toMultiByte () == false)\r
- return false;\r
-\r
- if (toReplaceA.length () > 1)\r
- {\r
- SMTG_WARNING("cannot replace non ASCII chars on non Wide String")\r
- return false;\r
- }\r
-\r
- char16 src[] = {toReplaceBy, 0};\r
- char8 dest[8] = {0};\r
- if (wideStringToMultiByte (dest, src, 2) > 0 && dest[1] == 0)\r
- return replaceChars8 (toReplaceA.text8 (), dest[0]);\r
-\r
- return false;\r
- }\r
-\r
- if (toReplaceBy == 0)\r
- toReplaceBy = STR16 (' ');\r
-\r
- return performReplace<char16> (buffer16, toReplace, toReplaceBy);\r
-}\r
-\r
-// "remove" removes the specified number of characters from the string\r
-// starting at the specified index.\r
-//-----------------------------------------------------------------------------\r
-String& String::remove (uint32 idx, int32 n)\r
-{\r
- if (isEmpty () || idx >= len || n == 0)\r
- return *this;\r
-\r
- if ((idx + n > len) || n < 0)\r
- n = len - idx;\r
- else\r
- {\r
- int32 toMove = len - idx - n;\r
- if (buffer)\r
- {\r
- if (isWide)\r
- memmove (buffer16 + idx, buffer16 + idx + n, toMove * sizeof (char16));\r
- else\r
- memmove (buffer8 + idx, buffer8 + idx + n, toMove * sizeof (char8));\r
- }\r
- }\r
-\r
- resize (len - n, isWide);\r
- updateLength ();\r
-\r
- return *this;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeSubString (const ConstString& subString, bool allOccurences)\r
-{\r
- bool removed = false;\r
- while (!removed || allOccurences)\r
- {\r
- int32 idx = findFirst (subString);\r
- if (idx < 0)\r
- break;\r
- remove (idx, subString.length ());\r
- removed = true;\r
- }\r
- return removed;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T, class F>\r
-static uint32 performTrim (T* str, uint32 length, F func, bool funcResult)\r
-{\r
- uint32 toRemoveAtHead = 0;\r
- uint32 toRemoveAtTail = 0;\r
-\r
- T* p = str;\r
-\r
- while ((*p) && ((func (*p) != 0) == funcResult))\r
- p++;\r
-\r
- toRemoveAtHead = static_cast<uint32> (p - str);\r
-\r
- if (toRemoveAtHead < length)\r
- {\r
- p = str + length - 1;\r
-\r
- while (((func (*p) != 0) == funcResult) && (p > str))\r
- {\r
- p--;\r
- toRemoveAtTail++;\r
- }\r
- }\r
-\r
- uint32 newLength = length - (toRemoveAtHead + toRemoveAtTail);\r
- if (newLength != length)\r
- {\r
- if (toRemoveAtHead)\r
- memmove (str, str + toRemoveAtHead, newLength * sizeof (T));\r
- }\r
- return newLength;\r
-}\r
-\r
-// "trim" trims the leading and trailing unwanted characters from the string.\r
-//-----------------------------------------------------------------------------\r
-bool String::trim (String::CharGroup group)\r
-{\r
- if (isEmpty ())\r
- return false;\r
-\r
- uint32 newLength;\r
-\r
- switch (group)\r
- {\r
- case kSpace:\r
- if (isWide)\r
- newLength = performTrim<char16> (buffer16, len, iswspace, true);\r
- else\r
- newLength = performTrim<char8> (buffer8, len, isspace, true);\r
- break;\r
-\r
- case kNotAlphaNum:\r
- if (isWide)\r
- newLength = performTrim<char16> (buffer16, len, iswalnum, false);\r
- else\r
- newLength = performTrim<char8> (buffer8, len, isalnum, false);\r
- break;\r
-\r
- case kNotAlpha:\r
- if (isWide)\r
- newLength = performTrim<char16> (buffer16, len, iswalpha, false);\r
- else\r
- newLength = performTrim<char8> (buffer8, len, isalpha, false);\r
- break;\r
-\r
- default: // Undefined enum value\r
- return false;\r
- }\r
-\r
- if (newLength != len)\r
- {\r
- resize (newLength, isWide);\r
- len = newLength;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T, class F>\r
-static uint32 performRemove (T* str, uint32 length, F func, bool funcResult)\r
-{\r
- T* p = str;\r
-\r
- while (*p)\r
- {\r
- if ((func (*p) != 0) == funcResult)\r
- {\r
- size_t toMove = length - (p - str);\r
- memmove (p, p + 1, toMove * sizeof (T));\r
- length--;\r
- }\r
- else\r
- p++;\r
- }\r
- return length;\r
-}\r
-//-----------------------------------------------------------------------------\r
-void String::removeChars (CharGroup group)\r
-{\r
- if (isEmpty ())\r
- return;\r
-\r
- uint32 newLength;\r
-\r
- switch (group)\r
- {\r
- case kSpace:\r
- if (isWide)\r
- newLength = performRemove<char16> (buffer16, len, iswspace, true);\r
- else\r
- newLength = performRemove<char8> (buffer8, len, isspace, true);\r
- break;\r
-\r
- case kNotAlphaNum:\r
- if (isWide)\r
- newLength = performRemove<char16> (buffer16, len, iswalnum, false);\r
- else\r
- newLength = performRemove<char8> (buffer8, len, isalnum, false);\r
- break;\r
-\r
- case kNotAlpha:\r
- if (isWide)\r
- newLength = performRemove<char16> (buffer16, len, iswalpha, false);\r
- else\r
- newLength = performRemove<char8> (buffer8, len, isalpha, false);\r
- break;\r
-\r
- default: // Undefined enum value\r
- return;\r
- }\r
-\r
- if (newLength != len)\r
- {\r
- resize (newLength, isWide);\r
- len = newLength;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-template <class T>\r
-static uint32 performRemoveChars (T* str, uint32 length, const T* toRemove)\r
-{\r
- T* p = str;\r
-\r
- while (*p)\r
- {\r
- bool found = false;\r
- const T* rem = toRemove;\r
- while (*rem)\r
- {\r
- if (*p == *rem)\r
- {\r
- found = true;\r
- break;\r
- }\r
- rem++;\r
- }\r
-\r
- if (found)\r
- {\r
- size_t toMove = length - (p - str);\r
- memmove (p, p + 1, toMove * sizeof (T));\r
- length--;\r
- }\r
- else\r
- p++;\r
- }\r
- return length;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeChars8 (const char8* toRemove)\r
-{\r
- if (isEmpty () || toRemove == 0)\r
- return true;\r
-\r
- if (isWide)\r
- {\r
- String wStr (toRemove);\r
- if (wStr.toWideString () == false)\r
- return false;\r
- return removeChars16 (wStr.text16 ());\r
- }\r
-\r
- uint32 newLength = performRemoveChars<char8> (buffer8, len, toRemove);\r
-\r
- if (newLength != len)\r
- {\r
- resize (newLength, false);\r
- len = newLength;\r
- }\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::removeChars16 (const char16* toRemove)\r
-{\r
- if (isEmpty () || toRemove == 0)\r
- return true;\r
-\r
- if (!isWide)\r
- {\r
- String str8 (toRemove);\r
- if (str8.toMultiByte () == false)\r
- return false;\r
- return removeChars8 (str8.text8 ());\r
- }\r
-\r
- uint32 newLength = performRemoveChars<char16> (buffer16, len, toRemove);\r
-\r
- if (newLength != len)\r
- {\r
- resize (newLength, true);\r
- len = newLength;\r
- }\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printf (const char8* format, ...)\r
-{\r
- char8 string[kPrintfBufferSize];\r
-\r
- va_list marker;\r
- va_start (marker, format);\r
-\r
- vsnprintf (string, kPrintfBufferSize-1, format, marker);\r
- return assign (string);\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printf (const char16* format, ...)\r
-{\r
- char16 string[kPrintfBufferSize];\r
-\r
- va_list marker;\r
- va_start (marker, format);\r
-\r
- vsnwprintf (string, kPrintfBufferSize-1, format, marker);\r
- return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::vprintf (const char8* format, va_list args)\r
-{\r
- char8 string[kPrintfBufferSize];\r
-\r
- vsnprintf (string, kPrintfBufferSize-1, format, args);\r
- return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::vprintf (const char16* format, va_list args)\r
-{\r
- char16 string[kPrintfBufferSize];\r
-\r
- vsnwprintf (string, kPrintfBufferSize-1, format, args);\r
- return assign (string);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printInt64 (int64 value)\r
-{\r
- if (isWide)\r
- {\r
- #if SMTG_CPP11\r
- return String::printf (STR("%") STR(FORMAT_INT64A), value);\r
- #else\r
- return String::printf (STR("%" FORMAT_INT64A), value);\r
- #endif\r
- }\r
- else\r
- return String::printf ("%" FORMAT_INT64A, value);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-String& String::printFloat (double value)\r
-{\r
- if (isWide)\r
- {\r
- char16 string[kPrintfBufferSize];\r
- sprintf16 (string, STR16 ("%lf"), value);\r
-\r
- char16* pointPtr = strrchr16 (string, STR ('.'));\r
- if (pointPtr)\r
- {\r
- pointPtr++; // keep 1st digit after point\r
- int32 index = strlen16 (string) - 1;\r
- char16 zero = STR16 ('0');\r
- while (pointPtr < (string + index))\r
- {\r
- if (string[index] == zero)\r
- {\r
- string[index] = 0;\r
- index--;\r
- }\r
- else\r
- break;\r
- }\r
- }\r
- return assign (string);\r
- }\r
- else\r
- {\r
- char8 string[kPrintfBufferSize];\r
- sprintf (string, "%lf", value);\r
-\r
- char8* pointPtr = strrchr (string, '.');\r
- if (pointPtr)\r
- {\r
- pointPtr++; // keep 1st digit after point\r
- int32 index = (int32) (strlen (string) - 1);\r
- while (pointPtr < (string + index))\r
- {\r
- if (string[index] == '0')\r
- {\r
- string[index] = 0;\r
- index--;\r
- }\r
- else\r
- break;\r
- }\r
- }\r
- return assign (string);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::incrementTrailingNumber (uint32 width, tchar separator, uint32 minNumber, bool applyOnlyFormat)\r
-{\r
- if (width > 32)\r
- return false;\r
-\r
- int64 number = 1;\r
- int32 index = getTrailingNumberIndex ();\r
- if (index >= 0)\r
- {\r
- if (scanInt64 (number, index))\r
- if (!applyOnlyFormat)\r
- number++;\r
-\r
- if (separator != 0 && index > 0 && testChar (index - 1, separator) == true)\r
- index--;\r
-\r
- remove (index);\r
- }\r
-\r
- if (number < minNumber)\r
- number = minNumber;\r
-\r
- if (isWide)\r
- {\r
- char16 format[64];\r
- char16 trail[128];\r
- if (separator && isEmpty () == false)\r
- {\r
- sprintf16 (format, STR16 ("%%c%%0%uu"), width);\r
- sprintf16 (trail, format, separator, (uint32) number);\r
- }\r
- else\r
- {\r
- sprintf16 (format, STR16 ("%%0%uu"), width);\r
- sprintf16 (trail, format, (uint32) number);\r
- }\r
- append (trail);\r
- }\r
- else\r
- {\r
- char format[64];\r
- char trail[128];\r
- if (separator && isEmpty () == false)\r
- {\r
- sprintf (format, "%%c%%0%uu", width);\r
- sprintf (trail, format, separator, (uint32) number);\r
- }\r
- else\r
- {\r
- sprintf (format, "%%0%uu", width);\r
- sprintf (trail, format, (uint32) number);\r
- }\r
- append (trail);\r
- }\r
-\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toLower (uint32 index)\r
-{\r
- if (buffer && index < len)\r
- {\r
- if (isWide)\r
- buffer16[index] = ConstString::toLower (buffer16[index]);\r
- else\r
- buffer8[index] = ConstString::toLower (buffer8[index]);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toLower ()\r
-{\r
- int32 i = len;\r
- if (buffer && i > 0)\r
- {\r
- if (isWide)\r
- {\r
-#if SMTG_OS_MACOS\r
- CFMutableStringRef cfStr = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, (UniChar*)buffer16, len, len+1, kCFAllocatorNull);\r
- CFStringLowercase (cfStr, NULL);\r
- CFRelease (cfStr);\r
-#else\r
- char16* c = buffer16;\r
- while (i--)\r
- {\r
- *c = ConstString::toLower (*c);\r
- c++;\r
- }\r
-#endif\r
- }\r
- else\r
- {\r
- char8* c = buffer8;\r
- while (i--)\r
- {\r
- *c = ConstString::toLower (*c);\r
- c++;\r
- }\r
- }\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toUpper (uint32 index)\r
-{\r
- if (buffer && index < len)\r
- {\r
- if (isWide)\r
- buffer16[index] = ConstString::toUpper (buffer16[index]);\r
- else\r
- buffer8[index] = ConstString::toUpper (buffer8[index]);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toUpper ()\r
-{\r
- int32 i = len;\r
- if (buffer && i > 0)\r
- {\r
- if (isWide)\r
- {\r
-#if SMTG_OS_MACOS\r
- CFMutableStringRef cfStr = CFStringCreateMutableWithExternalCharactersNoCopy (kCFAllocator, (UniChar*)buffer16, len, len+1, kCFAllocatorNull);\r
- CFStringUppercase (cfStr, NULL);\r
- CFRelease (cfStr);\r
-#else\r
- char16* c = buffer16;\r
- while (i--)\r
- {\r
- *c = ConstString::toUpper (*c);\r
- c++;\r
- }\r
-#endif\r
- }\r
- else\r
- {\r
- char8* c = buffer8;\r
- while (i--)\r
- {\r
- *c = ConstString::toUpper (*c);\r
- c++;\r
- }\r
- }\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromVariant (const FVariant& var)\r
-{\r
- switch (var.getType ())\r
- {\r
- case FVariant::kString8:\r
- assign (var.getString8 ());\r
- return true;\r
-\r
- case FVariant::kString16:\r
- assign (var.getString16 ());\r
- return true;\r
-\r
- case FVariant::kFloat:\r
- printFloat (var.getFloat ());\r
- return true;\r
-\r
- case FVariant::kInteger:\r
- printInt64 (var.getInt ());\r
- return true;\r
-\r
- default:\r
- remove ();\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::toVariant (FVariant& var) const\r
-{\r
- if (isWide)\r
- {\r
- var.setString16 (text16 ());\r
- }\r
- else\r
- {\r
- var.setString8 (text8 ());\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromAttributes (IAttributes* a, IAttrID attrID)\r
-{\r
- FVariant variant;\r
- if (a->get (attrID, variant) == kResultTrue)\r
- return fromVariant (variant);\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::toAttributes (IAttributes* a, IAttrID attrID)\r
-{\r
- FVariant variant;\r
- toVariant (variant);\r
- if (a->set (attrID, variant) == kResultTrue)\r
- return true;\r
- return false;\r
-}\r
-\r
-// "swapContent" swaps ownership of the strings pointed to\r
-//-----------------------------------------------------------------------------\r
-void String::swapContent (String& s)\r
-{\r
- void* tmp = s.buffer;\r
- uint32 tmpLen = s.len;\r
- bool tmpWide = s.isWide;\r
- s.buffer = buffer;\r
- s.len = len;\r
- s.isWide = isWide;\r
- buffer = tmp;\r
- len = tmpLen;\r
- isWide = tmpWide;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::take (String& other)\r
-{\r
- resize (0, other.isWide);\r
- buffer = other.buffer;\r
- len = other.len;\r
-\r
- other.buffer = 0;\r
- other.len = 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::take (void* b, bool wide)\r
-{\r
- resize (0, wide);\r
- buffer = b;\r
- isWide = wide;\r
- updateLength ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void* String::pass ()\r
-{\r
- void* res = buffer;\r
- len = 0;\r
- buffer = 0;\r
- return res;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void String::passToVariant (FVariant& var)\r
-{\r
- void* passed = pass ();\r
-\r
- if (isWide)\r
- {\r
- if (passed)\r
- {\r
- var.setString16 ((const char16*)passed);\r
- var.setOwner (true);\r
- }\r
- else\r
- var.setString16 (kEmptyString16);\r
- }\r
- else\r
- {\r
- if (passed)\r
- {\r
- var.setString8 ((const char8*)passed);\r
- var.setOwner (true);\r
- }\r
- else\r
- var.setString8 (kEmptyString8);\r
- }\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-unsigned char* String::toPascalString (unsigned char* buf)\r
-{\r
- if (buffer)\r
- {\r
- if (isWide)\r
- {\r
- String tmp (*this);\r
- tmp.toMultiByte ();\r
- return tmp.toPascalString (buf);\r
- }\r
-\r
- int32 length = len;\r
- if (length > 255)\r
- length = 255;\r
- buf[0] = (uint8)length;\r
- while (length >= 0)\r
- {\r
- buf[length + 1] = buffer8[length];\r
- length--;\r
- }\r
- return buf;\r
- }\r
- else\r
- {\r
- *buf = 0;\r
- return buf;\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const String& String::fromPascalString (const unsigned char* buf)\r
-{\r
- resize (0, false);\r
- isWide = 0;\r
- int32 length = buf[0];\r
- resize (length + 1, false);\r
- buffer8[length] = 0; // cannot be removed, because we only do the 0-termination for multibyte buffer8\r
- while (--length >= 0)\r
- buffer8[length] = buf[length + 1];\r
- len = buf[0];\r
- return *this;\r
-}\r
-\r
-#if SMTG_OS_MACOS\r
-\r
-//-----------------------------------------------------------------------------\r
-bool String::fromCFStringRef (const void* cfStr, uint32 encoding)\r
-{\r
- if (cfStr == 0)\r
- return false;\r
-\r
- CFStringRef strRef = (CFStringRef)cfStr;\r
- if (isWide)\r
- {\r
- CFRange range = { 0, CFStringGetLength (strRef)};\r
- CFIndex usedBytes;\r
- if (resize (static_cast<int32> (range.length + 1), true))\r
- {\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingUnicode;\r
- if (CFStringGetBytes (strRef, range, encoding, ' ', false, (UInt8*)buffer16, range.length * 2, &usedBytes) > 0)\r
- {\r
- buffer16[usedBytes/2] = 0;\r
- this->len = strlen16 (buffer16);\r
- return true;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- if (cfStr == 0)\r
- return false;\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingASCII;\r
- int32 len = static_cast<int32> (CFStringGetLength (strRef) * 2);\r
- if (resize (++len, false))\r
- {\r
- if (CFStringGetCString (strRef, buffer8, len, encoding))\r
- {\r
- this->len = static_cast<int32> (strlen (buffer8));\r
- return true;\r
- }\r
- }\r
- }\r
-\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void* ConstString::toCFStringRef (uint32 encoding, bool mutableCFString) const\r
-{\r
- if (mutableCFString)\r
- {\r
- CFMutableStringRef str = CFStringCreateMutable (kCFAllocator, 0);\r
- if (isWide)\r
- {\r
- CFStringAppendCharacters (str, (const UniChar *)buffer16, len);\r
- return str;\r
- }\r
- else\r
- {\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingASCII;\r
- CFStringAppendCString (str, buffer8, encoding);\r
- return str;\r
- }\r
- }\r
- else\r
- {\r
- if (isWide)\r
- {\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingUnicode;\r
- return (void*)CFStringCreateWithBytes (kCFAllocator, (const unsigned char*)buffer16, len * 2, encoding, false);\r
- }\r
- else\r
- {\r
- if (encoding == 0xFFFF)\r
- encoding = kCFStringEncodingASCII;\r
- if (buffer8)\r
- return (void*)CFStringCreateWithCString (kCFAllocator, buffer8, encoding);\r
- else\r
- return (void*)CFStringCreateWithCString (kCFAllocator, "", encoding);\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 hashString8 (const char8* s, uint32 m)\r
-{\r
- uint32 h = 0;\r
- if (s)\r
- {\r
- for (h = 0; *s != '\0'; s++)\r
- h = (64 * h + *s) % m;\r
- }\r
- return h;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 hashString16 (const char16* s, uint32 m)\r
-{\r
- uint32 h = 0;\r
- if (s)\r
- {\r
- for (h = 0; *s != 0; s++)\r
- h = (64 * h + *s) % m;\r
- }\r
- return h;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class T> int32 tstrnatcmp (const T* s1, const T* s2, bool caseSensitive = true)\r
-{\r
- if (s1 == 0 && s2 == 0)\r
- return 0;\r
- else if (s1 == 0)\r
- return -1;\r
- else if (s2 == 0)\r
- return 1;\r
-\r
- while (*s1 && *s2)\r
- {\r
- if (ConstString::isCharDigit (*s1) && ConstString::isCharDigit (*s2))\r
- {\r
- int32 s1LeadingZeros = 0;\r
- while (*s1 == '0')\r
- {\r
- s1++; // skip leading zeros\r
- s1LeadingZeros++;\r
- }\r
- int32 s2LeadingZeros = 0;\r
- while (*s2 == '0')\r
- {\r
- s2++; // skip leading zeros\r
- s2LeadingZeros++;\r
- }\r
-\r
- int32 countS1Digits = 0;\r
- while (*(s1 + countS1Digits) && ConstString::isCharDigit (*(s1 + countS1Digits)))\r
- countS1Digits++;\r
- int32 countS2Digits = 0;\r
- while (*(s2 + countS2Digits) && ConstString::isCharDigit (*(s2 + countS2Digits)))\r
- countS2Digits++;\r
-\r
- if (countS1Digits != countS2Digits)\r
- return countS1Digits - countS2Digits; // one number is longer than the other\r
-\r
- for (int32 i = 0; i < countS1Digits; i++)\r
- {\r
- // countS1Digits == countS2Digits\r
- if (*s1 != *s2)\r
- return (int32)(*s1 - *s2); // the digits differ\r
- s1++;\r
- s2++;\r
- }\r
-\r
- if (s1LeadingZeros != s2LeadingZeros)\r
- return s1LeadingZeros - s2LeadingZeros; // differentiate by the number of leading zeros\r
- }\r
- else\r
- {\r
- if (caseSensitive == false)\r
- {\r
- T srcToUpper = toupper (*s1);\r
- T dstToUpper = toupper (*s2);\r
- if (srcToUpper != dstToUpper)\r
- return (int32)(srcToUpper - dstToUpper);\r
- }\r
- else if (*s1 != *s2)\r
- return (int32)(*s1 - *s2);\r
-\r
- s1++;\r
- s2++;\r
- }\r
- }\r
-\r
- if (*s1 == 0 && *s2 == 0)\r
- return 0;\r
- else if (*s1 == 0)\r
- return -1;\r
- else if (*s2 == 0)\r
- return 1;\r
- else\r
- return (int32)(*s1 - *s2);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 strnatcmp8 (const char8* s1, const char8* s2, bool caseSensitive /*= true*/)\r
-{\r
- return tstrnatcmp (s1, s2, caseSensitive);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 strnatcmp16 (const char16* s1, const char16* s2, bool caseSensitive /*= true*/)\r
-{\r
- return tstrnatcmp (s1, s2, caseSensitive);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-// StringObject Implementation\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText (const char8* text)\r
-{\r
- assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText8 (const char8* text)\r
-{\r
- assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::setText16 (const char16* text)\r
-{\r
- assign (text);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char8* PLUGIN_API StringObject::getText8 ()\r
-{\r
- return text8 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char16* PLUGIN_API StringObject::getText16 ()\r
-{\r
- return text16 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API StringObject::take (void* s, bool _isWide)\r
-{\r
- String::take (s, _isWide);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool PLUGIN_API StringObject::isWideString () const\r
-{\r
- return String::isWideString ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/fstring.h\r
-// Created by : Steinberg, 2008\r
-// Description : String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-#include "pluginterfaces/base/istringresult.h"\r
-#include "pluginterfaces/base/ipersistent.h"\r
-\r
-#include "base/source/fobject.h"\r
-\r
-#include <stdarg.h>\r
-\r
-namespace Steinberg {\r
-\r
-class FVariant;\r
-class String;\r
-\r
-#ifdef UNICODE\r
-static const bool kWideStringDefault = true;\r
-#else\r
-static const bool kWideStringDefault = false;\r
-#endif\r
-\r
-static const uint16 kBomUtf16 = 0xFEFF; ///< UTF16 Byte Order Mark\r
-static const char8* const kBomUtf8 = "\xEF\xBB\xBF"; ///< UTF8 Byte Order Mark\r
-static const int32 kBomUtf8Length = 3;\r
-\r
-\r
-enum MBCodePage\r
-{\r
- kCP_ANSI = 0, ///< Default ANSI codepage.\r
- kCP_MAC_ROMAN = 2, ///< Default Mac codepage.\r
-\r
- kCP_ANSI_WEL = 1252, ///< West European Latin Encoding.\r
- kCP_MAC_CEE = 10029, ///< Mac Central European Encoding.\r
- kCP_Utf8 = 65001, ///< UTF8 Encoding.\r
- kCP_ShiftJIS = 932, ///< Shifted Japan Industrial Standard Encoding.\r
- kCP_US_ASCII = 20127, ///< US-ASCII (7-bit).\r
-\r
- kCP_Default = kCP_ANSI ///< Default ANSI codepage.\r
-};\r
-\r
-enum UnicodeNormalization\r
-{\r
- kUnicodeNormC, ///< Unicode normalization Form C, canonical composition.\r
- kUnicodeNormD, ///< Unicode normalization Form D, canonical decomposition.\r
- kUnicodeNormKC, ///< Unicode normalization form KC, compatibility composition.\r
- kUnicodeNormKD ///< Unicode normalization form KD, compatibility decomposition.\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// Helper functions to create hash codes from string data.\r
-//------------------------------------------------------------------------\r
-extern uint32 hashString8 (const char8* s, uint32 m);\r
-extern uint32 hashString16 (const char16* s, uint32 m);\r
-inline uint32 hashString (const tchar* s, uint32 m)\r
-{\r
-#ifdef UNICODE\r
- return hashString16 (s, m);\r
-#else\r
- return hashString8 (s, m);\r
-#endif\r
-}\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-/** Invariant String.\r
-@ingroup adt\r
-\r
-A base class which provides methods to work with its\r
-member string. Neither of the operations allows modifying the member string and\r
-that is why all operation are declared as const.\r
-\r
-There are operations for access, comparison, find, numbers and conversion.\r
-\r
-Almost all operations exist in three versions for char8, char16 and the\r
-polymorphic type tchar. The type tchar can either be char8 or char16 depending\r
-on whether UNICODE is activated or not.*/\r
-//-----------------------------------------------------------------------------\r
-class ConstString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
- ConstString (const char8* str, int32 length = -1); ///< Assign from string of type char8 (length=-1: all)\r
- ConstString (const char16* str, int32 length = -1); ///< Assign from string of type char16 (length=-1: all)\r
- ConstString (const ConstString& str, int32 offset = 0, int32 length = -1); ///< Copy constructor (length=-1: all).\r
- ConstString (const FVariant& var); ///< Assign a string from FVariant\r
- ConstString ();\r
- virtual ~ConstString () {} ///< Destructor.\r
-\r
- // access -----------------------------------------------------------------\r
- virtual int32 length () const {return static_cast<int32> (len);} ///< Return length of string\r
- inline bool isEmpty () const {return buffer == 0 || len == 0;} ///< Return true if string is empty\r
-\r
- operator const char8* () const {return text8 ();} ///< Returns pointer to string of type char8 (no modification allowed)\r
- operator const char16* () const {return text16 ();} ///< Returns pointer to string of type char16(no modification allowed)\r
- inline tchar operator[] (short idx) const {return getChar (static_cast<uint32> (idx));} ///< Returns character at 'idx'\r
- inline tchar operator[] (long idx) const {return getChar (static_cast<uint32> (idx));}\r
- inline tchar operator[] (int idx) const {return getChar (static_cast<uint32> (idx));}\r
- inline tchar operator[] (unsigned short idx) const {return getChar (idx);}\r
- inline tchar operator[] (unsigned long idx) const {return getChar (static_cast<uint32> (idx));}\r
- inline tchar operator[] (unsigned int idx) const {return getChar (idx);}\r
-\r
- inline virtual const char8* text8 () const; ///< Returns pointer to string of type char8\r
- inline virtual const char16* text16 () const; ///< Returns pointer to string of type char16\r
- inline virtual const tchar* text () const; ///< Returns pointer to string of type tchar\r
- inline virtual const void* ptr () const {return buffer;} ///< Returns pointer to string of type void\r
-\r
- inline virtual char8 getChar8 (uint32 index) const; ///< Returns character of type char16 at 'index'\r
- inline virtual char16 getChar16 (uint32 index) const; ///< Returns character of type char8 at 'index'\r
- inline tchar getChar (uint32 index) const; ///< Returns character of type tchar at 'index'\r
- inline tchar getCharAt (uint32 index) const; ///< Returns character of type tchar at 'index', no conversion!\r
-\r
- bool testChar8 (uint32 index, char8 c) const; ///< Returns true if character is equal at position 'index'\r
- bool testChar16 (uint32 index, char16 c) const;\r
- inline bool testChar (uint32 index, char8 c) const {return testChar8 (index, c);}\r
- inline bool testChar (uint32 index, char16 c) const {return testChar16 (index, c);}\r
-\r
- bool extract (String& result, uint32 idx, int32 n = -1) const; ///< Get n characters long substring starting at index (n=-1: until end)\r
- int32 copyTo8 (char8* str, uint32 idx = 0, int32 n = -1) const;\r
- int32 copyTo16 (char16* str, uint32 idx = 0, int32 n = -1) const;\r
- int32 copyTo (tchar* str, uint32 idx = 0, int32 n = -1) const;\r
- void copyTo (IStringResult* result) const; ///< Copies whole member string\r
- void copyTo (IString& string) const; ///< Copies whole member string\r
-\r
- inline uint32 hash (uint32 tsize) const\r
- {\r
- return isWide ? hashString16 (buffer16, tsize) : hashString8 (buffer8, tsize) ;\r
- }\r
- //-------------------------------------------------------------------------\r
-\r
- // compare ----------------------------------------------------------------\r
- enum CompareMode\r
- {\r
- kCaseSensitive, ///< Comparison is done with regard to character's case\r
- kCaseInsensitive ///< Comparison is done without regard to character's case\r
- };\r
-\r
- int32 compareAt (uint32 index, const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive) const; ///< Compare n characters of str with n characters of this starting at index (return: see above)\r
- int32 compare (const ConstString& str, int32 n, CompareMode m = kCaseSensitive) const; ///< Compare n characters of str with n characters of this (return: see above)\r
- int32 compare (const ConstString& str, CompareMode m = kCaseSensitive) const; ///< Compare all characters of str with this (return: see above)\r
-\r
- int32 naturalCompare (const ConstString& str, CompareMode mode = kCaseSensitive) const;\r
-\r
- bool startsWith (const ConstString& str, CompareMode m = kCaseSensitive) const; ///< Check if this starts with str\r
- bool endsWith (const ConstString& str, CompareMode m = kCaseSensitive) const; ///< Check if this ends with str\r
- bool contains (const ConstString& str, CompareMode m = kCaseSensitive) const; ///< Check if this contains str\r
-\r
- // static methods\r
- static bool isCharSpace (char8 character); ///< Returns true if character is a space\r
- static bool isCharSpace (char16 character); ///< @copydoc isCharSpace(const char8)\r
- static bool isCharAlpha (char8 character); ///< Returns true if character is an alphabetic character\r
- static bool isCharAlpha (char16 character); ///< @copydoc isCharAlpha(const char8)\r
- static bool isCharAlphaNum (char8 character); ///< Returns true if character is an alphanumeric character\r
- static bool isCharAlphaNum (char16 character); ///< @copydoc isCharAlphaNum(const char8)\r
- static bool isCharDigit (char8 character); ///< Returns true if character is a number\r
- static bool isCharDigit (char16 character); ///< @copydoc isCharDigit(const char8)\r
- static bool isCharAscii (char8 character); ///< Returns true if character is in ASCII range\r
- static bool isCharAscii (char16 character); ///< Returns true if character is in ASCII range\r
- static bool isCharUpper (char8 character);\r
- static bool isCharUpper (char16 character);\r
- static bool isCharLower (char8 character);\r
- static bool isCharLower (char16 character);\r
- //-------------------------------------------------------------------------\r
-\r
- /** @name Find first occurrence of n characters of str in this (n=-1: all) ending at endIndex (endIndex = -1: all)*/\r
- ///@{\r
- inline int32 findFirst (const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, str, n, m, endIndex);}\r
- inline int32 findFirst (char8 c, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, c, m, endIndex);}\r
- inline int32 findFirst (char16 c, CompareMode m = kCaseSensitive, int32 endIndex = -1) const {return findNext (0, c, m, endIndex);}\r
- ///@}\r
- /** @name Find next occurrence of n characters of str starting at startIndex in this (n=-1: all) ending at endIndex (endIndex = -1: all)*/\r
- ///@{\r
- int32 findNext (int32 startIndex, const ConstString& str, int32 n = -1, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
- int32 findNext (int32 startIndex, char8 c, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
- int32 findNext (int32 startIndex, char16 c, CompareMode = kCaseSensitive, int32 endIndex = -1) const;\r
- ///@}\r
- /** @name Find previous occurrence of n characters of str starting at startIndex in this (n=-1: all) */\r
- ///@{\r
- int32 findPrev (int32 startIndex, const ConstString& str, int32 n = -1, CompareMode = kCaseSensitive) const;\r
- int32 findPrev (int32 startIndex, char8 c, CompareMode = kCaseSensitive) const;\r
- int32 findPrev (int32 startIndex, char16 c, CompareMode = kCaseSensitive) const;\r
- ///@}\r
-\r
- inline int32 findLast (const ConstString& str, int32 n = -1, CompareMode m = kCaseSensitive) const {return findPrev (-1, str, n, m);} ///< Find last occurrence of n characters of str in this (n=-1: all)\r
- inline int32 findLast (char8 c, CompareMode m = kCaseSensitive) const {return findPrev (-1, c, m);}\r
- inline int32 findLast (char16 c, CompareMode m = kCaseSensitive) const {return findPrev (-1, c, m);}\r
-\r
- int32 countOccurences (char8 c, uint32 startIndex, CompareMode = kCaseSensitive) const; ///< Counts occurences of c within this starting at index\r
- int32 countOccurences (char16 c, uint32 startIndex, CompareMode = kCaseSensitive) const;\r
- int32 getFirstDifferent (const ConstString& str, CompareMode = kCaseSensitive) const; ///< Returns position of first different character\r
- //-------------------------------------------------------------------------\r
-\r
- // numbers ----------------------------------------------------------------\r
- bool isDigit (uint32 index) const; ///< Returns true if character at position is a digit\r
- bool scanFloat (double& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to double value starting at offset\r
- bool scanInt64 (int64& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to int64 value starting at offset\r
- bool scanUInt64 (uint64& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to uint64 value starting at offset\r
- bool scanInt32 (int32& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to int32 value starting at offset\r
- bool scanUInt32 (uint32& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to uint32 value starting at offset\r
- bool scanHex (uint8& value, uint32 offset = 0, bool scanToEnd = true) const; ///< Converts string to hex/uint8 value starting at offset\r
-\r
- int32 getTrailingNumberIndex (uint32 width = 0) const; ///< Returns start index of trailing number\r
- int64 getTrailingNumber (int64 fallback = 0) const; ///< Returns result of scanInt64 or the fallback\r
- int64 getNumber () const; ///< Returns result of scanInt64\r
-\r
- // static methods\r
- static bool scanInt64_8 (const char8* text, int64& value, bool scanToEnd = true); ///< Converts string of type char8 to int64 value\r
- static bool scanInt64_16 (const char16* text, int64& value, bool scanToEnd = true); ///< Converts string of type char16 to int64 value\r
- static bool scanInt64 (const tchar* text, int64& value, bool scanToEnd = true); ///< Converts string of type tchar to int64 value\r
-\r
- static bool scanUInt64_8 (const char8* text, uint64& value, bool scanToEnd = true); ///< Converts string of type char8 to uint64 value\r
- static bool scanUInt64_16 (const char16* text, uint64& value, bool scanToEnd = true); ///< Converts string of type char16 to uint64 value\r
- static bool scanUInt64 (const tchar* text, uint64& value, bool scanToEnd = true); ///< Converts string of type tchar to uint64 value\r
-\r
- static bool scanInt32_8 (const char8* text, int32& value, bool scanToEnd = true); ///< Converts string of type char8 to int32 value\r
- static bool scanInt32_16 (const char16* text, int32& value, bool scanToEnd = true); ///< Converts string of type char16 to int32 value\r
- static bool scanInt32 (const tchar* text, int32& value, bool scanToEnd = true); ///< Converts string of type tchar to int32 value\r
-\r
- static bool scanUInt32_8 (const char8* text, uint32& value, bool scanToEnd = true); ///< Converts string of type char8 to int32 value\r
- static bool scanUInt32_16 (const char16* text, uint32& value, bool scanToEnd = true); ///< Converts string of type char16 to int32 value\r
- static bool scanUInt32 (const tchar* text, uint32& value, bool scanToEnd = true); ///< Converts string of type tchar to int32 value\r
-\r
- static bool scanHex_8 (const char8* text, uint8& value, bool scanToEnd = true); ///< Converts string of type char8 to hex/unit8 value\r
- static bool scanHex_16 (const char16* text, uint8& value, bool scanToEnd = true); ///< Converts string of type char16 to hex/unit8 value\r
- static bool scanHex (const tchar* text, uint8& value, bool scanToEnd = true); ///< Converts string of type tchar to hex/unit8 value\r
- //-------------------------------------------------------------------------\r
-\r
- // conversion -------------------------------------------------------------\r
- void toVariant (FVariant& var) const;\r
-\r
- static char8 toLower (char8 c); ///< Converts to lower case\r
- static char8 toUpper (char8 c); ///< Converts to upper case\r
- static char16 toLower (char16 c);\r
- static char16 toUpper (char16 c);\r
-\r
- static int32 multiByteToWideString (char16* dest, const char8* source, int32 wcharCount, uint32 sourceCodePage = kCP_Default); ///< If dest is zero, this returns the maximum number of bytes needed to convert source\r
- static int32 wideStringToMultiByte (char8* dest, const char16* source, int32 char8Count, uint32 destCodePage = kCP_Default); ///< If dest is zero, this returns the maximum number of bytes needed to convert source\r
-\r
- bool isWideString () const {return isWide != 0;} ///< Returns true if string is wide\r
- bool isAsciiString () const; ///< Checks if all characters in string are in ascii range\r
-\r
- bool isNormalized (UnicodeNormalization = kUnicodeNormC); ///< On PC only kUnicodeNormC is working\r
-\r
-#if SMTG_OS_MACOS\r
- virtual void* toCFStringRef (uint32 encoding = 0xFFFF, bool mutableCFString = false) const; ///< CFString conversion\r
-#endif\r
-//-------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-protected:\r
-\r
- union\r
- {\r
- void* buffer;\r
- char8* buffer8;\r
- char16* buffer16;\r
- };\r
- uint32 len : 30;\r
- uint32 isWide : 1;\r
-};\r
-\r
-//-----------------------------------------------------------------------------\r
-/** String.\r
-@ingroup adt\r
-\r
-Extends class ConstString by operations which allow modifications.\r
-\r
-\see ConstString */\r
-//-----------------------------------------------------------------------------\r
-class String : public ConstString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
- String ();\r
- String (const char8* str, MBCodePage codepage, int32 n = -1, bool isTerminated = true); ///< assign n characters of str and convert to wide string by using the specified codepage\r
- String (const char8* str, int32 n = -1, bool isTerminated = true); ///< assign n characters of str (-1: all)\r
- String (const char16* str, int32 n = -1, bool isTerminated = true); ///< assign n characters of str (-1: all)\r
- String (const String& str, int32 n = -1); ///< assign n characters of str (-1: all)\r
- String (const ConstString& str, int32 n = -1); ///< assign n characters of str (-1: all)\r
- String (const FVariant& var); ///< assign from FVariant\r
- String (IString* str); ///< assign from IString\r
- ~String ();\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
- String (String&& str);\r
- String& operator= (String&& str);\r
-#endif\r
-\r
- // access------------------------------------------------------------------\r
- void updateLength (); ///< Call this when the string is truncated outside (not recommended though)\r
- virtual const char8* text8 () const SMTG_OVERRIDE;\r
- virtual const char16* text16 () const SMTG_OVERRIDE;\r
- virtual char8 getChar8 (uint32 index) const SMTG_OVERRIDE;\r
- virtual char16 getChar16 (uint32 index) const SMTG_OVERRIDE;\r
-\r
- bool setChar8 (uint32 index, char8 c);\r
- bool setChar16 (uint32 index, char16 c);\r
- inline bool setChar (uint32 index, char8 c) {return setChar8 (index, c);}\r
- inline bool setChar (uint32 index, char16 c) {return setChar16 (index, c);}\r
- //-------------------------------------------------------------------------\r
-\r
- // assignment--------------------------------------------------------------\r
- String& operator= (const char8* str) {return assign (str);} ///< Assign from a string of type char8\r
- String& operator= (const char16* str) {return assign (str);}\r
- String& operator= (const ConstString& str) {return assign (str);}\r
- String& operator= (const String& str) {return assign (str);}\r
- String& operator= (char8 c) {return assign (c);}\r
- String& operator= (char16 c) {return assign (c);}\r
-\r
- String& assign (const ConstString& str, int32 n = -1); ///< Assign n characters of str (-1: all)\r
- String& assign (const char8* str, int32 n = -1, bool isTerminated = true); ///< Assign n characters of str (-1: all)\r
- String& assign (const char16* str, int32 n = -1, bool isTerminated = true); ///< Assign n characters of str (-1: all)\r
- String& assign (char8 c, int32 n = 1);\r
- String& assign (char16 c, int32 n = 1);\r
- //-------------------------------------------------------------------------\r
-\r
- // concat------------------------------------------------------------------\r
- String& append (const ConstString& str, int32 n = -1); ///< Append n characters of str to this (n=-1: all)\r
- String& append (const char8* str, int32 n = -1); ///< Append n characters of str to this (n=-1: all)\r
- String& append (const char16* str, int32 n = -1); ///< Append n characters of str to this (n=-1: all)\r
- String& append (const char8 c, int32 n = 1); ///< Append char c n times\r
- String& append (const char16 c, int32 n = 1); ///< Append char c n times\r
-\r
- String& insertAt (uint32 idx, const ConstString& str, int32 n = -1); ///< Insert n characters of str at position idx (n=-1: all)\r
- String& insertAt (uint32 idx, const char8* str, int32 n = -1); ///< Insert n characters of str at position idx (n=-1: all)\r
- String& insertAt (uint32 idx, const char16* str, int32 n = -1); ///< Insert n characters of str at position idx (n=-1: all)\r
- String& insertAt (uint32 idx, char8 c) {char8 str[] = {c, 0}; return insertAt (idx, str, 1);}\r
- String& insertAt (uint32 idx, char16 c) {char16 str[] = {c, 0}; return insertAt (idx, str, 1);}\r
-\r
- String& operator+= (const String& str) {return append (str);}\r
- String& operator+= (const ConstString& str) {return append (str);}\r
- String& operator+= (const char8* str) {return append (str);}\r
- String& operator+= (const char16* str) {return append (str);}\r
- String& operator+= (const char8 c) {return append (c);}\r
- String& operator+= (const char16 c) {return append (c);}\r
- //-------------------------------------------------------------------------\r
-\r
- // replace-----------------------------------------------------------------\r
- String& replace (uint32 idx, int32 n1, const ConstString& str, int32 n2 = -1); ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
- String& replace (uint32 idx, int32 n1, const char8* str, int32 n2 = -1); ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
- String& replace (uint32 idx, int32 n1, const char16* str, int32 n2 = -1); ///< Replace n1 characters of this (starting at idx) with n2 characters of str (n1,n2=-1: until end)\r
-\r
- int32 replace (const char8* toReplace, const char8* toReplaceWith, bool all = false, CompareMode m = kCaseSensitive); ///< Replace find string with replace string - returns number of replacements\r
- int32 replace (const char16* toReplace, const char16* toReplaceWith, bool all = false, CompareMode m = kCaseSensitive); ///< Replace find string with replace string - returns number of replacements\r
-\r
- bool replaceChars8 (const char8* toReplace, char8 toReplaceBy); ///< Returns true when any replacement was done\r
- bool replaceChars16 (const char16* toReplace, char16 toReplaceBy);\r
- inline bool replaceChars8 (char8 toReplace, char8 toReplaceBy) {char8 str[] = {toReplace, 0}; return replaceChars8 (str, toReplaceBy);}\r
- inline bool replaceChars16 (char16 toReplace, char16 toReplaceBy) {char16 str[] = {toReplace, 0}; return replaceChars16 (str, toReplaceBy);}\r
- inline bool replaceChars (char8 toReplace, char8 toReplaceBy) {return replaceChars8 (toReplace, toReplaceBy);}\r
- inline bool replaceChars (char16 toReplace, char16 toReplaceBy) {return replaceChars16 (toReplace, toReplaceBy);}\r
- inline bool replaceChars (const char8* toReplace, char8 toReplaceBy) {return replaceChars8 (toReplace, toReplaceBy);}\r
- inline bool replaceChars (const char16* toReplace, char16 toReplaceBy) {return replaceChars16 (toReplace, toReplaceBy);}\r
- //-------------------------------------------------------------------------\r
-\r
- // remove------------------------------------------------------------------\r
- String& remove (uint32 index = 0, int32 n = -1); ///< Remove n characters from string starting at index (n=-1: until end)\r
- enum CharGroup {kSpace, kNotAlphaNum, kNotAlpha};\r
- bool trim (CharGroup mode = kSpace); ///< Trim lead/trail.\r
- void removeChars (CharGroup mode = kSpace); ///< Removes all of group.\r
- bool removeChars8 (const char8* which); ///< Remove all occurrences of each char in 'which'\r
- bool removeChars16 (const char16* which); ///< Remove all occurrences of each char in 'which'\r
- inline bool removeChars8 (const char8 which) {char8 str[] = {which, 0}; return removeChars8 (str); }\r
- inline bool removeChars16 (const char16 which) {char16 str[] = {which, 0}; return removeChars16 (str); }\r
- inline bool removeChars (const char8* which) {return removeChars8 (which);}\r
- inline bool removeChars (const char16* which) {return removeChars16 (which);}\r
- inline bool removeChars (const char8 which) {return removeChars8 (which);}\r
- inline bool removeChars (const char16 which) {return removeChars16 (which);}\r
- bool removeSubString (const ConstString& subString, bool allOccurences = true);\r
- //-------------------------------------------------------------------------\r
-\r
- // print-------------------------------------------------------------------\r
- String& printf (const char8* format, ...); ///< Print formatted data into string\r
- String& printf (const char16* format, ...); ///< Print formatted data into string\r
- String& vprintf (const char8* format, va_list args);\r
- String& vprintf (const char16* format, va_list args);\r
- //-------------------------------------------------------------------------\r
-\r
- // numbers-----------------------------------------------------------------\r
- String& printInt64 (int64 value);\r
- String& printFloat (double value);\r
- /** Increment the trailing number if present else start with minNumber, width specifies the string width format (width 2 for number 3 is 03),\r
- applyOnlyFormat set to true will only format the string to the given width without incrementing the founded trailing number */\r
- bool incrementTrailingNumber (uint32 width = 2, tchar separator = STR (' '), uint32 minNumber = 1, bool applyOnlyFormat = false);\r
- //-------------------------------------------------------------------------\r
-\r
- // conversion--------------------------------------------------------------\r
- bool fromVariant (const FVariant& var); ///< Assigns string from FVariant\r
- void toVariant (FVariant& var) const;\r
- bool fromAttributes (IAttributes* a, IAttrID attrID); ///< Assigns string from FAttributes\r
- bool toAttributes (IAttributes* a, IAttrID attrID);\r
-\r
- void swapContent (String& s); ///< Swaps ownership of the strings pointed to\r
- void take (String& str); ///< Take ownership of the string of 'str'\r
- void take (void* _buffer, bool wide); ///< Take ownership of buffer\r
- void* pass ();\r
- void passToVariant (FVariant& var); ///< Pass ownership of buffer to Variant - sets Variant ownership\r
-\r
- void toLower (uint32 index); ///< Lower case the character.\r
- void toLower (); ///< Lower case the string.\r
- void toUpper (uint32 index); ///< Upper case the character.\r
- void toUpper (); ///< Upper case the string.\r
-\r
- unsigned char* toPascalString (unsigned char* buf); ///< Pascal string conversion\r
- const String& fromPascalString (const unsigned char* buf); ///< Pascal string conversion\r
-\r
- bool toWideString (uint32 sourceCodePage = kCP_Default); ///< Converts to wide string according to sourceCodePage\r
- bool toMultiByte (uint32 destCodePage = kCP_Default);\r
-\r
- void fromUTF8 (const char8* utf8String); ///< Assigns from UTF8 string\r
- bool normalize (UnicodeNormalization = kUnicodeNormC); ///< On PC only kUnicodeNormC is working\r
-\r
-#if SMTG_OS_MACOS\r
- virtual bool fromCFStringRef (const void*, uint32 encoding = 0xFFFF); ///< CFString conversion\r
-#endif\r
- //-------------------------------------------------------------------------\r
-\r
- //-----------------------------------------------------------------------------\r
-protected:\r
- bool resize (uint32 newSize, bool wide, bool fill = false);\r
-\r
-private:\r
- void tryFreeBuffer ();\r
- bool checkToMultiByte (uint32 destCodePage = kCP_Default) const; // to remove debug code from inline - const_cast inside!!!\r
-};\r
-\r
-// String concatenation functions.\r
-inline String operator+ (const ConstString& s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const char8* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const char16* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char8* s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char16* s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const ConstString& s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const ConstString& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const char8* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const String& s1, const char16* s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char8* s1, const String& s2) {return String (s1).append (s2);}\r
-inline String operator+ (const char16* s1, const String& s2) {return String (s1).append (s2);}\r
-\r
-//-----------------------------------------------------------------------------\r
-// ConstString\r
-//-----------------------------------------------------------------------------\r
-inline const tchar* ConstString::text () const\r
-{\r
-#ifdef UNICODE\r
- return text16 ();\r
-#else\r
- return text8 ();\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char8* ConstString::text8 () const\r
-{\r
- return (!isWide && buffer8) ? buffer8: kEmptyString8;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char16* ConstString::text16 () const\r
-{\r
- return (isWide && buffer16) ? buffer16 : kEmptyString16;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char8 ConstString::getChar8 (uint32 index) const\r
-{\r
- if (index < len && buffer8 && !isWide)\r
- return buffer8[index];\r
- return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char16 ConstString::getChar16 (uint32 index) const\r
-{\r
- if (index < len && buffer16 && isWide)\r
- return buffer16[index];\r
- return 0;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline tchar ConstString::getChar (uint32 index) const\r
-{\r
-#ifdef UNICODE\r
- return getChar16 (index);\r
-#else\r
- return getChar8 (index);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline tchar ConstString::getCharAt (uint32 index) const\r
-{\r
-#ifdef UNICODE\r
- if (isWide)\r
- return getChar16 (index);\r
-#endif\r
-\r
- return static_cast<tchar> (getChar8 (index));\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline int64 ConstString::getNumber () const\r
-{\r
- int64 tmp = 0;\r
- scanInt64 (tmp);\r
- return tmp;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32_8 (const char8* text, int32& value, bool scanToEnd)\r
-{\r
- int64 tmp;\r
- if (scanInt64_8 (text, tmp, scanToEnd))\r
- {\r
- value = (int32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32_16 (const char16* text, int32& value, bool scanToEnd)\r
-{\r
- int64 tmp;\r
- if (scanInt64_16 (text, tmp, scanToEnd))\r
- {\r
- value = (int32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanInt32 (const tchar* text, int32& value, bool scanToEnd)\r
-{\r
- int64 tmp;\r
- if (scanInt64 (text, tmp, scanToEnd))\r
- {\r
- value = (int32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32_8 (const char8* text, uint32& value, bool scanToEnd)\r
-{\r
- uint64 tmp;\r
- if (scanUInt64_8 (text, tmp, scanToEnd))\r
- {\r
- value = (uint32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32_16 (const char16* text, uint32& value, bool scanToEnd)\r
-{\r
- uint64 tmp;\r
- if (scanUInt64_16 (text, tmp, scanToEnd))\r
- {\r
- value = (uint32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline bool ConstString::scanUInt32 (const tchar* text, uint32& value, bool scanToEnd)\r
-{\r
- uint64 tmp;\r
- if (scanUInt64 (text, tmp, scanToEnd))\r
- {\r
- value = (uint32)tmp;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char8* String::text8 () const\r
-{\r
- if (isWide && !isEmpty ())\r
- checkToMultiByte (); // this should be avoided, since it can lead to information loss\r
-\r
- return ConstString::text8 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline const char16* String::text16 () const\r
-{\r
- if (!isWide && !isEmpty ())\r
- {\r
- const_cast<String&> (*this).toWideString ();\r
- }\r
- return ConstString::text16 ();\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char8 String::getChar8 (uint32 index) const\r
-{\r
- if (isWide && !isEmpty ())\r
- checkToMultiByte (); // this should be avoided, since it can lead to information loss\r
-\r
- return ConstString::getChar8 (index);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-inline char16 String::getChar16 (uint32 index) const\r
-{\r
- if (!isWide && !isEmpty ())\r
- {\r
- const_cast<String&> (*this).toWideString ();\r
- }\r
- return ConstString::getChar16 (index);\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-\r
-\r
-inline bool operator< (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator> (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const ConstString& s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-\r
-inline bool operator< (const ConstString& s1, const char8* s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator> (const ConstString& s1, const char8* s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const char8* s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const char8* s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-inline bool operator< (const char8* s1, const ConstString& s2) {return (s2.compare (s1) > 0) ? true : false;}\r
-inline bool operator<= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) >= 0) ? true : false;}\r
-inline bool operator> (const char8* s1, const ConstString& s2) {return (s2.compare (s1) < 0) ? true : false;}\r
-inline bool operator>= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) <= 0) ? true : false;}\r
-inline bool operator== (const char8* s1, const ConstString& s2) {return (s2.compare (s1) == 0) ? true : false;}\r
-inline bool operator!= (const char8* s1, const ConstString& s2) {return (s2.compare (s1) != 0) ? true : false;}\r
-\r
-inline bool operator< (const ConstString& s1, const char16* s2) {return (s1.compare (s2) < 0) ? true : false;}\r
-inline bool operator<= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) <= 0) ? true : false;}\r
-inline bool operator> (const ConstString& s1, const char16* s2) {return (s1.compare (s2) > 0) ? true : false;}\r
-inline bool operator>= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) >= 0) ? true : false;}\r
-inline bool operator== (const ConstString& s1, const char16* s2) {return (s1.compare (s2) == 0) ? true : false;}\r
-inline bool operator!= (const ConstString& s1, const char16* s2) {return (s1.compare (s2) != 0) ? true : false;}\r
-inline bool operator< (const char16* s1, const ConstString& s2) {return (s2.compare (s1) > 0) ? true : false;}\r
-inline bool operator<= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) >= 0) ? true : false;}\r
-inline bool operator> (const char16* s1, const ConstString& s2) {return (s2.compare (s1) < 0) ? true : false;}\r
-inline bool operator>= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) <= 0) ? true : false;}\r
-inline bool operator== (const char16* s1, const ConstString& s2) {return (s2.compare (s1) == 0) ? true : false;}\r
-inline bool operator!= (const char16* s1, const ConstString& s2) {return (s2.compare (s1) != 0) ? true : false;}\r
-\r
-// The following functions will only work with European Numbers!\r
-// (e.g. Arabic, Tibetan, and Khmer digits are not supported)\r
-extern int32 strnatcmp8 (const char8* s1, const char8* s2, bool caseSensitive = true);\r
-extern int32 strnatcmp16 (const char16* s1, const char16* s2, bool caseSensitive = true);\r
-inline int32 strnatcmp (const tchar* s1, const tchar* s2, bool caseSensitive = true)\r
-{\r
-#ifdef UNICODE\r
- return strnatcmp16 (s1, s2, caseSensitive);\r
-#else\r
- return strnatcmp8 (s1, s2, caseSensitive);\r
-#endif\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-/** StringObject implements IStringResult and IString methods.\r
- It can therefore be exchanged with other Steinberg objects using one or both of these\r
-interfaces.\r
-\r
-\see String, ConstString\r
-*/\r
-//-----------------------------------------------------------------------------\r
-class StringObject : public FObject, public String, public IStringResult, public IString\r
-{\r
-public:\r
-//-----------------------------------------------------------------------------\r
- StringObject () {}\r
- StringObject (const char16* str, int32 n = -1, bool isTerminated = true) : String (str, n, isTerminated) {}\r
- StringObject (const char8* str, int32 n = -1, bool isTerminated = true) : String (str, n, isTerminated) {}\r
- StringObject (const StringObject& str, int32 n = -1) : String (str, n) {}\r
- StringObject (const String& str, int32 n = -1) : String (str, n) {}\r
- StringObject (const FVariant& var) : String (var) {}\r
-\r
- using String::operator=;\r
-\r
- // IStringResult ----------------------------------------------------------\r
- virtual void PLUGIN_API setText (const char8* text) SMTG_OVERRIDE;\r
- //-------------------------------------------------------------------------\r
-\r
- // IString-----------------------------------------------------------------\r
- virtual void PLUGIN_API setText8 (const char8* text) SMTG_OVERRIDE;\r
- virtual void PLUGIN_API setText16 (const char16* text) SMTG_OVERRIDE;\r
-\r
- virtual const char8* PLUGIN_API getText8 () SMTG_OVERRIDE;\r
- virtual const char16* PLUGIN_API getText16 () SMTG_OVERRIDE;\r
-\r
- virtual void PLUGIN_API take (void* s, bool _isWide) SMTG_OVERRIDE;\r
- virtual bool PLUGIN_API isWideString () const SMTG_OVERRIDE;\r
- //-------------------------------------------------------------------------\r
-\r
- OBJ_METHODS (StringObject, FObject)\r
- FUNKNOWN_METHODS2 (IStringResult, IString, FObject)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/updatehandler.cpp\r
-// Created by : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "base/source/updatehandler.h"\r
-#include "base/source/classfactoryhelpers.h"\r
-#include "base/source/fstring.h"\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-#include <unordered_map>\r
-#else\r
-#include <map>\r
-#endif\r
-#include <deque>\r
-#include <vector>\r
-#include <algorithm>\r
-\r
-#define NON_EXISTING_DEPENDENCY_CHECK 0 // not yet\r
-#define CLASS_NAME_TRACKED DEVELOPMENT\r
-\r
-using Steinberg::Base::Thread::FGuard;\r
-\r
-namespace Steinberg {\r
-\r
-DEF_CLASS_IID (IUpdateManager)\r
-bool UpdateHandler::lockUpdates = false;\r
-\r
-namespace Update {\r
-const uint32 kHashSize = (1 << 8); // must be power of 2 (16 bytes * 256 == 4096)\r
-const uint32 kMapSize = 1024 * 10;\r
-\r
-//------------------------------------------------------------------------\r
-inline uint32 hashPointer (void* p)\r
-{\r
- return (uint32)((uint64 (p) >> 12) & (kHashSize - 1));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline IPtr<FUnknown> getUnknownBase (FUnknown* unknown)\r
-{\r
- FUnknown* result = nullptr;\r
- if (unknown)\r
- unknown->queryInterface (FUnknown::iid, (void**)&result);\r
-\r
- return owned (result);\r
-}\r
-\r
-#if CLASS_NAME_TRACKED\r
-//------------------------------------------------------------------------\r
-struct Dependency\r
-{\r
- Dependency (FUnknown* o, IDependent* d)\r
- : obj (o), dep (d), objClass (nullptr), depClass (nullptr)\r
- {\r
- }\r
-\r
- inline bool operator== (const Dependency& d) const { return obj == d.obj; }\r
- inline bool operator!= (const Dependency& d) const { return obj != d.obj; }\r
- inline bool operator< (const Dependency& d) const { return obj < d.obj; }\r
- inline bool operator> (const Dependency& d) const { return obj > d.obj; }\r
- FUnknown* obj;\r
- IDependent* dep;\r
-\r
- FClassID objClass;\r
- FClassID depClass;\r
-};\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-struct DeferedChange\r
-{\r
- DeferedChange (FUnknown* o, int32 m = 0) : obj (o), msg (m) {}\r
- ~DeferedChange () {}\r
- DeferedChange (const DeferedChange& r) : obj (r.obj), msg (r.msg) {}\r
- inline bool operator== (const DeferedChange& d) const { return obj == d.obj; }\r
- inline bool operator!= (const DeferedChange& d) const { return obj != d.obj; }\r
- FUnknown* obj;\r
- int32 msg;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-struct UpdateData\r
-{\r
- UpdateData (FUnknown* o, IDependent** d, uint32 c)\r
- : obj (o), dependents (d), count (c)\r
- {\r
- }\r
- FUnknown* obj;\r
- IDependent** dependents;\r
- uint32 count;\r
- bool operator== (const UpdateData& d) const\r
- {\r
- return d.obj == obj && d.dependents == dependents;\r
- }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-typedef std::deque<DeferedChange> DeferedChangeList;\r
-typedef DeferedChangeList::const_iterator DeferedChangeListIterConst;\r
-typedef DeferedChangeList::iterator DeferedChangeListIter;\r
-\r
-typedef std::deque<UpdateData> UpdateDataList;\r
-typedef UpdateDataList::const_iterator UpdateDataListIterConst;\r
-\r
-#if CLASS_NAME_TRACKED\r
-typedef std::vector<Dependency> DependentList;\r
-#else\r
-typedef std::vector<IDependent*> DependentList;\r
-#endif\r
-typedef DependentList::iterator DependentListIter;\r
-typedef DependentList::const_iterator DependentListIterConst;\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-typedef std::unordered_map<const FUnknown*, DependentList> DependentMap;\r
-#else\r
-typedef std::map<const FUnknown*, DependentList> DependentMap;\r
-#endif\r
-typedef DependentMap::iterator DependentMapIter;\r
-typedef DependentMap::const_iterator DependentMapIterConst;\r
-\r
-struct Table\r
-{\r
- DependentMap depMap[kHashSize];\r
- DeferedChangeList defered;\r
- UpdateDataList updateData;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-void updateDone (FUnknown* unknown, int32 message)\r
-{\r
- if (message != IDependent::kDestroyed)\r
- {\r
- FObject* obj = FObject::unknownToObject (unknown);\r
- if (obj)\r
- obj->updateDone (message);\r
- }\r
-}\r
-} // namespace Update\r
-\r
-//------------------------------------------------------------------------\r
-static int32 countEntries (Update::DependentMap& map)\r
-{\r
- int32 total = 0;\r
- Update::DependentMapIterConst iterMap = map.begin ();\r
- while (iterMap != map.end ())\r
- {\r
- const Update::DependentList& list = iterMap->second;\r
- Update::DependentListIterConst iterList = list.begin ();\r
- while (iterList != list.end ())\r
- {\r
- total++;\r
- ++iterList;\r
- }\r
- ++iterMap;\r
- }\r
- return total;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UpdateHandler::UpdateHandler ()\r
-{\r
- table = NEW Update::Table;\r
- if (FObject::getUpdateHandler () == nullptr)\r
- FObject::setUpdateHandler (this);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UpdateHandler::~UpdateHandler ()\r
-{\r
- if (FObject::getUpdateHandler () == this)\r
- FObject::setUpdateHandler (nullptr);\r
- delete table;\r
- table = nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::addDependent (FUnknown* u, IDependent* _dependent)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (!unknown || !_dependent)\r
- return kResultFalse;\r
-\r
- FGuard guard (lock);\r
-\r
-#if CLASS_NAME_TRACKED\r
- Update::Dependency dependent (unknown, _dependent);\r
-\r
- FObject* obj = FObject::unknownToObject (unknown);\r
- if (obj)\r
- dependent.objClass = obj->isA ();\r
- obj = FObject::unknownToObject (_dependent);\r
- if (obj)\r
- dependent.depClass = obj->isA ();\r
-#else\r
- IDependent* dependent = _dependent;\r
-#endif\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIter it = map.find (unknown);\r
- if (it == map.end ())\r
- {\r
- Update::DependentList list;\r
- list.push_back (dependent);\r
- map[unknown] = list;\r
- }\r
- else\r
- {\r
- (*it).second.push_back (dependent);\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::removeDependent (FUnknown* u, IDependent* dependent)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (unknown == nullptr && dependent == nullptr)\r
- return kResultFalse;\r
-\r
- FGuard guard (lock);\r
-\r
- Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
- while (iter != table->updateData.end ())\r
- {\r
- if ((*iter).obj == unknown || unknown == nullptr)\r
- {\r
- for (uint32 count = 0; count < (*iter).count; count++)\r
- {\r
- if ((*iter).dependents[count] == dependent)\r
- (*iter).dependents[count] = 0;\r
- }\r
- }\r
- ++iter;\r
- }\r
- // Remove all objects for the given dependent\r
- if (unknown == nullptr)\r
- {\r
- for (uint32 j = 0; j < Update::kHashSize; j++)\r
- {\r
- Update::DependentMap& map = table->depMap[j];\r
- Update::DependentMapIter iterMap = map.begin ();\r
- while (iterMap != map.end ())\r
- {\r
- Update::DependentList& list = (*iterMap).second;\r
- Update::DependentListIter iterList = list.begin ();\r
- while (iterList != list.end ())\r
- {\r
-#if CLASS_NAME_TRACKED\r
- if ((*iterList).dep == dependent)\r
-#else\r
- if ((*iterList) == dependent)\r
-#endif\r
- {\r
- iterList = list.erase (iterList);\r
- }\r
- else\r
- {\r
- ++iterList;\r
- }\r
- }\r
- ++iterMap;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- bool mustFlush = true;\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIter iterList = map.find (unknown);\r
-\r
-#if NON_EXISTING_DEPENDENCY_CHECK\r
- SMTG_ASSERT (iterList != map.end () && "ERROR: Trying to remove a non existing dependency!")\r
-#endif\r
- if (iterList != map.end ())\r
- {\r
- if (dependent == nullptr) // Remove all dependents of object\r
- {\r
- map.erase (iterList);\r
- }\r
- else // Remove one dependent\r
- {\r
- int32 eraseCount = 0;\r
- Update::DependentList& dependentlist = (*iterList).second;\r
- Update::DependentListIter iterDependentlist = dependentlist.begin ();\r
- while (iterDependentlist != dependentlist.end ())\r
- {\r
-#if CLASS_NAME_TRACKED\r
- if ((*iterDependentlist).dep == dependent)\r
-#else\r
- if ((*iterDependentlist) == dependent)\r
-#endif\r
- {\r
- iterDependentlist = dependentlist.erase (iterDependentlist);\r
- eraseCount++;\r
- if (dependentlist.empty ())\r
- {\r
- map.erase (iterList);\r
- break;\r
- }\r
- }\r
- else\r
- {\r
- ++iterDependentlist;\r
- mustFlush = false;\r
- }\r
- }\r
- }\r
- }\r
- if (mustFlush)\r
- cancelUpdates (unknown);\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult UpdateHandler::doTriggerUpdates (FUnknown* u, int32 message, bool suppressUpdateDone)\r
-{\r
- if (lockUpdates)\r
- return kResultFalse;\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (!unknown)\r
- return kResultFalse;\r
-\r
- // to avoid crashes due to stack overflow, we reduce the amount of memory reserved for the\r
- // dependents\r
- IDependent* smallDependents[Update::kMapSize / 10]; // 8kB for x64\r
- IDependent** dependents = smallDependents;\r
- int32 maxDependents = Update::kMapSize / 10;\r
- int32 count = 0;\r
-\r
- {\r
- FGuard guard (lock); // scope for lock\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIterConst iterList = map.find (unknown);\r
- if (iterList != map.end ())\r
- {\r
- const Update::DependentList& dependentlist = (*iterList).second;\r
- Update::DependentListIterConst iterDependentlist = dependentlist.begin ();\r
- while (iterDependentlist != dependentlist.end ())\r
- {\r
-#if CLASS_NAME_TRACKED\r
- dependents[count] = (*iterDependentlist).dep;\r
-#else\r
- dependents[count] = *iterDependentlist;\r
-#endif\r
- count++;\r
-\r
- if (count >= maxDependents)\r
- {\r
- if (dependents == smallDependents)\r
- {\r
- dependents = new IDependent*[Update::kMapSize];\r
- memcpy (dependents, smallDependents, count * sizeof (dependents[0]));\r
- maxDependents = Update::kMapSize;\r
- }\r
- else\r
- {\r
- SMTG_WARNING ("Dependency overflow")\r
- break;\r
- }\r
- }\r
- ++iterDependentlist;\r
- }\r
- }\r
-\r
- // push update data on the stack\r
- if (count > 0)\r
- {\r
- Update::UpdateData data (unknown, dependents, count);\r
- table->updateData.push_back (data);\r
- }\r
- } // end scope\r
-\r
- int32 i = 0;\r
- while (i < count)\r
- {\r
- if (dependents[i])\r
- dependents[i]->update (unknown, message);\r
- i++;\r
- }\r
-\r
- if (dependents != smallDependents)\r
- delete[] dependents;\r
-\r
- // remove update data from the stack\r
- if (count > 0)\r
- {\r
- FGuard guard (lock);\r
-\r
- table->updateData.pop_back ();\r
- }\r
-\r
- // send update done message\r
- if (suppressUpdateDone == false)\r
- Update::updateDone (unknown, message);\r
-\r
- return count > 0 ? kResultTrue : kResultFalse; // Object was found and has been updated\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::triggerUpdates (FUnknown* u, int32 message)\r
-{\r
- return doTriggerUpdates (u, message, false);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::deferUpdates (FUnknown* u, int32 message)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (!unknown)\r
- return kResultFalse;\r
-\r
- FGuard guard (lock);\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIterConst iterList = map.find (unknown);\r
-\r
- bool hasDependency = (iterList != map.end ());\r
- if (hasDependency == false)\r
- {\r
- Update::updateDone (unknown, message);\r
- return kResultTrue;\r
- }\r
-\r
- bool found = false;\r
- Update::DeferedChangeListIterConst iter = table->defered.begin ();\r
- while (iter != table->defered.end ())\r
- {\r
- if ((*iter).obj == unknown && (*iter).msg == message)\r
- {\r
- found = true;\r
- break;\r
- }\r
- ++iter;\r
- }\r
-\r
- if (!found)\r
- {\r
- Update::DeferedChange change (unknown, message);\r
- table->defered.push_back (change);\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::triggerDeferedUpdates (FUnknown* unknown)\r
-{\r
- Update::DeferedChangeList deferedAgain;\r
- if (!unknown)\r
- {\r
- while (table->defered.empty () == false)\r
- {\r
- // Remove first from queue\r
- lock.lock ();\r
-\r
- FUnknown* obj = table->defered.front ().obj;\r
- int32 msg = table->defered.front ().msg;\r
- table->defered.pop_front ();\r
-\r
- // check if this object is currently being updated. in this case, defer update again...\r
- bool canSignal = true;\r
- Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
- while (iter != table->updateData.end ())\r
- {\r
- if ((*iter).obj == obj)\r
- {\r
- canSignal = false;\r
- break;\r
- }\r
- ++iter;\r
- }\r
- lock.unlock ();\r
-\r
- if (canSignal)\r
- {\r
- triggerUpdates (obj, msg);\r
- }\r
- else\r
- {\r
- Update::DeferedChange change (obj, msg);\r
- deferedAgain.push_back (change);\r
- }\r
- }\r
- }\r
- else\r
- {\r
- IPtr<FUnknown> object = Update::getUnknownBase (unknown);\r
- Update::DeferedChange tmp (object);\r
-\r
- while (true)\r
- {\r
- lock.lock ();\r
- Update::DeferedChangeListIter it =\r
- std::find (table->defered.begin (), table->defered.end (), tmp);\r
- if (it == table->defered.end ())\r
- {\r
- lock.unlock ();\r
- return kResultTrue;\r
- }\r
-\r
- if ((*it).obj != nullptr)\r
- {\r
- int32 msg = (*it).msg;\r
- table->defered.erase (it);\r
-\r
- // check if this object is currently being updated. in this case, defer update\r
- // again...\r
- bool canSignal = true;\r
- Update::UpdateDataListIterConst iter = table->updateData.begin ();\r
- while (iter != table->updateData.end ())\r
- {\r
- if ((*iter).obj == object)\r
- {\r
- canSignal = false;\r
- break;\r
- }\r
- ++iter;\r
- }\r
- lock.unlock ();\r
-\r
- if (canSignal)\r
- {\r
- triggerUpdates (object, msg);\r
- }\r
- else\r
- {\r
- Update::DeferedChange change (object, msg);\r
- deferedAgain.push_back (change);\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (deferedAgain.empty () == false)\r
- {\r
- FGuard guard (lock);\r
-\r
- Update::DeferedChangeListIterConst iter = deferedAgain.begin ();\r
- while (iter != deferedAgain.end ())\r
- {\r
- table->defered.push_back (*iter);\r
- ++iter;\r
- }\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API UpdateHandler::cancelUpdates (FUnknown* u)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (!unknown)\r
- return kResultFalse;\r
-\r
- FGuard guard (lock);\r
-\r
- Update::DeferedChange change (unknown, 0);\r
- while (1)\r
- {\r
- auto iter = std::find (table->defered.begin (), table->defered.end (), change);\r
- if (iter != table->defered.end ())\r
- table->defered.erase (iter);\r
- else\r
- break;\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-size_t UpdateHandler::countDependencies (FUnknown* object)\r
-{\r
- FGuard guard (lock);\r
- uint32 res = 0;\r
-\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (object);\r
- if (unknown)\r
- {\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIter iterList = map.find (unknown);\r
- if (iterList != map.end ())\r
- return iterList->second.size ();\r
- }\r
- else\r
- {\r
- for (uint32 j = 0; j < Update::kHashSize; j++)\r
- {\r
- Update::DependentMap& map = table->depMap[j];\r
- res += countEntries (map);\r
- }\r
- }\r
- return res;\r
-}\r
-\r
-#if DEVELOPMENT\r
-//------------------------------------------------------------------------\r
-bool UpdateHandler::checkDeferred (FUnknown* object)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (object);\r
-\r
- FGuard guard (lock);\r
-\r
- Update::DeferedChange tmp (unknown);\r
- Update::DeferedChangeListIterConst it =\r
- std::find (table->defered.begin (), table->defered.end (), tmp);\r
- if (it != table->defered.end ())\r
- return true;\r
-\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UpdateHandler::hasDependencies (FUnknown* u)\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (u);\r
- if (!unknown)\r
- return false;\r
-\r
- FGuard guard (lock);\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIterConst iterList = map.find (unknown);\r
- bool hasDependency = (iterList != map.end ());\r
-\r
- return hasDependency;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void UpdateHandler::printForObject (FObject* obj) const\r
-{\r
- IPtr<FUnknown> unknown = Update::getUnknownBase (obj);\r
- if (!unknown)\r
- return;\r
-\r
- FUnknownPtr<IDependent> dep (obj);\r
-\r
- bool header = false;\r
-\r
- Update::DependentMap& map = table->depMap[Update::hashPointer (unknown)];\r
- Update::DependentMapIterConst iterList = map.begin ();\r
- while (iterList != map.end ())\r
- {\r
- const Update::DependentList& dependentlist = (*iterList).second;\r
- Update::DependentListIterConst iterDependentlist = dependentlist.begin ();\r
- while (iterDependentlist != dependentlist.end ())\r
- {\r
-#if CLASS_NAME_TRACKED\r
- if ((*iterList).first == unknown || (*iterDependentlist).dep == dep.getInterface ())\r
- {\r
- if (!header)\r
- {\r
- FDebugPrint ("Dependencies for object %8" FORMAT_INT64A " %s\n", (uint64)obj,\r
- obj->isA ());\r
- header = true;\r
- }\r
- FDebugPrint ("%s %8" FORMAT_INT64A "\n <- %s %8" FORMAT_INT64A "\n",\r
- (*iterDependentlist).depClass, (uint64) (*iterDependentlist).dep,\r
- (*iterDependentlist).objClass, (uint64) ((*iterList).first));\r
- }\r
-#else\r
- if ((*iterList).first == unknown || (*iterDependentlist) == dep.getInterface ())\r
- {\r
- if (!header)\r
- {\r
- FDebugPrint ("Dependencies for object %8" FORMAT_INT64A " %s\n", (uint64)obj,\r
- obj->isA ());\r
- header = true;\r
- }\r
- FDebugPrint ("%8" FORMAT_INT64A "\n <- %8" FORMAT_INT64A "\n",\r
- (uint64) (*iterDependentlist), (uint64) ((*iterList).first));\r
- }\r
-#endif\r
- ++iterDependentlist;\r
- }\r
-\r
- ++iterList;\r
- }\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/source/updatehandler.h\r
-// Created by : Steinberg, 2008\r
-// Description :\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/thread/include/flock.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-\r
-namespace Steinberg {\r
-\r
-/// @cond ignore\r
-namespace Update { struct Table; }\r
-/// @endcond\r
-\r
-//------------------------------------------------------------------------\r
-/** Handle Send and Cancel pending message for a given object*/\r
-//------------------------------------------------------------------------\r
-class IUpdateManager : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** cancel pending messages send by \param object or by any if object is 0 */\r
- virtual tresult PLUGIN_API cancelUpdates (FUnknown* object) = 0;\r
- /** send pending messages send by \param object or by any if object is 0 */\r
- virtual tresult PLUGIN_API triggerDeferedUpdates (FUnknown* object = 0) = 0;\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUpdateManager, 0x030B780C, 0xD6E6418D, 0x8CE00BC2, 0x09C834D4)\r
-\r
-//------------------------------------------------------------------------------\r
-/**\r
-UpdateHandler implements IUpdateManager and IUpdateHandler to handle dependencies\r
-between objects to store and forward messages to dependent objects.\r
-\r
-This implementation is thread save, so objects can send message, add or remove\r
-dependents from different threads.\r
-Do do so it uses mutex, so be aware of locking.\r
-*/\r
-//------------------------------------------------------------------------------\r
-class UpdateHandler : public FObject, public IUpdateHandler, public IUpdateManager\r
-{\r
-public:\r
-//------------------------------------------------------------------------------\r
- UpdateHandler ();\r
- ~UpdateHandler ();\r
-\r
- using FObject::addDependent;\r
- using FObject::removeDependent;\r
- using FObject::deferUpdate;\r
-\r
- // IUpdateHandler\r
- /** register \param dependent to get messages from \param object */\r
- virtual tresult PLUGIN_API addDependent (FUnknown* object, IDependent* dependent) SMTG_OVERRIDE;\r
- /** unregister \param dependent to get no messages from \param object */\r
- virtual tresult PLUGIN_API removeDependent (FUnknown* object,\r
- IDependent* dependent) SMTG_OVERRIDE;\r
- /** send \param message to all dependents of \param object immediately */\r
- virtual tresult PLUGIN_API triggerUpdates (FUnknown* object, int32 message) SMTG_OVERRIDE;\r
- /** send \param message to all dependents of \param object when idle */\r
- virtual tresult PLUGIN_API deferUpdates (FUnknown* object, int32 message) SMTG_OVERRIDE;\r
-\r
- // IUpdateManager\r
- /** cancel pending messages send by \param object or by any if object is 0 */\r
- virtual tresult PLUGIN_API cancelUpdates (FUnknown* object) SMTG_OVERRIDE;\r
- /** send pending messages send by \param object or by any if object is 0 */\r
- virtual tresult PLUGIN_API triggerDeferedUpdates (FUnknown* object = 0) SMTG_OVERRIDE;\r
-\r
- /// @cond ignore\r
- // obsolete functions kept for compatibility\r
- void checkUpdates (FObject* object = nullptr) { triggerDeferedUpdates (object->unknownCast ()); }\r
- void flushUpdates (FObject* object) { cancelUpdates (object->unknownCast ()); }\r
- void deferUpdate (FObject* object, int32 message)\r
- {\r
- deferUpdates (object->unknownCast (), message);\r
- }\r
- void signalChange (FObject* object, int32 message, bool suppressUpdateDone = false)\r
- {\r
- doTriggerUpdates (object->unknownCast (), message, suppressUpdateDone);\r
- }\r
-#if DEVELOPMENT\r
- bool checkDeferred (FUnknown* object);\r
- bool hasDependencies (FUnknown* object);\r
- void printForObject (FObject* object) const;\r
-#endif\r
- /// @endcond\r
- size_t countDependencies (FUnknown* object = nullptr);\r
-\r
- OBJ_METHODS (UpdateHandler, FObject)\r
- FUNKNOWN_METHODS2 (IUpdateHandler, IUpdateManager, FObject)\r
- SINGLETON (UpdateHandler)\r
-//------------------------------------------------------------------------------\r
-private:\r
- tresult doTriggerUpdates (FUnknown* object, int32 message, bool suppressUpdateDone);\r
-\r
- Steinberg::Base::Thread::FLock lock;\r
- Update::Table* table = nullptr;\r
- friend struct LockUpdateDependencies;\r
- static bool lockUpdates;\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/thread/include/flock.h\r
-// Created by : Steinberg, 1995\r
-// Description : locks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------------\r
-/** @file base/thread/include/flock.h\r
- Locks. */\r
-/** @defgroup baseLocks Locks */\r
-//----------------------------------------------------------------------------------\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "pluginterfaces/base/ftypes.h"\r
-\r
-#if SMTG_PTHREADS\r
-#include <pthread.h>\r
-\r
-#elif SMTG_OS_WINDOWS\r
-struct CRITSECT // CRITICAL_SECTION\r
-{\r
- void* DebugInfo; // PRTL_CRITICAL_SECTION_DEBUG DebugInfo;\r
- Steinberg::int32 LockCount; // LONG LockCount;\r
- Steinberg::int32 RecursionCount; // LONG RecursionCount;\r
- void* OwningThread; // HANDLE OwningThread\r
- void* LockSemaphore; // HANDLE LockSemaphore\r
- Steinberg::int32 SpinCount; // ULONG_PTR SpinCount\r
-};\r
-#endif\r
-\r
-namespace Steinberg {\r
-namespace Base {\r
-namespace Thread {\r
-\r
-//------------------------------------------------------------------------\r
-/** Lock interface declaration.\r
-@ingroup baseLocks */\r
-//------------------------------------------------------------------------\r
-struct ILock\r
-{\r
-//------------------------------------------------------------------------\r
- virtual ~ILock () {}\r
-\r
- /** Enables lock. */\r
- virtual void lock () = 0;\r
-\r
- /** Disables lock. */\r
- virtual void unlock () = 0;\r
-\r
- /** Tries to disable lock. */\r
- virtual bool trylock () = 0;\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** FLock declaration.\r
-@ingroup baseLocks */\r
-//------------------------------------------------------------------------\r
-class FLock : public ILock\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
- /** Lock constructor.\r
- * @param name lock name\r
- */\r
- FLock (const char8* name = "FLock");\r
-\r
- /** Lock destructor. */\r
- ~FLock ();\r
-\r
- //-- ILock -----------------------------------------------------------\r
- virtual void lock () SMTG_OVERRIDE;\r
- virtual void unlock () SMTG_OVERRIDE;\r
- virtual bool trylock () SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
-#if SMTG_PTHREADS\r
- pthread_mutex_t mutex; ///< Mutex object\r
-\r
-#elif SMTG_OS_WINDOWS\r
- CRITSECT section; ///< Critical section object\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** FLockObj declaration. Reference counted lock\r
-@ingroup baseLocks */\r
-//------------------------------------------------------------------------\r
-class FLockObject : public FObject, public FLock\r
-{\r
-public:\r
- OBJ_METHODS (FLockObject, FObject)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** FGuard - automatic object for locks.\r
-@ingroup baseLocks */\r
-//------------------------------------------------------------------------\r
-class FGuard\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
- /** FGuard constructor.\r
- * @param _lock guard this lock\r
- */\r
- FGuard (ILock& _lock) : lock (_lock) { lock.lock (); }\r
-\r
- /** FGuard destructor. */\r
- ~FGuard () { lock.unlock (); }\r
-\r
-//------------------------------------------------------------------------\r
-private:\r
- ILock& lock; ///< guarded lock\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Conditional Guard - Locks only if valid lock is passed.\r
-@ingroup baseLocks */\r
-//------------------------------------------------------------------------\r
-class FConditionalGuard\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
-\r
- /** FConditionGuard constructor.\r
- * @param _lock guard this lock\r
- */\r
- FConditionalGuard (FLock* _lock) : lock (_lock)\r
- {\r
- if (lock)\r
- lock->lock ();\r
- }\r
-\r
- /** FConditionGuard destructor. */\r
- ~FConditionalGuard ()\r
- {\r
- if (lock)\r
- lock->unlock ();\r
- }\r
-\r
-//------------------------------------------------------------------------\r
-private:\r
- FLock* lock; ///< guarded lock\r
-};\r
-\r
-} // Thread\r
-} // Base\r
-} // Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : SDK Base\r
-// Version : 1.0\r
-//\r
-// Category : Helpers\r
-// Filename : base/thread/source/flock.cpp\r
-// Created by : Steinberg, 1995\r
-// Description : Locks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#define DEBUG_LOCK 0\r
-\r
-#include "base/thread/include/flock.h"\r
-#include "base/source/fdebug.h"\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-//------------------------------------------------------------------------\r
-#ifndef WINVER\r
-#define WINVER 0x0500\r
-#endif\r
-#ifndef _WIN32_WINNT\r
-#define _WIN32_WINNT WINVER\r
-#endif\r
-\r
-#include <windows.h>\r
-#include <objbase.h>\r
-#define INIT_CS(cs) \\r
- InitializeCriticalSection ((LPCRITICAL_SECTION)&cs);\r
-\r
-#endif\r
-\r
-namespace Steinberg {\r
-namespace Base {\r
-namespace Thread {\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// FLock implementation\r
-//------------------------------------------------------------------------\r
-FLock::FLock (const char8* /*name*/)\r
-{\r
-#if SMTG_PTHREADS\r
- pthread_mutexattr_t mutexAttr;\r
- pthread_mutexattr_init (&mutexAttr);\r
- pthread_mutexattr_settype (&mutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
- if (pthread_mutex_init (&mutex, &mutexAttr) != 0)\r
- {SMTG_WARNING("mutex_init failed")}\r
- pthread_mutexattr_destroy (&mutexAttr);\r
-\r
-#elif SMTG_OS_WINDOWS\r
- INIT_CS (section)\r
-#else\r
-#warning implement FLock!\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FLock::~FLock ()\r
-{\r
-#if SMTG_PTHREADS\r
- pthread_mutex_destroy (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
- DeleteCriticalSection ((LPCRITICAL_SECTION)§ion);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FLock::lock ()\r
-{\r
-#if DEBUG_LOCK\r
- FDebugPrint ("FLock::lock () %x\n", this);\r
-#endif\r
-\r
-#if SMTG_PTHREADS\r
- pthread_mutex_lock (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
- EnterCriticalSection ((LPCRITICAL_SECTION)§ion);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FLock::unlock ()\r
-{\r
-#if DEBUG_LOCK\r
- FDebugPrint ("FLock::unlock () %x\n", this);\r
-#endif\r
-\r
-#if SMTG_PTHREADS\r
- pthread_mutex_unlock (&mutex);\r
-\r
-#elif SMTG_OS_WINDOWS\r
- LeaveCriticalSection ((LPCRITICAL_SECTION)§ion);\r
-\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FLock::trylock ()\r
-{\r
-#if SMTG_PTHREADS\r
- return pthread_mutex_trylock (&mutex) == 0;\r
-\r
-#elif SMTG_OS_WINDOWS\r
- return TryEnterCriticalSection ((LPCRITICAL_SECTION)§ion) != 0 ? true : false;\r
-\r
-#else\r
- return false;\r
-#endif\r
-}\r
-\r
-} // Thread\r
-} // Base\r
-} // Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-This license applies only to files referencing this license,\r
-for other files of the Software Development Kit the respective embedded license text\r
-is applicable. The license can be found at: www.steinberg.net/sdklicenses_vst3\r
-\r
-This Software Development Kit is licensed under the terms of the Steinberg VST3 License,\r
-or alternatively under the terms of the General Public License (GPL) Version 3.\r
-You may use the Software Development Kit according to either of these licenses as it is\r
-most appropriate for your project on a case-by-case basis (commercial or not).\r
-\r
-a) Proprietary Steinberg VST3 License\r
-The Software Development Kit may not be distributed in parts or its entirety\r
-without prior written agreement by Steinberg Media Technologies GmbH.\r
-The SDK must not be used to re-engineer or manipulate any technology used\r
-in any Steinberg or Third-party application or software module,\r
-unless permitted by law.\r
-Neither the name of the Steinberg Media Technologies GmbH nor the names of its\r
-contributors may be used to endorse or promote products derived from this\r
-software without specific prior written permission.\r
-Before publishing a software under the proprietary license, you need to obtain a copy\r
-of the License Agreement signed by Steinberg Media Technologies GmbH.\r
-The Steinberg VST SDK License Agreement can be found at:\r
-www.steinberg.net/en/company/developers.html\r
-\r
-THE SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-IN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLE FOR ANY DIRECT,\r
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-b) General Public License (GPL) Version 3\r
-Details of these licenses can be found at: www.gnu.org/licenses/gpl-3.0.html\r
-//----------------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/conststringtable.cpp\r
-// Created by : Steinberg, 09/2007\r
-// Description : constant unicode string table\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "conststringtable.h"\r
-#include <cstring>\r
-#include <map>\r
-\r
-namespace Steinberg {\r
-\r
-static std::map<const char8*, char16*>* stringMap;\r
-static std::map<const char8, char16>* charMap;\r
-\r
-static char16* generateUTF16 (const char8* str);\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable* ConstStringTable::instance ()\r
-{\r
- static ConstStringTable stringTable;\r
- return &stringTable;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-const char16* ConstStringTable::getString (const char8* str) const\r
-{\r
- std::map<const char8*, char16*>::iterator iter = stringMap->find (str);\r
- if (iter != stringMap->end ())\r
- return iter->second;\r
- char16* uStr = generateUTF16 (str);\r
- stringMap->insert (std::make_pair (str, uStr));\r
- return uStr;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-const char16 ConstStringTable::getString (const char8 str) const\r
-{\r
- std::map<const char8, char16>::iterator iter = charMap->find (str);\r
- if (iter != charMap->end ())\r
- return iter->second;\r
- char16 uStr = 0;\r
-#if BYTEORDER == kBigEndian\r
- char8* puStr = (char8*)&uStr;\r
- puStr[1] = str;\r
-#else\r
- uStr = str;\r
-#endif\r
- charMap->insert (std::make_pair (str, uStr));\r
- return uStr;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable::ConstStringTable ()\r
-{\r
- stringMap = new std::map<const char8*, char16*>;\r
- charMap = new std::map<const char8, char16>;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-ConstStringTable::~ConstStringTable ()\r
-{\r
- // free out allocated strings\r
- {\r
- std::map<const char8*, char16*>::iterator iter = stringMap->begin ();\r
- while (iter != stringMap->end ())\r
- {\r
- delete[] iter->second;\r
- iter++;\r
- }\r
- } // delete iterator on map before deleting the map\r
-\r
- delete stringMap;\r
- delete charMap;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-char16* generateUTF16 (const char8* str)\r
-{\r
- int32 len = (int32)strlen (str);\r
- char16* result = new char16[len + 1];\r
- for (int32 i = 0; i < len; i++)\r
- {\r
-#if BYTEORDER == kBigEndian\r
- char8* pChr = (char8*)&result[i];\r
- pChr[0] = 0;\r
- pChr[1] = str[i];\r
-#else\r
- result[i] = str[i];\r
-#endif\r
- }\r
- result[len] = 0;\r
- return result;\r
-}\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/conststringtable.h\r
-// Created by : Steinberg, 09/2007\r
-// Description : constant unicode string table\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Constant unicode string table.\r
-Used for conversion from ASCII string literals to char16.\r
-*/\r
-//------------------------------------------------------------------------\r
-class ConstStringTable\r
-{\r
-public:\r
- static ConstStringTable* instance ();\r
-\r
- /** Returns a char16 string of a ASCII string literal*/\r
- const char16* getString (const char8* str) const;\r
- /** Returns a char16 character of a ASCII character */\r
- const char16 getString (const char8 str) const;\r
-\r
-protected:\r
- ConstStringTable ();\r
- ~ConstStringTable ();\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interface IID definitions\r
-// Filename : pluginterfaces/base/coreiids.cpp\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/base/iupdatehandler.h"\r
-#include "pluginterfaces/base/icloneable.h"\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-\r
-DEF_CLASS_IID (FUnknown)\r
-\r
-DEF_CLASS_IID (ICloneable)\r
-\r
-DEF_CLASS_IID (IDependent)\r
-DEF_CLASS_IID (IUpdateHandler)\r
-\r
-DEF_CLASS_IID (IBStream)\r
-DEF_CLASS_IID (ISizeableStream)\r
-\r
-//------------------------------------------------------------------------\r
-} // Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/falignpop.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Restore alignment settings\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-//---------------------------------------------------------------------------------------------------\r
-#if SMTG_OS_MACOS\r
- #if TARGET_API_MAC_CARBON\r
- #if SMTG_PLATFORM_64\r
- #pragma pack(pop)\r
- #else\r
- #pragma options align=reset\r
- #endif\r
- #endif\r
-#elif defined __BORLANDC__\r
- #pragma -a-\r
-#elif SMTG_OS_WINDOWS\r
- #pragma pack(pop)\r
-#endif\r
-//---------------------------------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/falignpush.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Set alignment settings\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------------------------\r
-#if SMTG_OS_MACOS\r
- #if TARGET_API_MAC_CARBON\r
- #if SMTG_PLATFORM_64\r
- #pragma pack(push, 16)\r
- #else\r
- #pragma options align=mac68k\r
- #endif\r
- #endif\r
-#elif defined __BORLANDC__\r
- #pragma -a8\r
-#elif SMTG_OS_WINDOWS\r
- #pragma pack(push)\r
- #if SMTG_PLATFORM_64\r
- #pragma pack(16)\r
- #else\r
- #pragma pack(8)\r
- #endif\r
-#endif\r
-//----------------------------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/fplatform.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Detect platform and set define\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#define kLittleEndian 0\r
-#define kBigEndian 1\r
-\r
-#undef PLUGIN_API\r
-\r
-#if !defined (__INTEL_CXX11_MODE__)\r
-#define SMTG_INTEL_CXX11_MODE 0\r
-#else\r
-#define SMTG_INTEL_CXX11_MODE __INTEL_CXX11_MODE__\r
-#endif\r
-\r
-#if !defined (__INTEL_COMPILER)\r
-#define SMTG_INTEL_COMPILER 0\r
-#else\r
-#define SMTG_INTEL_COMPILER __INTEL_COMPILER\r
-#endif\r
-\r
-//-----------------------------------------------------------------------------\r
-// WIN32 AND WIN64\r
-#if defined (_WIN32)\r
- #define SMTG_OS_LINUX 0\r
- #define SMTG_OS_MACOS 0\r
- #define SMTG_OS_WINDOWS 1\r
- #define SMTG_OS_IOS 0\r
- #define SMTG_OS_OSX 0\r
-\r
- #define BYTEORDER kLittleEndian\r
-\r
- #define COM_COMPATIBLE 1\r
- #define PLUGIN_API __stdcall\r
- #define SMTG_PTHREADS 0\r
-\r
- #ifndef _CRT_SECURE_NO_WARNINGS\r
- #define _CRT_SECURE_NO_WARNINGS\r
- #endif\r
-\r
- #pragma warning (disable : 4244) // Conversion from 'type1' to 'type2', possible loss of data.\r
- #pragma warning (disable : 4250) // Inheritance via dominance is allowed\r
- #pragma warning (disable : 4996) // deprecated functions\r
-\r
- #pragma warning (3 : 4189) // local variable is initialized but not referenced\r
- #pragma warning (3 : 4238) // nonstandard extension used : class rvalue used as lvalue\r
-\r
- #if defined (_WIN64) // WIN64 only\r
- #define SMTG_PLATFORM_64 1\r
- #else\r
- #define SMTG_PLATFORM_64 0\r
- #endif\r
-\r
- #ifndef WIN32\r
- #define WIN32 1\r
- #endif\r
-\r
- #ifdef __cplusplus\r
- #define SMTG_CPP11 __cplusplus >= 201103L || _MSC_VER > 1600 || SMTG_INTEL_CXX11_MODE\r
- #define SMTG_CPP11_STDLIBSUPPORT SMTG_CPP11\r
- #define SMTG_HAS_NOEXCEPT _MSC_VER >= 1900 || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1300)\r
- #endif\r
-//-----------------------------------------------------------------------------\r
-// LINUX\r
-#elif __gnu_linux__\r
- #define SMTG_OS_LINUX 1\r
- #define SMTG_OS_MACOS 0\r
- #define SMTG_OS_WINDOWS 0\r
- #define SMTG_OS_IOS 0\r
- #define SMTG_OS_OSX 0\r
-\r
- #include <endian.h>\r
- #if __BYTE_ORDER == __LITTLE_ENDIAN\r
- #define BYTEORDER kLittleEndian\r
- #else\r
- #define BYTEORDER kBigEndian\r
- #endif\r
-\r
- #define COM_COMPATIBLE 0\r
- #define PLUGIN_API\r
- #define SMTG_PTHREADS 1\r
-\r
- #if __LP64__\r
- #define SMTG_PLATFORM_64 1\r
- #else\r
- #define SMTG_PLATFORM_64 0\r
- #endif\r
- #ifdef __cplusplus\r
- #include <cstddef>\r
- #define SMTG_CPP11 (__cplusplus >= 201103L)\r
- #ifndef SMTG_CPP11\r
- #error unsupported compiler\r
- #endif\r
- #define SMTG_CPP11_STDLIBSUPPORT 1\r
- #define SMTG_HAS_NOEXCEPT 1\r
- #endif\r
-//-----------------------------------------------------------------------------\r
-// Mac and iOS\r
-#elif __APPLE__\r
- #include <TargetConditionals.h>\r
- #define SMTG_OS_LINUX 0\r
- #define SMTG_OS_MACOS 1\r
- #define SMTG_OS_WINDOWS 0\r
- #define SMTG_OS_IOS TARGET_OS_IPHONE\r
- #define SMTG_OS_OSX TARGET_OS_MAC && !TARGET_OS_IPHONE\r
-\r
- #if !SMTG_OS_IOS\r
- #ifndef __CF_USE_FRAMEWORK_INCLUDES__\r
- #define __CF_USE_FRAMEWORK_INCLUDES__\r
- #endif\r
- #ifndef TARGET_API_MAC_CARBON\r
- #define TARGET_API_MAC_CARBON 1\r
- #endif\r
- #endif\r
- #if __LP64__\r
- #define SMTG_PLATFORM_64 1\r
- #else\r
- #define SMTG_PLATFORM_64 0\r
- #endif\r
- #if defined (__BIG_ENDIAN__)\r
- #define BYTEORDER kBigEndian\r
- #else\r
- #define BYTEORDER kLittleEndian\r
- #endif\r
-\r
- #define COM_COMPATIBLE 0\r
- #define PLUGIN_API\r
- #define SMTG_PTHREADS 1\r
-\r
- #if !defined(__PLIST__) && !defined(SMTG_DISABLE_DEFAULT_DIAGNOSTICS)\r
- #ifdef __clang__\r
- #pragma GCC diagnostic ignored "-Wswitch-enum"\r
- #pragma GCC diagnostic ignored "-Wparentheses"\r
- #pragma GCC diagnostic ignored "-Wuninitialized"\r
- #if __clang_major__ >= 3\r
- #pragma GCC diagnostic ignored "-Wtautological-compare"\r
- #pragma GCC diagnostic ignored "-Wunused-value"\r
- #if __clang_major__ >= 4 || __clang_minor__ >= 1\r
- #pragma GCC diagnostic ignored "-Wswitch"\r
- #pragma GCC diagnostic ignored "-Wcomment"\r
- #endif\r
- #if __clang_major__ >= 5\r
- #pragma GCC diagnostic ignored "-Wunsequenced"\r
- #if __clang_minor__ >= 1\r
- #pragma GCC diagnostic ignored "-Wunused-const-variable"\r
- #endif\r
- #endif\r
- #endif\r
- #endif\r
- #endif\r
- #ifdef __cplusplus\r
- #include <cstddef>\r
- #define SMTG_CPP11 (__cplusplus >= 201103L || SMTG_INTEL_CXX11_MODE)\r
- #if defined (_LIBCPP_VERSION) && SMTG_CPP11\r
- #define SMTG_CPP11_STDLIBSUPPORT 1\r
- #define SMTG_HAS_NOEXCEPT 1\r
- #else\r
- #define SMTG_CPP11_STDLIBSUPPORT 0\r
- #define SMTG_HAS_NOEXCEPT 0\r
- #endif\r
- #endif\r
-#else\r
- #pragma error unknown platform\r
-\r
-#endif\r
-\r
-#if !SMTG_RENAME_ASSERT\r
-#undef WINDOWS\r
-#undef MAC\r
-#undef PTHREADS\r
-#undef PLATFORM_64\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define WINDOWS SMTG_OS_WINDOWS\r
-#endif\r
-#if SMTG_OS_MACOS\r
-#define MAC SMTG_OS_MACOS\r
-#endif\r
-#define PLATFORM_64 SMTG_PLATFORM_64\r
-#define PTHREADS SMTG_PTHREADS\r
-#endif\r
-//-----------------------------------------------------------------------------\r
-\r
-//-----------------------------------------------------------------------------\r
-#if SMTG_CPP11\r
-#define SMTG_OVERRIDE override\r
-#else\r
-#define SMTG_OVERRIDE\r
-#endif\r
-#if SMTG_HAS_NOEXCEPT\r
-#define SMTG_NOEXCEPT noexcept\r
-#else\r
-#define SMTG_NOEXCEPT\r
-#endif\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/fstrdefs.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Definitions for handling strings (Unicode / ASCII / Platforms)\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-//----------------------------------------------------------------------------\r
-// string methods defines unicode / ASCII\r
-//----------------------------------------------------------------------------\r
-\r
-// 16 bit string operations\r
-#if SMTG_CPP11 // if c++11 unicode string literals\r
- #define SMTG_CPP11_CAT_PRIVATE_DONT_USE(a,b) a ## b\r
- #if SMTG_OS_WINDOWS\r
- #define STR16(x) SMTG_CPP11_CAT_PRIVATE_DONT_USE(L,x)\r
- #else\r
- #define STR16(x) SMTG_CPP11_CAT_PRIVATE_DONT_USE(u,x)\r
- #endif\r
-#else\r
- #include "conststringtable.h"\r
- #define STR16(x) Steinberg::ConstStringTable::instance ()->getString (x)\r
-#endif\r
-\r
-#ifdef UNICODE\r
- #define STR(x) STR16(x)\r
- #define tStrBufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::tchar))\r
-\r
-#else\r
- #define STR(x) x\r
- #define tStrBufferSize(buffer) (sizeof(buffer))\r
-#endif\r
-\r
-#define str8BufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::char8))\r
-#define str16BufferSize(buffer) (sizeof(buffer)/sizeof(Steinberg::char16))\r
-\r
-#if SMTG_OS_WINDOWS\r
-#define FORMAT_INT64A "I64d"\r
-#define FORMAT_UINT64A "I64u"\r
-\r
-#elif SMTG_OS_MACOS || SMTG_OS_LINUX\r
-#define FORMAT_INT64A "lld"\r
-#define FORMAT_UINT64A "llu"\r
-#define stricmp strcasecmp\r
-#define strnicmp strncasecmp\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define FORMAT_INT64W STR(FORMAT_INT64A)\r
-#define FORMAT_UINT64W STR(FORMAT_UINT64A)\r
-\r
-#define FORMAT_INT64 FORMAT_INT64W\r
-#define FORMAT_UINT64 FORMAT_UINT64W\r
-#else\r
-#define FORMAT_INT64 FORMAT_INT64A\r
-#define FORMAT_UINT64 FORMAT_UINT64A\r
-#endif\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-// newline\r
-//----------------------------------------------------------------------------\r
-#if SMTG_OS_WINDOWS\r
-#define ENDLINE_A "\r\n"\r
-#define ENDLINE_W STR ("\r\n")\r
-#elif SMTG_OS_MACOS\r
-#define ENDLINE_A "\r"\r
-#define ENDLINE_W STR ("\r")\r
-#elif SMTG_OS_LINUX\r
-#define ENDLINE_A "\n"\r
-#define ENDLINE_W STR ("\n")\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define ENDLINE ENDLINE_W\r
-#else\r
-#define ENDLINE ENDLINE_A\r
-#endif\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__) && defined(_MSC_VER) && (_MSC_VER < 1900)\r
-#define stricmp _stricmp\r
-#define strnicmp _strnicmp\r
-#define snprintf _snprintf\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//----------------------------------------------------------------------------\r
-static const tchar kEmptyString[] = { 0 };\r
-static const char8 kEmptyString8[] = { 0 };\r
-static const char16 kEmptyString16[] = { 0 };\r
-\r
-#ifdef UNICODE\r
-static const tchar kInfiniteSymbol[] = { 0x221E, 0 };\r
-#else\r
-static const tchar* const kInfiniteSymbol = STR ("oo");\r
-#endif\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrlen (const T* wcs)\r
-{\r
- const T* eos = wcs;\r
-\r
- while (*eos++)\r
- ;\r
-\r
- return (int32) (eos - wcs - 1);\r
-}\r
-\r
-inline int32 tstrlen (const tchar* str) {return _tstrlen (str);}\r
-inline int32 strlen8 (const char8* str) {return _tstrlen (str);}\r
-inline int32 strlen16 (const char16* str) {return _tstrlen (str);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrcmp (const T* src, const T* dst)\r
-{\r
- while (*src == *dst && *dst)\r
- {\r
- src++;\r
- dst++;\r
- }\r
-\r
- if (*src == 0 && *dst == 0)\r
- return 0;\r
- else if (*src == 0)\r
- return -1;\r
- else if (*dst == 0)\r
- return 1;\r
- else\r
- return (int32) (*src - *dst);\r
-}\r
-\r
-inline int32 tstrcmp (const tchar* src, const tchar* dst) {return _tstrcmp (src, dst);}\r
-inline int32 strcmp8 (const char8* src, const char8* dst) {return _tstrcmp (src, dst);}\r
-inline int32 strcmp16 (const char16* src, const char16* dst) {return _tstrcmp (src, dst);}\r
-\r
-template <typename T>\r
-inline int32 strcmpT (const T* first, const T* last);\r
-\r
-template <>\r
-inline int32 strcmpT<char8> (const char8* first, const char8* last) { return _tstrcmp (first, last); }\r
-\r
-template <>\r
-inline int32 strcmpT<char16> (const char16* first, const char16* last) { return _tstrcmp (first, last); }\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline int32 _tstrncmp (const T* first, const T* last, uint32 count)\r
-{\r
- if (count == 0)\r
- return 0;\r
-\r
- while (--count && *first && *first == *last)\r
- {\r
- first++;\r
- last++;\r
- }\r
-\r
- if (*first == 0 && *last == 0)\r
- return 0;\r
- else if (*first == 0)\r
- return -1;\r
- else if (*last == 0)\r
- return 1;\r
- else\r
- return (int32) (*first - *last);\r
-}\r
-\r
-inline int32 tstrncmp (const tchar* first, const tchar* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-inline int32 strncmp8 (const char8* first, const char8* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-inline int32 strncmp16 (const char16* first, const char16* last, uint32 count) {return _tstrncmp (first, last, count);}\r
-\r
-template <typename T>\r
-inline int32 strncmpT (const T* first, const T* last, uint32 count);\r
-\r
-template <>\r
-inline int32 strncmpT<char8> (const char8* first, const char8* last, uint32 count) { return _tstrncmp (first, last, count); }\r
-\r
-template <>\r
-inline int32 strncmpT<char16> (const char16* first, const char16* last, uint32 count) {return _tstrncmp (first, last, count); }\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrcpy (T* dst, const T* src)\r
-{\r
- T* cp = dst;\r
- while ((*cp++ = *src++) != 0) // copy string\r
- ;\r
- return dst;\r
-}\r
-inline tchar* tstrcpy (tchar* dst, const tchar* src) {return _tstrcpy (dst, src);}\r
-inline char8* strcpy8 (char8* dst, const char8* src) {return _tstrcpy (dst, src);}\r
-inline char16* strcpy16 (char16* dst, const char16* src) {return _tstrcpy (dst, src);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrncpy (T* dest, const T* source, uint32 count)\r
-{\r
- T* start = dest;\r
- while (count && (*dest++ = *source++) != 0) // copy string\r
- count--;\r
-\r
- if (count) // pad out with zeros\r
- {\r
- while (--count)\r
- *dest++ = 0;\r
- }\r
- return start;\r
-}\r
-\r
-inline tchar* tstrncpy (tchar* dest, const tchar* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-inline char8* strncpy8 (char8* dest, const char8* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-inline char16* strncpy16 (char16* dest, const char16* source, uint32 count) {return _tstrncpy (dest, source, count);}\r
-\r
-//----------------------------------------------------------------------------\r
-template <class T>\r
-inline T* _tstrcat (T* dst, const T* src)\r
-{\r
- T* cp = dst;\r
-\r
- while (*cp)\r
- cp++; // find end of dst\r
-\r
- while ((*cp++ = *src++) != 0) // Copy src to end of dst\r
- ;\r
-\r
- return dst;\r
-}\r
-\r
-inline tchar* tstrcat (tchar* dst, const tchar* src) {return _tstrcat (dst, src); }\r
-inline char8* strcat8 (char8* dst, const char8* src) {return _tstrcat (dst, src); }\r
-inline char16* strcat16 (char16* dst, const char16* src) {return _tstrcat (dst, src); }\r
-\r
-//----------------------------------------------------------------------------\r
-inline void str8ToStr16 (char16* dst, const char8* src, int32 n = -1)\r
-{\r
- int32 i = 0;\r
- for (;;)\r
- {\r
- if (i == n)\r
- {\r
- dst[i] = 0;\r
- return;\r
- }\r
-\r
-#if BYTEORDER == kBigEndian\r
- char8* pChr = (char8*)&dst[i];\r
- pChr[0] = 0;\r
- pChr[1] = src[i];\r
-#else\r
- dst[i] = static_cast<char16> (src[i]);\r
-#endif\r
-\r
- if (src[i] == 0)\r
- break;\r
-\r
- i++;\r
- }\r
-\r
- while (n > i)\r
- {\r
- dst[i] = 0;\r
- i++;\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool FIDStringsEqual (FIDString id1, FIDString id2)\r
-{\r
- return (id1 && id2) ? (strcmp8 (id1, id2) == 0) : false;\r
-}\r
-\r
-static const uint32 kPrintfBufferSize = 4096;\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/ftypes.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic data types\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "fplatform.h"\r
-\r
-//#define UNICODE_OFF // disable / enable unicode\r
-\r
-#ifdef UNICODE_OFF\r
- #ifdef UNICODE\r
- #undef UNICODE\r
- #endif\r
-#else\r
- #define UNICODE 1\r
-#endif\r
-\r
-#ifdef UNICODE\r
-#define _UNICODE 1\r
-#endif\r
-\r
-namespace Steinberg\r
-{\r
-//-----------------------------------------------------------------\r
-// Integral Types\r
- typedef char int8;\r
- typedef unsigned char uint8;\r
- typedef unsigned char uchar;\r
-\r
- typedef short int16;\r
- typedef unsigned short uint16;\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__)\r
- typedef long int32;\r
- typedef unsigned long uint32;\r
-#else\r
- typedef int int32;\r
- typedef unsigned int uint32;\r
-#endif\r
-\r
- static const int32 kMaxLong = 0x7fffffff;\r
- static const int32 kMinLong = (-0x7fffffff - 1);\r
- static const int32 kMaxInt32 = kMaxLong;\r
- static const int32 kMinInt32 = kMinLong;\r
- static const uint32 kMaxInt32u = 0xffffffff;\r
-\r
-#if SMTG_OS_WINDOWS && !defined(__GNUC__)\r
- typedef __int64 int64;\r
- typedef unsigned __int64 uint64;\r
- static const int64 kMaxInt64 = 9223372036854775807i64;\r
- static const int64 kMinInt64 = (-9223372036854775807i64 - 1);\r
-#else\r
- typedef long long int64;\r
- typedef unsigned long long uint64;\r
- static const int64 kMaxInt64 = 0x7fffffffffffffffLL;\r
- static const int64 kMinInt64 = (-0x7fffffffffffffffLL-1);\r
-#endif\r
- static const uint64 kMaxInt64u = uint64 (0xffffffff) | (uint64 (0xffffffff) << 32);\r
-\r
-//-----------------------------------------------------------------\r
-// other Semantic Types\r
- typedef int64 TSize; // byte (or other) sizes\r
- typedef int32 tresult; // result code\r
-//-----------------------------------------------------------------\r
- static const float kMaxFloat = 3.40282346638528860E38;\r
- static const double kMaxDouble = 1.7976931348623158E308;\r
-\r
-#if SMTG_PLATFORM_64\r
- typedef uint64 TPtrInt;\r
-#else\r
- typedef uint32 TPtrInt;\r
-#endif\r
-\r
-//------------------------------------------------------------------\r
-// Boolean\r
- typedef uint8 TBool;\r
-\r
-//------------------------------------------------------------------\r
-// Char / Strings\r
- typedef char char8;\r
-#ifdef _NATIVE_WCHAR_T_DEFINED\r
- typedef __wchar_t char16;\r
-#elif SMTG_CPP11\r
- typedef char16_t char16;\r
-#else\r
- typedef int16 char16;\r
-#endif\r
-\r
-#ifdef UNICODE\r
- typedef char16 tchar;\r
-#else\r
- typedef char8 tchar;\r
-#endif\r
-\r
- typedef const char8* CStringA;\r
- typedef const char16* CStringW;\r
- typedef const tchar* CString;\r
- inline bool strEmpty (const tchar* str) { return (!str || *str == 0); }\r
- inline bool str8Empty (const char8* str) { return (!str || *str == 0); }\r
- inline bool str16Empty (const char16* str) { return (!str || *str == 0); }\r
-\r
- typedef const char8* FIDString; // identifier as string (used for attributes, messages)\r
-\r
- const FIDString kPlatformStringWin = "WIN";\r
- const FIDString kPlatformStringMac = "MAC";\r
- const FIDString kPlatformStringIOS = "IOS";\r
- const FIDString kPlatformStringLinux = "Linux";\r
-#if SMTG_OS_WINDOWS\r
- const FIDString kPlatformString = kPlatformStringWin;\r
-#elif SMTG_OS_IOS\r
- const FIDString kPlatformString = kPlatformStringIOS;\r
-#elif SMTG_OS_MACOS\r
- const FIDString kPlatformString = kPlatformStringMac;\r
-#elif SMTG_OS_LINUX\r
- const FIDString kPlatformString = kPlatformStringLinux;\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** Coordinates */\r
- typedef int32 UCoord;\r
- static const UCoord kMaxCoord = ((UCoord)0x7FFFFFFF);\r
- static const UCoord kMinCoord = ((UCoord)-0x7FFFFFFF);\r
-} // namespace Steinberg\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-/** Byte-order Conversion Macros */\r
-//----------------------------------------------------------------------------\r
-#define SWAP_32(l) { \\r
- unsigned char* p = (unsigned char*)& (l); \\r
- unsigned char t; \\r
- t = p[0]; p[0] = p[3]; p[3] = t; t = p[1]; p[1] = p[2]; p[2] = t; }\r
-\r
-#define SWAP_16(w) { \\r
- unsigned char* p = (unsigned char*)& (w); \\r
- unsigned char t; \\r
- t = p[0]; p[0] = p[1]; p[1] = t; }\r
-\r
-#define SWAP_64(i) { \\r
- unsigned char* p = (unsigned char*)& (i); \\r
- unsigned char t; \\r
- t = p[0]; p[0] = p[7]; p[7] = t; t = p[1]; p[1] = p[6]; p[6] = t; \\r
- t = p[2]; p[2] = p[5]; p[5] = t; t = p[3]; p[3] = p[4]; p[4] = t;}\r
-\r
-namespace Steinberg\r
-{\r
- static inline void FSwap (int8&) {}\r
- static inline void FSwap (uint8&) {}\r
- static inline void FSwap (int16& i16) { SWAP_16 (i16) }\r
- static inline void FSwap (uint16& i16) { SWAP_16 (i16) }\r
- static inline void FSwap (int32& i32) { SWAP_32 (i32) }\r
- static inline void FSwap (uint32& i32) { SWAP_32 (i32) }\r
- static inline void FSwap (int64& i64) { SWAP_64 (i64) }\r
- static inline void FSwap (uint64& i64) { SWAP_64 (i64) }\r
-}\r
-\r
-// always inline macros (only when RELEASE is 1)\r
-//----------------------------------------------------------------------------\r
-#if RELEASE\r
- #if SMTG_OS_MACOS || SMTG_OS_LINUX\r
- #define SMTG_ALWAYS_INLINE __inline__ __attribute__((__always_inline__))\r
- #define SMTG_NEVER_INLINE __attribute__((noinline))\r
- #elif SMTG_OS_WINDOWS\r
- #define SMTG_ALWAYS_INLINE __forceinline\r
- #define SMTG_NEVER_INLINE __declspec(noinline)\r
- #endif\r
-#endif\r
-\r
-#ifndef SMTG_ALWAYS_INLINE\r
- #define SMTG_ALWAYS_INLINE inline\r
-#endif\r
-#ifndef SMTG_NEVER_INLINE\r
- #define SMTG_NEVER_INLINE\r
-#endif\r
-\r
-#ifndef SMTG_CPP11_STDLIBSUPPORT\r
-// Enable this for old compilers\r
-// #define nullptr NULL\r
-#endif\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/funknown.cpp\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "funknown.h"\r
-\r
-#include "fstrdefs.h"\r
-\r
-#include <stdio.h>\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <objbase.h>\r
-#endif\r
-\r
-#if SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-#include <libkern/OSAtomic.h>\r
-\r
-#if defined (__GNUC__) && (__GNUC__ >= 4) && !__LP64__\r
-// on 32 bit Mac OS X we can safely ignore the format warnings as sizeof(int) == sizeof(long)\r
-#pragma GCC diagnostic ignored "-Wformat"\r
-#endif\r
-\r
-#endif\r
-\r
-#if SMTG_OS_LINUX\r
-#include <ext/atomicity.h>\r
-#endif\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-#if SMTG_OS_WINDOWS\r
-#define GuidStruct GUID\r
-#else\r
-struct GuidStruct\r
-{\r
- uint32 Data1;\r
- uint16 Data2;\r
- uint16 Data3;\r
- uint8 Data4[8];\r
-};\r
-#endif\r
-#endif\r
-\r
-static void toString8 (char8* string, const char* data, int32 i1, int32 i2);\r
-static void fromString8 (const char8* string, char* data, int32 i1, int32 i2);\r
-static uint32 makeLong (uint8 b1, uint8 b2, uint8 b3, uint8 b4);\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknownPrivate\r
-//------------------------------------------------------------------------\r
-namespace FUnknownPrivate {\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API atomicAdd (int32& var, int32 d)\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return InterlockedExchangeAdd (&var, d) + d;\r
-#elif SMTG_OS_MACOS\r
- return OSAtomicAdd32Barrier (d, (int32_t*)&var);\r
-#elif SMTG_OS_LINUX\r
- __gnu_cxx::__atomic_add (&var, d);\r
- return var;\r
-#else\r
-#warning implement me!\r
- var += d;\r
- return var;\r
-#endif\r
-}\r
-} // FUnknownPrivate\r
-\r
-//------------------------------------------------------------------------\r
-// FUID implementation\r
-//------------------------------------------------------------------------\r
-\r
-FUID::FUID ()\r
-{\r
- memset (data, 0, sizeof (TUID));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID::FUID (uint32 l1, uint32 l2, uint32 l3, uint32 l4)\r
-{\r
- from4Int (l1, l2, l3, l4);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID::FUID (const FUID& f)\r
-{\r
- memcpy (data, f.data, sizeof (TUID));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-FUID::FUID (FUID&& other) {\r
- memcpy (data, other.data, sizeof (TUID));\r
-}\r
-\r
-FUID& FUID::operator= (FUID&& other)\r
-{\r
- memcpy (data, other.data, sizeof (TUID));\r
- return *this;\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::generate ()\r
-{\r
-#if SMTG_OS_WINDOWS\r
- GUID guid;\r
- HRESULT hr = CoCreateGuid (&guid);\r
- switch (hr)\r
- {\r
- case RPC_S_OK:\r
- memcpy (data, (char*)&guid, sizeof (TUID));\r
- return true;\r
-\r
- case RPC_S_UUID_LOCAL_ONLY:\r
- default:\r
- return false;\r
- }\r
-\r
-#elif SMTG_OS_MACOS\r
- CFUUIDRef uuid = CFUUIDCreate (kCFAllocatorDefault);\r
- if (uuid)\r
- {\r
- CFUUIDBytes bytes = CFUUIDGetUUIDBytes (uuid);\r
- memcpy (data, (char*)&bytes, sizeof (TUID));\r
- CFRelease (uuid);\r
- return true;\r
- }\r
- return false;\r
-\r
-#else\r
-#warning implement me!\r
- return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::isValid () const\r
-{\r
- TUID nulluid = {0};\r
-\r
- return memcmp (data, nulluid, sizeof (TUID)) != 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FUID& FUID::operator = (const FUID& f)\r
-{\r
- memcpy (data, f.data, sizeof (TUID));\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::from4Int (uint32 l1, uint32 l2, uint32 l3, uint32 l4)\r
-{\r
-#if COM_COMPATIBLE\r
- data [0] = (char)((l1 & 0x000000FF) );\r
- data [1] = (char)((l1 & 0x0000FF00) >> 8);\r
- data [2] = (char)((l1 & 0x00FF0000) >> 16);\r
- data [3] = (char)((l1 & 0xFF000000) >> 24);\r
- data [4] = (char)((l2 & 0x00FF0000) >> 16);\r
- data [5] = (char)((l2 & 0xFF000000) >> 24);\r
- data [6] = (char)((l2 & 0x000000FF) );\r
- data [7] = (char)((l2 & 0x0000FF00) >> 8);\r
- data [8] = (char)((l3 & 0xFF000000) >> 24);\r
- data [9] = (char)((l3 & 0x00FF0000) >> 16);\r
- data [10] = (char)((l3 & 0x0000FF00) >> 8);\r
- data [11] = (char)((l3 & 0x000000FF) );\r
- data [12] = (char)((l4 & 0xFF000000) >> 24);\r
- data [13] = (char)((l4 & 0x00FF0000) >> 16);\r
- data [14] = (char)((l4 & 0x0000FF00) >> 8);\r
- data [15] = (char)((l4 & 0x000000FF) );\r
-#else\r
- data [0] = (char)((l1 & 0xFF000000) >> 24);\r
- data [1] = (char)((l1 & 0x00FF0000) >> 16);\r
- data [2] = (char)((l1 & 0x0000FF00) >> 8);\r
- data [3] = (char)((l1 & 0x000000FF) );\r
- data [4] = (char)((l2 & 0xFF000000) >> 24);\r
- data [5] = (char)((l2 & 0x00FF0000) >> 16);\r
- data [6] = (char)((l2 & 0x0000FF00) >> 8);\r
- data [7] = (char)((l2 & 0x000000FF) );\r
- data [8] = (char)((l3 & 0xFF000000) >> 24);\r
- data [9] = (char)((l3 & 0x00FF0000) >> 16);\r
- data [10] = (char)((l3 & 0x0000FF00) >> 8);\r
- data [11] = (char)((l3 & 0x000000FF) );\r
- data [12] = (char)((l4 & 0xFF000000) >> 24);\r
- data [13] = (char)((l4 & 0x00FF0000) >> 16);\r
- data [14] = (char)((l4 & 0x0000FF00) >> 8);\r
- data [15] = (char)((l4 & 0x000000FF) );\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::to4Int (uint32& d1, uint32& d2, uint32& d3, uint32& d4) const\r
-{\r
- d1 = getLong1 ();\r
- d2 = getLong2 ();\r
- d3 = getLong3 ();\r
- d4 = getLong4 ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong1 () const\r
-{\r
-#if COM_COMPATIBLE\r
- return makeLong (data[3], data[2], data [1], data [0]);\r
-#else\r
- return makeLong (data[0], data[1], data [2], data [3]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong2 () const\r
-{\r
-#if COM_COMPATIBLE\r
- return makeLong (data[5], data[4], data [7], data [6]);\r
-#else\r
- return makeLong (data[4], data[5], data [6], data [7]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong3 () const\r
-{\r
-#if COM_COMPATIBLE\r
- return makeLong (data[8], data[9], data [10], data [11]);\r
-#else\r
- return makeLong (data[8], data[9], data [10], data [11]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-uint32 FUID::getLong4 () const\r
-{\r
-#if COM_COMPATIBLE\r
- return makeLong (data[12], data[13], data [14], data [15]);\r
-#else\r
- return makeLong (data[12], data[13], data [14], data [15]);\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::toString (char8* string) const\r
-{\r
- if (!string)\r
- return;\r
-\r
- #if COM_COMPATIBLE\r
- GuidStruct* g = (GuidStruct*)data;\r
-\r
- char8 s[17];\r
- Steinberg::toString8 (s, data, 8, 16);\r
-\r
- sprintf (string, "%08X%04X%04X%s", g->Data1, g->Data2, g->Data3, s);\r
- #else\r
- Steinberg::toString8 (string, data, 0, 16);\r
- #endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::fromString (const char8* string)\r
-{\r
- if (!string || !*string)\r
- return false;\r
- if (strlen (string) != 32)\r
- return false;\r
-\r
- #if COM_COMPATIBLE\r
- GuidStruct g;\r
- char s[33];\r
-\r
- strcpy (s, string);\r
- s[8] = 0;\r
- sscanf (s, "%x", &g.Data1);\r
- strcpy (s, string + 8);\r
- s[4] = 0;\r
- sscanf (s, "%hx", &g.Data2);\r
- strcpy (s, string + 12);\r
- s[4] = 0;\r
- sscanf (s, "%hx", &g.Data3);\r
-\r
- memcpy (data, &g, 8);\r
- Steinberg::fromString8 (string + 16, data, 8, 16);\r
- #else\r
- Steinberg::fromString8 (string, data, 0, 16);\r
- #endif\r
-\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool FUID::fromRegistryString (const char8* string)\r
-{\r
- if (!string || !*string)\r
- return false;\r
- if (strlen (string) != 38)\r
- return false;\r
-\r
- // e.g. {c200e360-38c5-11ce-ae62-08002b2b79ef}\r
-\r
- #if COM_COMPATIBLE\r
- GuidStruct g;\r
- char8 s[10];\r
-\r
- strncpy (s, string + 1, 8);\r
- s[8] = 0;\r
- sscanf (s, "%x", &g.Data1);\r
- strncpy (s, string + 10, 4);\r
- s[4] = 0;\r
- sscanf (s, "%hx", &g.Data2);\r
- strncpy (s, string + 15, 4);\r
- s[4] = 0;\r
- sscanf (s, "%hx", &g.Data3);\r
- memcpy (data, &g, 8);\r
-\r
- Steinberg::fromString8 (string + 20, data, 8, 10);\r
- Steinberg::fromString8 (string + 25, data, 10, 16);\r
- #else\r
- Steinberg::fromString8 (string + 1, data, 0, 4);\r
- Steinberg::fromString8 (string + 10, data, 4, 6);\r
- Steinberg::fromString8 (string + 15, data, 6, 8);\r
- Steinberg::fromString8 (string + 20, data, 8, 10);\r
- Steinberg::fromString8 (string + 25, data, 10, 16);\r
- #endif\r
-\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::toRegistryString (char8* string) const\r
-{\r
- // e.g. {c200e360-38c5-11ce-ae62-08002b2b79ef}\r
-\r
- #if COM_COMPATIBLE\r
- GuidStruct* g = (GuidStruct*)data;\r
-\r
- char8 s1[5];\r
- Steinberg::toString8 (s1, data, 8, 10);\r
-\r
- char8 s2[13];\r
- Steinberg::toString8 (s2, data, 10, 16);\r
-\r
- sprintf (string, "{%08X-%04X-%04X-%s-%s}", g->Data1, g->Data2, g->Data3, s1, s2);\r
- #else\r
- char8 s1[9];\r
- Steinberg::toString8 (s1, data, 0, 4);\r
- char8 s2[5];\r
- Steinberg::toString8 (s2, data, 4, 6);\r
- char8 s3[5];\r
- Steinberg::toString8 (s3, data, 6, 8);\r
- char8 s4[5];\r
- Steinberg::toString8 (s4, data, 8, 10);\r
- char8 s5[13];\r
- Steinberg::toString8 (s5, data, 10, 16);\r
-\r
- sprintf (string, "{%s-%s-%s-%s-%s}", s1, s2, s3, s4, s5);\r
- #endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void FUID::print (char8* string, int32 style) const\r
-{\r
- if (!string) // no string: debug output\r
- {\r
- char8 str [128];\r
- print (str, style);\r
-\r
-#if SMTG_OS_WINDOWS\r
- OutputDebugStringA (str);\r
- OutputDebugStringA ("\n");\r
-#else\r
- fprintf (stdout, "%s\n", str);\r
-#endif\r
- return;\r
- }\r
-\r
- uint32 l1, l2, l3, l4;\r
- to4Int (l1, l2, l3, l4);\r
-\r
- switch (style)\r
- {\r
- case kINLINE_UID:\r
- sprintf (string, "INLINE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
- break;\r
-\r
- case kDECLARE_UID:\r
- sprintf (string, "DECLARE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
- break;\r
-\r
- case kFUID:\r
- sprintf (string, "FUID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
- break;\r
-\r
- case kCLASS_UID:\r
- default:\r
- sprintf (string, "DECLARE_CLASS_IID (Interface, 0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4);\r
- break;\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// helpers\r
-//------------------------------------------------------------------------\r
-static uint32 makeLong (uint8 b1, uint8 b2, uint8 b3, uint8 b4)\r
-{\r
- return (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static void toString8 (char8* string, const char* data, int32 i1, int32 i2)\r
-{\r
- *string = 0;\r
- for (int32 i = i1; i < i2; i++)\r
- {\r
- char8 s[3];\r
- sprintf (s, "%02X", (uint8)data[i]);\r
- strcat (string, s);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-static void fromString8 (const char8* string, char* data, int32 i1, int32 i2)\r
-{\r
- for (int32 i = i1; i < i2; i++)\r
- {\r
- char8 s[3];\r
- s[0] = *string++;\r
- s[1] = *string++;\r
- s[2] = 0;\r
-\r
- int32 d = 0;\r
- sscanf (s, "%2x", &d);\r
- data[i] = (char)d;\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/funknown.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fplatform.h"\r
-#include "pluginterfaces/base/ftypes.h"\r
-#include "pluginterfaces/base/smartpointer.h"\r
-#include <string.h>\r
-\r
-//------------------------------------------------------------------------\r
-/*! \defgroup pluginBase Basic Interfaces\r
-*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-// Unique Identifier macros\r
-//------------------------------------------------------------------------\r
-\r
-#if COM_COMPATIBLE\r
-#define INLINE_UID(l1, l2, l3, l4) \\r
-{ \\r
- (::Steinberg::int8)((l1 & 0x000000FF) ), (::Steinberg::int8)((l1 & 0x0000FF00) >> 8), \\r
- (::Steinberg::int8)((l1 & 0x00FF0000) >> 16), (::Steinberg::int8)((l1 & 0xFF000000) >> 24), \\r
- (::Steinberg::int8)((l2 & 0x00FF0000) >> 16), (::Steinberg::int8)((l2 & 0xFF000000) >> 24), \\r
- (::Steinberg::int8)((l2 & 0x000000FF) ), (::Steinberg::int8)((l2 & 0x0000FF00) >> 8), \\r
- (::Steinberg::int8)((l3 & 0xFF000000) >> 24), (::Steinberg::int8)((l3 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l3 & 0x0000FF00) >> 8), (::Steinberg::int8)((l3 & 0x000000FF) ), \\r
- (::Steinberg::int8)((l4 & 0xFF000000) >> 24), (::Steinberg::int8)((l4 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l4 & 0x0000FF00) >> 8), (::Steinberg::int8)((l4 & 0x000000FF) ) \\r
-}\r
-#else\r
-#define INLINE_UID(l1, l2, l3, l4) \\r
-{ \\r
- (::Steinberg::int8)((l1 & 0xFF000000) >> 24), (::Steinberg::int8)((l1 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l1 & 0x0000FF00) >> 8), (::Steinberg::int8)((l1 & 0x000000FF) ), \\r
- (::Steinberg::int8)((l2 & 0xFF000000) >> 24), (::Steinberg::int8)((l2 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l2 & 0x0000FF00) >> 8), (::Steinberg::int8)((l2 & 0x000000FF) ), \\r
- (::Steinberg::int8)((l3 & 0xFF000000) >> 24), (::Steinberg::int8)((l3 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l3 & 0x0000FF00) >> 8), (::Steinberg::int8)((l3 & 0x000000FF) ), \\r
- (::Steinberg::int8)((l4 & 0xFF000000) >> 24), (::Steinberg::int8)((l4 & 0x00FF0000) >> 16), \\r
- (::Steinberg::int8)((l4 & 0x0000FF00) >> 8), (::Steinberg::int8)((l4 & 0x000000FF) ) \\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-#define DECLARE_UID(name, l1, l2, l3, l4) \\r
- ::Steinberg::TUID name = INLINE_UID (l1, l2, l3, l4);\r
-\r
-//------------------------------------------------------------------------\r
-#define EXTERN_UID(name) \\r
- extern const ::Steinberg::TUID name;\r
-\r
-\r
-#ifdef INIT_CLASS_IID\r
-#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4); \\r
-const ::Steinberg::FUID ClassName::iid (ClassName##_iid);\r
-#else\r
-#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4);\r
-#endif\r
-#define DEF_CLASS_IID(ClassName) const ::Steinberg::FUID ClassName::iid (ClassName##_iid);\r
-\r
-#define INLINE_UID_OF(ClassName) ClassName##_iid\r
-\r
-#define INLINE_UID_FROM_FUID(x) INLINE_UID(x.getLong1 (), x.getLong2 (), x.getLong3 (), x.getLong4 ())\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknown implementation macros\r
-//------------------------------------------------------------------------\r
-\r
-#define DECLARE_FUNKNOWN_METHODS \\r
-public: \\r
- virtual ::Steinberg::tresult PLUGIN_API queryInterface (const ::Steinberg::TUID _iid, void** obj) SMTG_OVERRIDE; \\r
- virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE; \\r
- virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE; \\r
-protected : \\r
- ::Steinberg::int32 __funknownRefCount; \\r
-public:\r
-\r
-//------------------------------------------------------------------------\r
-\r
-#define DELEGATE_REFCOUNT(ClassName) \\r
-public: \\r
- virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE { return ClassName::addRef (); } \\r
- virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE { return ClassName::release (); }\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_REFCOUNT(ClassName) \\r
-::Steinberg::uint32 PLUGIN_API ClassName::addRef () \\r
-{ \\r
- return ::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, 1); \\r
-} \\r
-::Steinberg::uint32 PLUGIN_API ClassName::release () \\r
-{ \\r
- if (::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, -1) == 0) \\r
- { \\r
- delete this; \\r
- return 0; \\r
- } \\r
- return __funknownRefCount; \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define FUNKNOWN_CTOR { __funknownRefCount = 1; }\r
-#define FUNKNOWN_DTOR\r
-\r
-//------------------------------------------------------------------------\r
-#define QUERY_INTERFACE(iid, obj, InterfaceIID, InterfaceName) \\r
-if (::Steinberg::FUnknownPrivate::iidEqual (iid, InterfaceIID)) \\r
-{ \\r
- addRef (); \\r
- *obj = static_cast< InterfaceName* >(this); \\r
- return ::Steinberg::kResultOk; \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_QUERYINTERFACE(ClassName, InterfaceName, ClassIID) \\r
-::Steinberg::tresult PLUGIN_API ClassName::queryInterface (const ::Steinberg::TUID _iid, void** obj) \\r
-{ \\r
- QUERY_INTERFACE (_iid, obj, ::Steinberg::FUnknown::iid, InterfaceName) \\r
- QUERY_INTERFACE (_iid, obj, ClassIID, InterfaceName) \\r
- *obj = nullptr; \\r
- return ::Steinberg::kNoInterface; \\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-#define IMPLEMENT_FUNKNOWN_METHODS(ClassName,InterfaceName,ClassIID) \\r
- IMPLEMENT_REFCOUNT (ClassName) \\r
- IMPLEMENT_QUERYINTERFACE (ClassName, InterfaceName, ClassIID)\r
-\r
-//------------------------------------------------------------------------\r
-// Result Codes\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if COM_COMPATIBLE\r
-#if SMTG_OS_WINDOWS\r
-enum\r
-{\r
- kNoInterface = static_cast<tresult>(0x80004002L), // E_NOINTERFACE\r
- kResultOk = static_cast<tresult>(0x00000000L), // S_OK\r
- kResultTrue = kResultOk,\r
- kResultFalse = static_cast<tresult>(0x00000001L), // S_FALSE\r
- kInvalidArgument = static_cast<tresult>(0x80070057L), // E_INVALIDARG\r
- kNotImplemented = static_cast<tresult>(0x80004001L), // E_NOTIMPL\r
- kInternalError = static_cast<tresult>(0x80004005L), // E_FAIL\r
- kNotInitialized = static_cast<tresult>(0x8000FFFFL), // E_UNEXPECTED\r
- kOutOfMemory = static_cast<tresult>(0x8007000EL) // E_OUTOFMEMORY\r
-};\r
-#else\r
-enum\r
-{\r
- kNoInterface = static_cast<tresult>(0x80000004L), // E_NOINTERFACE\r
- kResultOk = static_cast<tresult>(0x00000000L), // S_OK\r
- kResultTrue = kResultOk,\r
- kResultFalse = static_cast<tresult>(0x00000001L), // S_FALSE\r
- kInvalidArgument = static_cast<tresult>(0x80000003L), // E_INVALIDARG\r
- kNotImplemented = static_cast<tresult>(0x80000001L), // E_NOTIMPL\r
- kInternalError = static_cast<tresult>(0x80000008L), // E_FAIL\r
- kNotInitialized = static_cast<tresult>(0x8000FFFFL), // E_UNEXPECTED\r
- kOutOfMemory = static_cast<tresult>(0x80000002L) // E_OUTOFMEMORY\r
-};\r
-#endif\r
-#else\r
-enum\r
-{\r
- kNoInterface = -1,\r
- kResultOk,\r
- kResultTrue = kResultOk,\r
- kResultFalse,\r
- kInvalidArgument,\r
- kNotImplemented,\r
- kInternalError,\r
- kNotInitialized,\r
- kOutOfMemory\r
-};\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-typedef int64 LARGE_INT; // obsolete\r
-\r
-//------------------------------------------------------------------------\r
-// FUID class declaration\r
-//------------------------------------------------------------------------\r
-typedef int8 TUID[16]; ///< plain UID type\r
-\r
-//------------------------------------------------------------------------\r
-/* FUnknown private */\r
-namespace FUnknownPrivate {\r
-SMTG_ALWAYS_INLINE bool iidEqual (const void* iid1, const void* iid2)\r
-{\r
- const uint64* p1 = reinterpret_cast<const uint64*> (iid1);\r
- const uint64* p2 = reinterpret_cast<const uint64*> (iid2);\r
- return p1[0] == p2[0] && p1[1] == p2[1];\r
-}\r
-\r
-int32 PLUGIN_API atomicAdd (int32& value, int32 amount);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Handling 16 Byte Globally Unique Identifiers.\r
-\ingroup pluginBase\r
-\r
-Each interface declares its identifier as static member inside the interface\r
-namespace (e.g. FUnknown::iid).\r
-*/\r
-//------------------------------------------------------------------------\r
-class FUID\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- FUID ();\r
- FUID (uint32 l1, uint32 l2, uint32 l3, uint32 l4);\r
- FUID (const FUID&);\r
- virtual ~FUID () {}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
- FUID (FUID&& other);\r
- FUID& operator= (FUID&& other);\r
-#endif\r
-\r
- /** Generates a new Unique Identifier (UID).\r
- Will return true for success. If the return value is false, either no\r
- UID is generated or the UID is not guaranteed to be unique worldwide. */\r
- bool generate ();\r
-\r
- /** Checks if the UID data is valid.\r
- The default constructor initializes the memory with zeros. */\r
- bool isValid () const;\r
-\r
- FUID& operator = (const FUID& f);\r
- bool operator == (const FUID& f) const { return ::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }\r
- bool operator < (const FUID& f) const { return memcmp (data, f.data, sizeof (TUID)) < 0; }\r
- bool operator != (const FUID& f) const { return !::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }\r
-\r
-\r
- uint32 getLong1 () const;\r
- uint32 getLong2 () const;\r
- uint32 getLong3 () const;\r
- uint32 getLong4 () const;\r
-\r
- void from4Int (uint32 d1, uint32 d2, uint32 d3, uint32 d4);\r
- void to4Int (uint32& d1, uint32& d2, uint32& d3, uint32& d4) const;\r
-\r
- typedef char8 String [64];\r
-\r
- /** Converts UID to a string.\r
- The string will be 32 characters long, representing the hexadecimal values\r
- of each data byte (e.g. "9127BE30160E4BB69966670AA6087880").\r
-\r
- Typical use-case is:\r
- \code\r
- char8[33] strUID = {0};\r
- FUID uid;\r
- if (uid.generate ())\r
- uid.toString (strUID);\r
- \endcode\r
- */\r
- void toString (char8* string) const;\r
-\r
- /** Sets the UID data from a string.\r
- The string has to be 32 characters long, where each character-pair is\r
- the ASCII-encoded hexadecimal value of the corresponding data byte. */\r
- bool fromString (const char8* string);\r
-\r
- /** Converts UID to a string in Microsoft® OLE format.\r
- (e.g. "{c200e360-38c5-11ce-ae62-08002b2b79ef}") */\r
- void toRegistryString (char8* string) const;\r
-\r
- /** Sets the UID data from a string in Microsoft® OLE format. */\r
- bool fromRegistryString (const char8* string);\r
-\r
- enum UIDPrintStyle\r
- {\r
- kINLINE_UID, ///< "INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
- kDECLARE_UID, ///< "DECLARE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
- kFUID, ///< "FUID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
- kCLASS_UID ///< "DECLARE_CLASS_IID (Interface, 0x00000000, 0x00000000, 0x00000000, 0x00000000)"\r
- };\r
- /** Prints the UID to a string (or debug output if string is NULL).\r
- \param string is the output string if not NULL.\r
- \param style can be chosen from the FUID::UIDPrintStyle enumeration. */\r
- void print (char8* string = 0, int32 style = kINLINE_UID) const;\r
-\r
- template<size_t N>\r
- inline explicit FUID (const int8 (&uid)[N])\r
- {\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
- static_assert (N == sizeof (TUID), "only TUID allowed");\r
-#endif\r
- memcpy (data, uid, sizeof (TUID));\r
- }\r
- inline void toTUID (TUID result) const { memcpy (result, data, sizeof (TUID)); }\r
- inline operator const TUID& () const { return data; }\r
- inline const TUID& toTUID () const { return data; }\r
-\r
- static FUID fromTUID (const TUID uid)\r
- {\r
- FUID res;\r
- if (uid)\r
- memcpy (res.data, uid, sizeof (TUID));\r
- return res;\r
- }\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- TUID data;\r
-};\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-template<typename T>\r
-inline bool operator== (const FUID& f1, T f2)\r
-{\r
- static_assert (\r
- std::is_same<typename std::remove_cv<T>::type, FUID>::value,\r
- "Do not compare a FUID with a TUID directly. Either convert the TUID to a FUID and compare them or use FUnknownPrivate::iidEqual");\r
- return f1.operator== (f2);\r
-}\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknown\r
-//------------------------------------------------------------------------\r
-/** The basic interface of all interfaces.\r
-\ingroup pluginBase\r
-\r
-- The FUnknown::queryInterface method is used to retrieve pointers to other\r
- interfaces of the object.\r
-- FUnknown::addRef and FUnknown::release manage the lifetime of the object.\r
- If no more references exist, the object is destroyed in memory.\r
-\r
-Interfaces are identified by 16 byte Globally Unique Identifiers.\r
-The SDK provides a class called FUID for this purpose.\r
-\r
-\ref howtoClass */\r
-//------------------------------------------------------------------------\r
-class FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Query for a pointer to the specified interface.\r
- Returns kResultOk on success or kNoInterface if the object does not implement the interface.\r
- The object has to call addRef when returning an interface.\r
- \param _iid : (in) 16 Byte interface identifier (-> FUID)\r
- \param obj : (out) On return, *obj points to the requested interface */\r
- virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;\r
-\r
- /** Adds a reference and return the new reference count.\r
- \par Remarks:\r
- The initial reference count after creating an object is 1. */\r
- virtual uint32 PLUGIN_API addRef () = 0;\r
-\r
- /** Releases a reference and return the new reference count.\r
- If the reference count reaches zero, the object will be destroyed in memory. */\r
- virtual uint32 PLUGIN_API release () = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-DECLARE_CLASS_IID (FUnknown, 0x00000000, 0x00000000, 0xC0000000, 0x00000046)\r
-\r
-//------------------------------------------------------------------------\r
-// FUnknownPtr\r
-//------------------------------------------------------------------------\r
-/** FUnknownPtr - automatic interface conversion and smart pointer in one.\r
- This template class can be used for interface conversion like this:\r
- \code\r
- IPtr<IPath> path = owned (FHostCreate (IPath, hostClasses));\r
- FUnknownPtr<IPath2> path2 (path); // does a query interface for IPath2\r
- if (path2)\r
- ...\r
- \endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class FUnknownPtr : public IPtr<I>\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- inline FUnknownPtr (FUnknown* unknown); // query interface\r
- inline FUnknownPtr (const FUnknownPtr& p) : IPtr<I> (p) {}\r
- inline FUnknownPtr () {}\r
-\r
- inline FUnknownPtr& operator=(const FUnknownPtr& p) {IPtr<I>::operator=(p); return *this;}\r
- inline I* operator=(FUnknown* unknown);\r
- inline I* getInterface () { return this->ptr; }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline FUnknownPtr<I>::FUnknownPtr (FUnknown* unknown)\r
-{\r
- if (unknown && unknown->queryInterface (I::iid, (void**)&this->ptr) != kResultOk)\r
- this->ptr = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline I* FUnknownPtr<I>::operator=(FUnknown* unknown)\r
-{\r
- I* newPtr = 0;\r
- if (unknown && unknown->queryInterface (I::iid, (void**)&newPtr) == kResultOk)\r
- {\r
- OPtr<I> rel (newPtr);\r
- return IPtr<I>::operator=(newPtr);\r
- }\r
-\r
- return IPtr<I>::operator=(0);\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// FReleaser (obsolete)\r
-//------------------------------------------------------------------------\r
-/** Release an interface using automatic object (obsolete).\r
-This class is obsolete and is only kept for compatibility.\r
-The replacement for FReleaser is OPtr.\r
-\r
-Usage example with FReleaser:\r
- \code\r
- void someFunction ()\r
- {\r
- IPath* path = pathCreateMethod ();\r
- FReleaser releaser (path);\r
- .... do something with path...\r
- .... path not used anymore, releaser will destroy it when leaving function scope\r
- }\r
- \endcode\r
-Usage example with OPtr:\r
- \code\r
- void someFunction ()\r
- {\r
- OPtr<IPath> path = pathCreateMethod ();\r
- .... do something with path...\r
- .... path not used anymore, OPtr will destroy it when leaving function scope\r
- }\r
- \endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-struct FReleaser\r
-{\r
- FReleaser (FUnknown* u): u (u) {}\r
- ~FReleaser () { if (u) u->release (); }\r
-\r
- FUnknown* u;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/futils.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic utilities\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ftypes.h"\r
-\r
-namespace Steinberg {\r
-//----------------------------------------------------------------------------\r
-// min/max/etc. template functions\r
-template <class T>\r
-inline const T& Min (const T& a, const T& b)\r
-{\r
- return b < a ? b : a;\r
-}\r
-\r
-template <class T>\r
-inline const T& Max (const T& a, const T& b)\r
-{\r
- return a < b ? b : a;\r
-}\r
-\r
-template <class T>\r
-inline T Abs (const T& value)\r
-{\r
- return (value >= (T)0) ? value : -value;\r
-}\r
-\r
-template <class T>\r
-inline T Sign (const T& value)\r
-{\r
- return (value == (T)0) ? 0 : ((value >= (T)0) ? 1 : -1);\r
-}\r
-\r
-template <class T>\r
-inline T Bound (T minval, T maxval, T x)\r
-{\r
- if (x < minval)\r
- return minval;\r
- else if (x > maxval)\r
- return maxval;\r
- return x;\r
-}\r
-\r
-template <class T>\r
-void Swap (T& t1, T& t2)\r
-{\r
- T tmp = t1;\r
- t1 = t2;\r
- t2 = tmp;\r
-}\r
-\r
-template <class T>\r
-bool IsApproximateEqual (T t1, T t2, T epsilon)\r
-{\r
- if (t1 == t2)\r
- return true;\r
- T diff = t1 - t2;\r
- if (diff < 0.0)\r
- diff = -diff;\r
- if (diff < epsilon)\r
- return true;\r
- return false;\r
-}\r
-\r
-template <class T>\r
-inline T ToNormalized (const T& value, const int32 numSteps)\r
-{\r
- return value / T (numSteps);\r
-}\r
-\r
-template <class T>\r
-inline int32 FromNormalized (const T& norm, const int32 numSteps)\r
-{\r
- return Min<int32> (numSteps, int32 (norm * (numSteps + 1)));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/fvariant.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-class FUnknown;\r
-\r
-//------------------------------------------------------------------------\r
-// FVariant struct declaration\r
-//------------------------------------------------------------------------\r
-/** A Value of variable type.\r
- \ingroup pluginBase\r
- */\r
-class FVariant\r
-{\r
-//------------------------------------------------------------------------\r
-public:\r
- enum\r
- {\r
- kEmpty = 0,\r
- kInteger = 1 << 0,\r
- kFloat = 1 << 1,\r
- kString8 = 1 << 2,\r
- kObject = 1 << 3,\r
- kOwner = 1 << 4,\r
- kString16 = 1 << 5\r
- };\r
-\r
-//------------------------------------------------------------------------\r
- // ctors\r
- inline FVariant () { memset (this, 0, sizeof (FVariant)); }\r
- inline FVariant (const FVariant& variant);\r
-\r
- inline FVariant (bool b) : type (kInteger), intValue (b) {}\r
- inline FVariant (uint32 v) : type (kInteger), intValue (v) {}\r
- inline FVariant (int64 v) : type (kInteger), intValue (v) {}\r
- inline FVariant (double v) : type (kFloat), floatValue (v) {}\r
- inline FVariant (const char8* str) : type (kString8), string8 (str) {}\r
- inline FVariant (const char16* str) : type (kString16), string16 (str) {}\r
- inline FVariant (FUnknown* obj, bool owner = false) : type (kObject), object (obj)\r
- {\r
- setOwner (owner);\r
- }\r
- inline ~FVariant () { empty (); }\r
-\r
-//------------------------------------------------------------------------\r
- inline FVariant& operator= (const FVariant& variant);\r
-\r
- inline void set (bool b)\r
- {\r
- setInt (b);\r
- }\r
-\r
- inline void set (uint32 v)\r
- {\r
- setInt (v);\r
- }\r
-\r
- inline void set (int64 v)\r
- {\r
- setInt (v);\r
- }\r
-\r
- inline void set (double v)\r
- {\r
- setFloat (v);\r
- }\r
-\r
- inline void set (const char8* c)\r
- {\r
- setString8 (c);\r
- }\r
-\r
- inline void set (const char16* c)\r
- {\r
- setString16 (c);\r
- }\r
-\r
- inline void setInt (int64 v)\r
- {\r
- empty ();\r
- type = kInteger;\r
- intValue = v;\r
- }\r
-\r
- inline void setFloat (double v)\r
- {\r
- empty ();\r
- type = kFloat;\r
- floatValue = v;\r
- }\r
- inline void setString8 (const char8* v)\r
- {\r
- empty ();\r
- type = kString8;\r
- string8 = v;\r
- }\r
- inline void setString16 (const char16* v)\r
- {\r
- empty ();\r
- type = kString16;\r
- string16 = v;\r
- }\r
-\r
- inline void setObject (FUnknown* obj)\r
- {\r
- empty ();\r
- type = kObject;\r
- object = obj;\r
- }\r
-\r
- template <typename T>\r
- inline T get () const;\r
-\r
- inline int64 getInt () const { return (type & kInteger) ? intValue : 0; }\r
- inline double getFloat () const { return (type & kFloat) ? floatValue : 0.; }\r
- inline double getNumber () const\r
- {\r
- return (type & kInteger) ? static_cast<double> (intValue) : (type & kFloat) ? floatValue :\r
- 0.;\r
- }\r
- inline const char8* getString8 () const { return (type & kString8) ? string8 : 0; }\r
- inline const char16* getString16 () const { return (type & kString16) ? string16 : 0; }\r
-\r
- inline FUnknown* getObject () const { return (type & kObject) ? object : 0; }\r
-\r
- inline uint16 getType () const { return static_cast<uint16> (type & ~(kOwner)); }\r
- inline bool isEmpty () const { return getType () == kEmpty; }\r
- inline bool isOwner () const { return (type & kOwner) != 0; }\r
- inline bool isString () const { return (type & (kString8 | kString16)) != 0; }\r
- inline void setOwner (bool state)\r
- {\r
- if (state)\r
- type |= kOwner;\r
- else\r
- type &= ~kOwner;\r
- }\r
-\r
- void empty ();\r
-//------------------------------------------------------------------------\r
- uint16 type;\r
- union\r
- {\r
- int64 intValue;\r
- double floatValue;\r
- const char8* string8;\r
- const char16* string16;\r
- FUnknown* object;\r
- };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-inline bool operator== (const FVariant& v1, const FVariant& v2)\r
-{\r
-#if SMTG_PLATFORM_64\r
- return v1.type == v2.type && v1.intValue == v2.intValue;\r
-#else\r
- if (v1.type != v2.type)\r
- return false;\r
- if (v1.type & (FVariant::kString8 | FVariant::kString16 | FVariant::kObject))\r
- return v1.string8 == v2.string8; // pointer type comparisons\r
- return v1.intValue == v2.intValue; // intValue & double comparison\r
-\r
-#endif\r
-}\r
-\r
-template <>\r
-inline bool FVariant::get<bool> () const\r
-{\r
- return getInt () != 0;\r
-}\r
-\r
-template <>\r
-inline uint32 FVariant::get<uint32> () const\r
-{\r
- return static_cast<uint32> (getInt ());\r
-}\r
-\r
-template <>\r
-inline int32 FVariant::get<int32> () const\r
-{\r
- return static_cast<int32> (getInt ());\r
-}\r
-\r
-template <>\r
-inline int64 FVariant::get<int64> () const\r
-{\r
- return static_cast<int64> (getInt ());\r
-}\r
-\r
-template <>\r
-inline float FVariant::get<float> () const\r
-{\r
- return static_cast<float> (getFloat ());\r
-}\r
-\r
-template <>\r
-inline double FVariant::get<double> () const\r
-{\r
- return getFloat ();\r
-}\r
-\r
-template <>\r
-inline const char8* FVariant::get<const char8*> () const\r
-{\r
- return getString8 ();\r
-}\r
-\r
-template <>\r
-inline const char16* FVariant::get<const char16*> () const\r
-{\r
- return getString16 ();\r
-}\r
-\r
-template <>\r
-inline FUnknown* FVariant::get<FUnknown*> () const\r
-{\r
- return getObject ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline bool operator!= (const FVariant& v1, const FVariant& v2) { return !(v1 == v2); }\r
-\r
-//------------------------------------------------------------------------\r
-inline FVariant::FVariant (const FVariant& variant) : type (kEmpty) { *this = variant; }\r
-\r
-//------------------------------------------------------------------------\r
-inline void FVariant::empty ()\r
-{\r
- if (type & kOwner)\r
- {\r
- if ((type & kString8) && string8)\r
- delete[] string8;\r
- else if ((type & kString16) && string16)\r
- delete[] string16;\r
-\r
- else if ((type & kObject) && object)\r
- object->release ();\r
- }\r
- memset (this, 0, sizeof (FVariant));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-inline FVariant& FVariant::operator= (const FVariant& variant)\r
-{\r
- empty ();\r
-\r
- type = variant.type;\r
-\r
- if ((type & kString8) && variant.string8)\r
- {\r
- string8 = new char8[strlen (variant.string8) + 1];\r
- strcpy (const_cast<char8*> (string8), variant.string8);\r
- type |= kOwner;\r
- }\r
- else if ((type & kString16) && variant.string16)\r
- {\r
- int32 len = strlen16 (variant.string16);\r
- string16 = new char16[len + 1];\r
- char16* tmp = const_cast<char16*> (string16);\r
- memcpy (tmp, variant.string16, len * sizeof (char16));\r
- tmp[len] = 0;\r
- type |= kOwner;\r
- }\r
- else if ((type & kObject) && variant.object)\r
- {\r
- object = variant.object;\r
- object->addRef ();\r
- type |= kOwner;\r
- }\r
- else\r
- intValue = variant.intValue; // copy memory\r
-\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/ibstream.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Interface for reading/writing streams\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Base class for streams.\r
-\ingroup pluginBase\r
-- read/write binary data from/to stream\r
-- get/set stream read-write position (read and write position is the same)\r
-*/\r
-//------------------------------------------------------------------------\r
-\r
-class IBStream: public FUnknown\r
-{\r
-public:\r
- enum IStreamSeekMode\r
- {\r
- kIBSeekSet = 0, ///< set absolute seek position\r
- kIBSeekCur, ///< set seek position relative to current position\r
- kIBSeekEnd ///< set seek position relative to stream end\r
- };\r
-\r
-//------------------------------------------------------------------------\r
- /** Reads binary data from stream.\r
- \param buffer : destination buffer\r
- \param numBytes : amount of bytes to be read\r
- \param numBytesRead : result - how many bytes have been read from stream (set to 0 if this is of no interest) */\r
- virtual tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = 0) = 0;\r
-\r
- /** Writes binary data to stream.\r
- \param buffer : source buffer\r
- \param numBytes : amount of bytes to write\r
- \param numBytesWritten : result - how many bytes have been written to stream (set to 0 if this is of no interest) */\r
- virtual tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = 0) = 0;\r
-\r
- /** Sets stream read-write position.\r
- \param pos : new stream position (dependent on mode)\r
- \param mode : value of enum IStreamSeekMode\r
- \param result : new seek position (set to 0 if this is of no interest) */\r
- virtual tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = 0) = 0;\r
-\r
- /** Gets current stream read-write position.\r
- \param pos : is assigned the current position if function succeeds */\r
- virtual tresult PLUGIN_API tell (int64* pos) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IBStream, 0xC3BF6EA2, 0x30994752, 0x9B6BF990, 0x1EE33E9B)\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream with a size.\r
-\ingroup pluginBase\r
-[extends IBStream] when stream type supports it (like file and memory stream) */\r
-//------------------------------------------------------------------------\r
-class ISizeableStream: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Return the stream size */\r
- virtual tresult PLUGIN_API getStreamSize (int64& size) = 0;\r
- /** Set the steam size. File streams can only be resized if they are write enabled. */\r
- virtual tresult PLUGIN_API setStreamSize (int64 size) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (ISizeableStream, 0x04F9549E, 0xE02F4E6E, 0x87E86A87, 0x47F4E17F)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/icloneable.h\r
-// Created by : Steinberg, 11/2007\r
-// Description : Interface for object copies\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Interface allowing an object to be copied.\r
-[plug & host imp] \n\r
-[released: N4.12] \n\r
-*/\r
-//------------------------------------------------------------------------\r
-class ICloneable : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Create exact copy of the object */\r
- virtual FUnknown* PLUGIN_API clone () = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (ICloneable, 0xD45406B9, 0x3A2D4443, 0x9DAD9BA9, 0x85A1454B)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/ipersistent.h\r
-// Created by : Steinberg, 09/2004\r
-// Description : Plug-In Storage Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class FVariant;\r
-class IAttributes;\r
-//------------------------------------------------------------------------\r
-/** Persistent Object Interface.\r
-[plug imp] \n\r
-This interface is used to store/restore attributes of an object.\r
-An IPlugController can implement this interface to handle presets.\r
-The gui-xml for a preset control looks like this:\r
-\code\r
- ....\r
- <view name="PresetView" data="Preset"/>\r
- ....\r
-<template name="PresetView">\r
- <view name="preset control" size="0, 0, 100, 20"/>\r
- <switch name="store preset" size="125,0,80,20" style="push|immediate" title="Store" />\r
- <switch name="remove preset" size="220,0,80,20" style="push|immediate" title="Delete" />\r
-</template>\r
-\endcode\r
-The tag data="Preset" tells the host to create a preset controller that handles the\r
-3 values named "preset control", "store preset", and "remove preset".\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPersistent: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** The class ID must be a 16 bytes unique id that is used to create the object.\r
- This ID is also used to identify the preset list when used with presets. */\r
- virtual tresult PLUGIN_API getClassID (char8* uid) = 0;\r
- /** Store all members/data in the passed IAttributes. */\r
- virtual tresult PLUGIN_API saveAttributes (IAttributes* ) = 0;\r
- /** Restore all members/data from the passed IAttributes. */\r
- virtual tresult PLUGIN_API loadAttributes (IAttributes* ) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPersistent, 0xBA1A4637, 0x3C9F46D0, 0xA65DBA0E, 0xB85DA829)\r
-\r
-\r
-typedef FIDString IAttrID;\r
-//------------------------------------------------------------------------\r
-/** Object Data Archive Interface.\r
-[host imp] \n\r
-- store data/objects/binary/subattributes in the archive\r
-- read stored data from the archive\r
-\r
-All data stored to the archive are identified by a string (IAttrID), which must be unique on each\r
-IAttribute level.\r
-\r
-The basic set/get methods make use of the FVariant class defined in 'funknown.h'.\r
-For a more convenient usage of this interface, you should use the functions defined\r
-in namespace PAttributes (public.sdk/source/common/pattributes.h+cpp) !!\r
-\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAttributes: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /*! \name Methods to write attributes\r
- ******************************************************************************************************** */\r
- //@{\r
- /** Store any data in the archive. It is even possible to store sub-attributes by creating\r
- a new IAttributes instance via the IHostClasses interface and pass it to the parent in the\r
- FVariant. In this case the archive must take the ownership of the newly created object, which\r
- is true for all objects that have been created only for storing. You tell the archive to take\r
- ownership by adding the FVariant::kOwner flag to the FVariant::type member (data.type |= FVariant::kOwner).\r
- When using the PAttributes functions, this is done through a function parameter.*/\r
- virtual tresult PLUGIN_API set (IAttrID attrID, const FVariant& data) = 0;\r
-\r
- /** Store a list of data in the archive. Please note that the type of data is not mixable! So\r
- you can only store a list of integers or a list of doubles/strings/etc. You can also store a list\r
- of subattributes or other objects that implement the IPersistent interface.*/\r
- virtual tresult PLUGIN_API queue (IAttrID listID, const FVariant& data) = 0;\r
-\r
- /** Store binary data in the archive. Parameter 'copyBytes' specifies if the passed data should be copied.\r
- The archive cannot take the ownership of binary data. Either it just references a buffer in order\r
- to write it to a file (copyBytes = false) or it copies the data to its own buffers (copyBytes = true).\r
- When binary data should be stored in the default pool for example, you must always copy it!*/\r
- virtual tresult PLUGIN_API setBinaryData (IAttrID attrID, void* data, uint32 bytes, bool copyBytes) = 0;\r
- //@}\r
-\r
- /*! \name Methods to read attributes\r
- ******************************************************************************************************** */\r
- //@{\r
- /** Get data previously stored to the archive. */\r
- virtual tresult PLUGIN_API get (IAttrID attrID, FVariant& data) = 0;\r
-\r
- /** Get list of data previously stored to the archive. As long as there are queue members the method\r
- will return kResultTrue. When the queue is empty, the methods returns kResultFalse. All lists except from\r
- object lists can be reset which means that the items can be read once again. \see IAttributes::resetQueue */\r
- virtual tresult PLUGIN_API unqueue (IAttrID listID, FVariant& data) = 0;\r
-\r
- /** Get the amount of items in a queue. */\r
- virtual int32 PLUGIN_API getQueueItemCount (IAttrID) = 0;\r
-\r
- /** Reset a queue. If you need to restart reading a queue, you have to reset it. You can reset a queue at any time.*/\r
- virtual tresult PLUGIN_API resetQueue (IAttrID attrID) = 0;\r
-\r
- /** Reset all queues in the archive.*/\r
- virtual tresult PLUGIN_API resetAllQueues () = 0;\r
-\r
- /** Read binary data from the archive. The data is copied into the passed buffer. The size of that buffer\r
- must fit the size of data stored in the archive which can be queried via IAttributes::getBinaryDataSize */\r
- virtual tresult PLUGIN_API getBinaryData (IAttrID attrID, void* data, uint32 bytes) = 0;\r
- /** Get the size in bytes of binary data in the archive. */\r
- virtual uint32 PLUGIN_API getBinaryDataSize (IAttrID attrID) = 0;\r
- //@}\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributes, 0xFA1E32F9, 0xCA6D46F5, 0xA982F956, 0xB1191B58)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended access to Attributes; supports Attribute retrieval via iteration.\r
-[host imp] \n\r
-[released] C7/N6 \n\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAttributes2 : public IAttributes\r
-{\r
-public:\r
- /** Returns the number of existing attributes. */\r
- virtual int32 PLUGIN_API countAttributes () const = 0;\r
- /** Returns the attribute's ID for the given index. */\r
- virtual IAttrID PLUGIN_API getAttributeID (int32 index) const = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributes2, 0x1382126A, 0xFECA4871, 0x97D52A45, 0xB042AE99)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/ipluginbase.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Plug-in Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "funknown.h"\r
-#include "fstrdefs.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic interface to a Plug-in component.\r
-\ingroup pluginBase\r
-- [plug imp]\r
-- initialize/terminate the Plug-in component\r
-\r
-The host uses this interface to initialize and to terminate the Plug-in component.\r
-The context that is passed to the initialize method contains any interface to the\r
-host that the Plug-in will need to work. These interfaces can vary from category to category.\r
-A list of supported host context interfaces should be included in the documentation\r
-of a specific category. */\r
-//------------------------------------------------------------------------\r
-class IPluginBase: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** The host passes a number of interfaces as context to initialize the Plug-in class.\r
- @note Extensive memory allocations etc. should be performed in this method rather than in the class' constructor!\r
- If the method does NOT return kResultOk, the object is released immediately. In this case terminate is not called! */\r
- virtual tresult PLUGIN_API initialize (FUnknown* context) = 0;\r
-\r
- /** This function is called before the Plug-in is unloaded and can be used for\r
- cleanups. You have to release all references to any host application interfaces. */\r
- virtual tresult PLUGIN_API terminate () = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPluginBase, 0x22888DDB, 0x156E45AE, 0x8358B348, 0x08190625)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Information about the class factory of the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PFactoryInfo\r
-{\r
-//------------------------------------------------------------------------\r
- enum FactoryFlags\r
- {\r
- kNoFlags = 0, ///< Nothing\r
- kClassesDiscardable = 1 << 0, ///< The number of exported classes can change each time the Module is loaded. If this flag is set, the host does not cache class information. This leads to a longer startup time because the host always has to load the Module to get the current class information.\r
- kLicenseCheck = 1 << 1, ///< Class IDs of components are interpreted as Syncrosoft-License (LICENCE_UID). Loaded in a Steinberg host, the module will not be loaded when the license is not valid\r
- kComponentNonDiscardable = 1 << 3, ///< Component won't be unloaded until process exit\r
- kUnicode = 1 << 4 ///< Components have entirely unicode encoded strings. (True for VST 3 Plug-ins so far)\r
- };\r
-\r
- enum\r
- {\r
- kURLSize = 256,\r
- kEmailSize = 128,\r
- kNameSize = 64\r
- };\r
-\r
-//------------------------------------------------------------------------\r
- char8 vendor[kNameSize]; ///< e.g. "Steinberg Media Technologies"\r
- char8 url[kURLSize]; ///< e.g. "http://www.steinberg.de"\r
- char8 email[kEmailSize]; ///< e.g. "info@steinberg.de"\r
- int32 flags; ///< (see above)\r
-//------------------------------------------------------------------------\r
- PFactoryInfo (const char8* _vendor, const char8* _url, const char8* _email, int32 _flags)\r
- {\r
- strncpy8 (vendor, _vendor, kNameSize);\r
- strncpy8 (url, _url, kURLSize);\r
- strncpy8 (email, _email, kEmailSize);\r
- flags = _flags;\r
-#ifdef UNICODE\r
- flags |= kUnicode;\r
-#endif\r
- }\r
-#if SMTG_CPP11\r
- constexpr PFactoryInfo () : vendor (), url (), email (), flags () {}\r
-#else\r
- PFactoryInfo () { memset (this, 0, sizeof (PFactoryInfo)); }\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Information about a class provided by the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PClassInfo\r
-{\r
-//------------------------------------------------------------------------\r
- enum ClassCardinality\r
- {\r
- kManyInstances = 0x7FFFFFFF\r
- };\r
-\r
- enum\r
- {\r
- kCategorySize = 32,\r
- kNameSize = 64\r
- };\r
-//------------------------------------------------------------------------\r
- TUID cid; ///< Class ID 16 Byte class GUID\r
- int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)\r
- char8 category[kCategorySize]; ///< class category, host uses this to categorize interfaces\r
- char8 name[kNameSize]; ///< class name, visible to the user\r
-//------------------------------------------------------------------------\r
-\r
- PClassInfo (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name)\r
- {\r
- memset (this, 0, sizeof (PClassInfo));\r
- memcpy (cid, _cid, sizeof (TUID));\r
- if (_category)\r
- strncpy8 (category, _category, kCategorySize);\r
- if (_name)\r
- strncpy8 (name, _name, kNameSize);\r
- cardinality = _cardinality;\r
- }\r
-#if SMTG_CPP11\r
- constexpr PClassInfo () : cid (), cardinality (), category (), name () {}\r
-#else\r
- PClassInfo () { memset (this, 0, sizeof (PClassInfo)); }\r
-#endif\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// IPluginFactory interface declaration\r
-//------------------------------------------------------------------------\r
-/** Class factory that any Plug-in defines for creating class instances.\r
-\ingroup pluginBase\r
-- [plug imp]\r
-\r
-From the host's point of view a Plug-in module is a factory which can create\r
-a certain kind of object(s). The interface IPluginFactory provides methods\r
-to get information about the classes exported by the Plug-in and a\r
-mechanism to create instances of these classes (that usually define the IPluginBase interface).\r
-\r
-<b> An implementation is provided in public.sdk/source/common/pluginfactory.cpp </b>\r
-\see GetPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Fill a PFactoryInfo structure with information about the Plug-in vendor. */\r
- virtual tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) = 0;\r
-\r
- /** Returns the number of exported classes by this factory.\r
- If you are using the CPluginFactory implementation provided by the SDK, it returns the number of classes you registered with CPluginFactory::registerClass. */\r
- virtual int32 PLUGIN_API countClasses () = 0;\r
-\r
- /** Fill a PClassInfo structure with information about the class at the specified index. */\r
- virtual tresult PLUGIN_API getClassInfo (int32 index, PClassInfo* info) = 0;\r
-\r
- /** Create a new class instance. */\r
- virtual tresult PLUGIN_API createInstance (FIDString cid, FIDString _iid, void** obj) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPluginFactory, 0x7A4D811C, 0x52114A1F, 0xAED9D2EE, 0x0B43BF9F)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Version 2 of Basic Information about a class provided by the Plug-in.\r
-\ingroup pluginBase\r
-*/\r
-//------------------------------------------------------------------------\r
-struct PClassInfo2\r
-{\r
-//------------------------------------------------------------------------\r
- TUID cid; ///< Class ID 16 Byte class GUID\r
- int32 cardinality; ///< cardinality of the class, set to kManyInstances (see \ref ClassCardinality)\r
- char8 category[PClassInfo::kCategorySize]; ///< class category, host uses this to categorize interfaces\r
- char8 name[PClassInfo::kNameSize]; ///< class name, visible to the user\r
-\r
- enum {\r
- kVendorSize = 64,\r
- kVersionSize = 64,\r
- kSubCategoriesSize = 128\r
- };\r
-\r
- uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined\r
- char8 subCategories[kSubCategoriesSize]; ///< module specific subcategories, can be more than one, logically added by the \c OR operator\r
- char8 vendor[kVendorSize]; ///< overwrite vendor information from factory info\r
- char8 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)\r
- char8 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")\r
-\r
-//------------------------------------------------------------------------\r
-\r
- PClassInfo2 (const TUID _cid, int32 _cardinality, const char8* _category, const char8* _name,\r
- int32 _classFlags, const char8* _subCategories, const char8* _vendor, const char8* _version,\r
- const char8* _sdkVersion)\r
- {\r
- memset (this, 0, sizeof (PClassInfo2));\r
- memcpy (cid, _cid, sizeof (TUID));\r
- cardinality = _cardinality;\r
- if (_category)\r
- strncpy8 (category, _category, PClassInfo::kCategorySize);\r
- if (_name)\r
- strncpy8 (name, _name, PClassInfo::kNameSize);\r
- classFlags = static_cast<uint32> (_classFlags);\r
- if (_subCategories)\r
- strncpy8 (subCategories, _subCategories, kSubCategoriesSize);\r
- if (_vendor)\r
- strncpy8 (vendor, _vendor, kVendorSize);\r
- if (_version)\r
- strncpy8 (version, _version, kVersionSize);\r
- if (_sdkVersion)\r
- strncpy8 (sdkVersion, _sdkVersion, kVersionSize);\r
- }\r
-#if SMTG_CPP11\r
- constexpr PClassInfo2 ()\r
- : cid ()\r
- , cardinality ()\r
- , category ()\r
- , name ()\r
- , classFlags ()\r
- , subCategories ()\r
- , vendor ()\r
- , version ()\r
- , sdkVersion ()\r
- {\r
- }\r
-#else\r
- PClassInfo2 () { memset (this, 0, sizeof (PClassInfo2)); }\r
-#endif\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// IPluginFactory2 interface declaration\r
-//------------------------------------------------------------------------\r
-/** Version 2 of class factory supporting PClassInfo2.\r
-\ingroup pluginBase\r
-\copydoc IPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory2 : public IPluginFactory\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns the class info (version 2) for a given index. */\r
- virtual tresult PLUGIN_API getClassInfo2 (int32 index, PClassInfo2* info) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IPluginFactory2, 0x0007B650, 0xF24B4C0B, 0xA464EDB9, 0xF00B2ABB)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Unicode Version of Basic Information about a class provided by the Plug-in */\r
-//------------------------------------------------------------------------\r
-struct PClassInfoW\r
-{\r
-//------------------------------------------------------------------------\r
- TUID cid; ///< see \ref PClassInfo\r
- int32 cardinality; ///< see \ref PClassInfo\r
- char8 category[PClassInfo::kCategorySize]; ///< see \ref PClassInfo\r
- char16 name[PClassInfo::kNameSize]; ///< see \ref PClassInfo\r
-\r
- enum {\r
- kVendorSize = 64,\r
- kVersionSize = 64,\r
- kSubCategoriesSize = 128\r
- };\r
-\r
- uint32 classFlags; ///< flags used for a specific category, must be defined where category is defined\r
- char8 subCategories[kSubCategoriesSize];///< module specific subcategories, can be more than one, logically added by the \c OR operator\r
- char16 vendor[kVendorSize]; ///< overwrite vendor information from factory info\r
- char16 version[kVersionSize]; ///< Version string (e.g. "1.0.0.512" with Major.Minor.Subversion.Build)\r
- char16 sdkVersion[kVersionSize]; ///< SDK version used to build this class (e.g. "VST 3.0")\r
-\r
-//------------------------------------------------------------------------\r
- PClassInfoW (const TUID _cid, int32 _cardinality, const char8* _category, const char16* _name,\r
- int32 _classFlags, const char8* _subCategories, const char16* _vendor, const char16* _version,\r
- const char16* _sdkVersion)\r
- {\r
- memset (this, 0, sizeof (PClassInfoW));\r
- memcpy (cid, _cid, sizeof (TUID));\r
- cardinality = _cardinality;\r
- if (_category)\r
- strncpy8 (category, _category, PClassInfo::kCategorySize);\r
- if (_name)\r
- strncpy16 (name, _name, PClassInfo::kNameSize);\r
- classFlags = static_cast<uint32> (_classFlags);\r
- if (_subCategories)\r
- strncpy8 (subCategories, _subCategories, kSubCategoriesSize);\r
- if (_vendor)\r
- strncpy16 (vendor, _vendor, kVendorSize);\r
- if (_version)\r
- strncpy16 (version, _version, kVersionSize);\r
- if (_sdkVersion)\r
- strncpy16 (sdkVersion, _sdkVersion, kVersionSize);\r
- }\r
-#if SMTG_CPP11\r
- constexpr PClassInfoW ()\r
- : cid ()\r
- , cardinality ()\r
- , category ()\r
- , name ()\r
- , classFlags ()\r
- , subCategories ()\r
- , vendor ()\r
- , version ()\r
- , sdkVersion ()\r
- {\r
- }\r
-#else\r
- PClassInfoW () { memset (this, 0, sizeof (PClassInfoW)); }\r
-#endif\r
-\r
- void fromAscii (const PClassInfo2& ci2)\r
- {\r
- memcpy (cid, ci2.cid, sizeof (TUID));\r
- cardinality = ci2.cardinality;\r
- strncpy8 (category, ci2.category, PClassInfo::kCategorySize);\r
- str8ToStr16 (name, ci2.name, PClassInfo::kNameSize);\r
- classFlags = ci2.classFlags;\r
- strncpy8 (subCategories, ci2.subCategories, kSubCategoriesSize);\r
-\r
- str8ToStr16 (vendor, ci2.vendor, kVendorSize);\r
- str8ToStr16 (version, ci2.version, kVersionSize);\r
- str8ToStr16 (sdkVersion, ci2.sdkVersion, kVersionSize);\r
- }\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// IPluginFactory3 interface declaration\r
-//------------------------------------------------------------------------\r
-/** Version 3 of class factory supporting PClassInfoW.\r
-\ingroup pluginBase\r
-\copydoc IPluginFactory\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPluginFactory3 : public IPluginFactory2\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns the unicode class info for a given index. */\r
- virtual tresult PLUGIN_API getClassInfoUnicode (int32 index, PClassInfoW* info) = 0;\r
-\r
- /** Receives information about host*/\r
- virtual tresult PLUGIN_API setHostContext (FUnknown* context) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IPluginFactory3, 0x4555A2AB, 0xC1234E57, 0x9B122910, 0x36878931)\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-\r
-//------------------------------------------------------------------------\r
-#define LICENCE_UID(l1, l2, l3, l4) \\r
-{ \\r
- (int8)((l1 & 0xFF000000) >> 24), (int8)((l1 & 0x00FF0000) >> 16), \\r
- (int8)((l1 & 0x0000FF00) >> 8), (int8)((l1 & 0x000000FF) ), \\r
- (int8)((l2 & 0xFF000000) >> 24), (int8)((l2 & 0x00FF0000) >> 16), \\r
- (int8)((l2 & 0x0000FF00) >> 8), (int8)((l2 & 0x000000FF) ), \\r
- (int8)((l3 & 0xFF000000) >> 24), (int8)((l3 & 0x00FF0000) >> 16), \\r
- (int8)((l3 & 0x0000FF00) >> 8), (int8)((l3 & 0x000000FF) ), \\r
- (int8)((l4 & 0xFF000000) >> 24), (int8)((l4 & 0x00FF0000) >> 16), \\r
- (int8)((l4 & 0x0000FF00) >> 8), (int8)((l4 & 0x000000FF) ) \\r
-}\r
-\r
-\r
-//------------------------------------------------------------------------\r
-// GetPluginFactory\r
-//------------------------------------------------------------------------\r
-/** Plug-in entry point.\r
-\ingroup pluginBase\r
-Any Plug-in must define and export this function. \n\r
-A typical implementation of GetPluginFactory looks like this\r
- \code\r
- IPluginFactory* PLUGIN_API GetPluginFactory ()\r
- {\r
- if (!gPluginFactory)\r
- {\r
- static PFactoryInfo factoryInfo =\r
- {\r
- "My Company Name",\r
- "http://www.mywebpage.com",\r
- "mailto:myemail@address.com",\r
- PFactoryInfo::kNoFlags\r
- };\r
-\r
- gPluginFactory = new CPluginFactory (factoryInfo);\r
-\r
- static PClassInfo componentClass =\r
- {\r
- INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000), // replace by a valid uid\r
- 1,\r
- "Service", // category\r
- "Name"\r
- };\r
-\r
- gPluginFactory->registerClass (&componentClass, MyComponentClass::newInstance);\r
- }\r
- else\r
- gPluginFactory->addRef ();\r
-\r
- return gPluginFactory;\r
- }\r
- \endcode\r
-\see \ref loadPlugin\r
-*/\r
-//------------------------------------------------------------------------\r
-extern "C"\r
-{\r
- Steinberg::IPluginFactory* PLUGIN_API GetPluginFactory ();\r
- typedef Steinberg::IPluginFactory* (PLUGIN_API *GetFactoryProc) ();\r
-}\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/istringresult.h\r
-// Created by : Steinberg, 01/2005\r
-// Description : Strings Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Interface to return an ascii string of variable size.\r
- In order to manage memory allocation and deallocation properly,\r
- this interface is used to transfer a string as result parameter of\r
- a method requires a string of unknown size.\r
-[host imp] or [plug imp] \n\r
-[released: SX 4] */\r
-//------------------------------------------------------------------------\r
-class IStringResult : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- virtual void PLUGIN_API setText (const char8* text) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IStringResult, 0x550798BC, 0x872049DB, 0x84920A15, 0x3B50B7A8)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Interface to a string of variable size and encoding.\r
-[host imp] or [plug imp] \n\r
-[released: ] */\r
-//------------------------------------------------------------------------\r
-class IString : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Assign ASCII string */\r
- virtual void PLUGIN_API setText8 (const char8* text) = 0;\r
- /** Assign unicode string */\r
- virtual void PLUGIN_API setText16 (const char16* text) = 0;\r
-\r
- /** Return ASCII string. If the string is unicode so far, it will be converted.\r
- So you need to be careful, because the conversion can result in data loss.\r
- It is save though to call getText8 if isWideString() returns false */\r
- virtual const char8* PLUGIN_API getText8 () = 0;\r
- /** Return unicode string. If the string is ASCII so far, it will be converted. */\r
- virtual const char16* PLUGIN_API getText16 () = 0;\r
-\r
- /** !Do not use this method! Early implementations take the given pointer as\r
- internal string and this will cause problems because 'free' will be used to delete the passed memory.\r
- Later implementations will redirect 'take' to setText8 and setText16 */\r
- virtual void PLUGIN_API take (void* s, bool isWide) = 0;\r
-\r
- /** Returns true if the string is in unicode format, returns false if the string is ASCII */\r
- virtual bool PLUGIN_API isWideString () const = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IString, 0xF99DB7A3, 0x0FC14821, 0x800B0CF9, 0x8E348EDF)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : Steinberg Module Architecture SDK\r
-//\r
-// Category : Basic Host Service Interfaces\r
-// Filename : pluginterfaces/base/iupdatehandler.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Update handling\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class IDependent;\r
-\r
-//------------------------------------------------------------------------\r
-/** Host implements dependency handling for plugins.\r
-[host imp] \n\r
-[get this interface from IHostClasses] \n\r
-[released N3.1] \n\r
-\r
-- Install/Remove change notifications\r
-- Trigger updates when an object has changed\r
-\r
-Can be used between host-objects and the Plug-In or\r
-inside the Plug-In to handle internal updates!\r
-\r
-\see IDependent\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IUpdateHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Install update notification for given object. It is essential to\r
- remove all dependencies again using 'removeDependent'! Dependencies\r
- are not removed automatically when the 'object' is released!\r
- \param object : interface to object that sends change notifications\r
- \param dependent : interface through which the update is passed */\r
- virtual tresult PLUGIN_API addDependent (FUnknown* object, IDependent* dependent) = 0;\r
-\r
- /** Remove a previously installed dependency.*/\r
- virtual tresult PLUGIN_API removeDependent (FUnknown* object, IDependent* dependent) = 0;\r
-\r
- /** Inform all dependents, that object has changed.\r
- \param object is the object that has changed\r
- \param message is a value of enum IDependent::ChangeMessage, usually IDependent::kChanged - can be\r
- a private message as well (only known to sender and dependent)*/\r
- virtual tresult PLUGIN_API triggerUpdates (FUnknown* object, int32 message) = 0;\r
-\r
- /** Same as triggerUpdates, but delivered in idle (usefull to collect updates).*/\r
- virtual tresult PLUGIN_API deferUpdates (FUnknown* object, int32 message) = 0;\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUpdateHandler, 0xF5246D56, 0x86544d60, 0xB026AFB5, 0x7B697B37)\r
-\r
-//------------------------------------------------------------------------\r
-/** A dependent will get notified about changes of a model.\r
-[plug imp]\r
-- notify changes of a model\r
-\r
-\see IUpdateHandler\r
-\ingroup frameworkHostClasses\r
-*/\r
-//------------------------------------------------------------------------\r
-class IDependent: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Inform the dependent, that the passed FUnknown has changed. */\r
- virtual void PLUGIN_API update (FUnknown* changedUnknown, int32 message) = 0;\r
-\r
- enum ChangeMessage\r
- {\r
- kWillChange,\r
- kChanged,\r
- kDestroyed,\r
- kWillDestroy,\r
-\r
- kStdChangeMessageLast = kWillDestroy\r
- };\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IDependent, 0xF52B7AAE, 0xDE72416d, 0x8AF18ACE, 0x9DD7BD5E)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK Core Interfaces\r
-// Filename : pluginterfaces/base/smartpointer.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Basic Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fplatform.h"\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-#include <utility>\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-// IPtr\r
-//------------------------------------------------------------------------\r
-/** IPtr - Smart pointer template class.\r
- \ingroup pluginBase\r
-\r
- - can be used as an I* pointer\r
- - handles refCount of the interface\r
- - Usage example:\r
- \code\r
- IPtr<IPath> path (sharedPath);\r
- if (path)\r
- path->ascend ();\r
- \endcode\r
- */\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class IPtr\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- inline IPtr (I* ptr, bool addRef = true);\r
- inline IPtr (const IPtr&);\r
-\r
- template <class T>\r
- inline IPtr (const IPtr<T>& other) : ptr (other.get ())\r
- {\r
- if (ptr)\r
- ptr->addRef ();\r
- }\r
-\r
- inline IPtr ();\r
- inline ~IPtr ();\r
-\r
- inline I* operator= (I* ptr);\r
-\r
- inline IPtr& operator= (const IPtr& other);\r
-\r
- template <class T>\r
- inline IPtr& operator= (const IPtr<T>& other)\r
- {\r
- operator= (other.get ());\r
- return *this;\r
- }\r
-\r
- inline operator I* () const { return ptr; } // act as I*\r
- inline I* operator-> () const { return ptr; } // act as I*\r
-\r
- inline I* get () const { return ptr; }\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
- inline IPtr (IPtr<I>&& movePtr) SMTG_NOEXCEPT : ptr (movePtr.take ()) { }\r
-\r
- template <typename T>\r
- inline IPtr (IPtr<T>&& movePtr) SMTG_NOEXCEPT : ptr (movePtr.take ()) { }\r
-\r
- inline IPtr& operator= (IPtr<I>&& movePtr) SMTG_NOEXCEPT\r
- {\r
- if (ptr)\r
- ptr->release ();\r
-\r
- ptr = movePtr.take ();\r
- return *this;\r
- }\r
-\r
- inline void reset (I* obj = nullptr)\r
- {\r
- if (ptr)\r
- ptr->release();\r
- ptr = obj;\r
- }\r
-\r
- I* take () SMTG_NOEXCEPT\r
- {\r
- I* out = ptr;\r
- ptr = nullptr;\r
- return out;\r
- }\r
-\r
-#endif\r
-//------------------------------------------------------------------------\r
-protected:\r
- I* ptr;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr (I* _ptr, bool addRef) : ptr (_ptr)\r
-{\r
- if (ptr && addRef)\r
- ptr->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr (const IPtr<I>& other) : ptr (other.ptr)\r
-{\r
- if (ptr)\r
- ptr->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::IPtr () : ptr (0)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>::~IPtr ()\r
-{\r
- if (ptr)\r
- ptr->release ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline I* IPtr<I>::operator= (I* _ptr)\r
-{\r
- if (_ptr != ptr)\r
- {\r
- if (ptr)\r
- ptr->release ();\r
- ptr = _ptr;\r
- if (ptr)\r
- ptr->addRef ();\r
- }\r
- return ptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-inline IPtr<I>& IPtr<I>::operator= (const IPtr<I>& _ptr)\r
-{\r
- operator= (_ptr.ptr);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** OPtr - "owning" smart pointer used for newly created FObjects.\r
- \ingroup pluginBase\r
-\r
- FUnknown implementations are supposed to have a refCount of 1 right after creation.\r
- So using an IPtr on newly created objects would lead to a leak.\r
- Instead the OPtr can be used in this case. \n\r
- Example:\r
- \code\r
- OPtr<IPath> path = FHostCreate (IPath, hostClasses);\r
- // no release is needed...\r
- \endcode\r
- The assignment operator takes ownership of a new object and releases the old.\r
- So its safe to write:\r
- \code\r
- OPtr<IPath> path = FHostCreate (IPath, hostClasses);\r
- path = FHostCreate (IPath, hostClasses);\r
- path = 0;\r
- \endcode\r
- This is the difference to using an IPtr with addRef=false.\r
- \code\r
- // DONT DO THIS:\r
- IPtr<IPath> path (FHostCreate (IPath, hostClasses), false);\r
- path = FHostCreate (IPath, hostClasses);\r
- path = 0;\r
- \endcode\r
- This will lead to a leak!\r
- */\r
-//------------------------------------------------------------------------\r
-template <class I>\r
-class OPtr : public IPtr<I>\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- inline OPtr (I* p) : IPtr<I> (p, false) {}\r
- inline OPtr (const IPtr<I>& p) : IPtr<I> (p) {}\r
- inline OPtr (const OPtr<I>& p) : IPtr<I> (p) {}\r
- inline OPtr () {}\r
- inline I* operator= (I* _ptr)\r
- {\r
- if (_ptr != this->ptr)\r
- {\r
- if (this->ptr)\r
- this->ptr->release ();\r
- this->ptr = _ptr;\r
- }\r
- return this->ptr;\r
- }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Assigning newly created object to an IPtr.\r
- Example:\r
- \code\r
- IPtr<IPath> path = owned (FHostCreate (IPath, hostClasses));\r
- \endcode\r
- which is a slightly shorter form of writing:\r
- \code\r
- IPtr<IPath> path = OPtr<IPath> (FHostCreate (IPath, hostClasses));\r
- \endcode\r
- */\r
-template <class I>\r
-IPtr<I> owned (I* p)\r
-{\r
- return IPtr<I> (p, false);\r
-}\r
-\r
-/** Assigning shared object to an IPtr.\r
- Example:\r
- \code\r
- IPtr<IPath> path = shared (iface.getXY ());\r
- \endcode\r
- */\r
-template <class I>\r
-IPtr<I> shared (I* p)\r
-{\r
- return IPtr<I> (p, true);\r
-}\r
-\r
-#if SMTG_CPP11_STDLIBSUPPORT\r
-//------------------------------------------------------------------------\r
-// Ownership functionality\r
-//------------------------------------------------------------------------\r
-namespace SKI {\r
-namespace Detail {\r
-struct Adopt;\r
-} // Detail\r
-\r
-/** Strong typedef for shared reference counted objects.\r
- * Use SKI::adopt to unwrap the provided object.\r
- * @tparam T Referenced counted type.\r
- */\r
-template <typename T>\r
-class Shared\r
-{\r
- friend struct Detail::Adopt;\r
- T* obj = nullptr;\r
-};\r
-\r
-/** Strong typedef for transferring the ownership of reference counted objects.\r
- * Use SKI::adopt to unwrap the provided object.\r
- * After calling adopt the reference in this object is null.\r
- * @tparam T Referenced counted type.\r
- */\r
-template <typename T>\r
-class Owned\r
-{\r
- friend struct Detail::Adopt;\r
- T* obj = nullptr;\r
-};\r
-\r
-/** Strong typedef for using reference counted objects.\r
- * Use SKI::adopt to unwrap the provided object.\r
- * After calling adopt the reference in this object is null.\r
- * @tparam T Referenced counted type.\r
- */\r
-template <typename T>\r
-class Used\r
-{\r
- friend struct Detail::Adopt;\r
- T* obj = nullptr;\r
-};\r
-\r
-namespace Detail {\r
-\r
-struct Adopt\r
-{\r
- template <typename T>\r
- static IPtr<T> adopt (Shared<T>& ref)\r
- {\r
- using Steinberg::shared;\r
- return shared (ref.obj);\r
- }\r
-\r
- template <typename T>\r
- static IPtr<T> adopt (Owned<T>& ref)\r
- {\r
- using Steinberg::owned;\r
- IPtr<T> out = owned (ref.obj);\r
- ref.obj = nullptr;\r
- return out;\r
- }\r
-\r
- template <typename T>\r
- static T* adopt (Used<T>& ref)\r
- {\r
- return ref.obj;\r
- }\r
-\r
- template <template <typename> class OwnerType, typename T>\r
- static OwnerType<T> toOwnerType (T* obj)\r
- {\r
- OwnerType<T> out;\r
- out.obj = obj;\r
- return out;\r
- }\r
-};\r
-\r
-} // Detail\r
-\r
-/** Common function to adopt referenced counted object.\r
- * @tparam T Referenced counted type.\r
- * @param ref The reference to be adopted in a smart pointer.\r
- */\r
-template <typename T>\r
-IPtr<T> adopt (Shared<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-IPtr<T> adopt (Shared<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to adopt referenced counted object.\r
- * @tparam T Referenced counted type.\r
- * @param ref The reference to be adopted in a smart pointer.\r
- */\r
-template <typename T>\r
-IPtr<T> adopt (Owned<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-IPtr<T> adopt (Owned<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to adopt referenced counted object.\r
- * @tparam T Referenced counted type.\r
- * @param ref The reference to be adopted in a smart pointer.\r
- */\r
-template <typename T>\r
-T* adopt (Used<T>& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-template <typename T>\r
-T* adopt (Used<T>&& ref) { return Detail::Adopt::adopt (ref); }\r
-\r
-/** Common function to wrap owned instances. */\r
-template <typename T>\r
-Owned<T> toOwned (T* obj) { return Detail::Adopt::toOwnerType<Owned> (obj); }\r
-\r
-/** Common function to wrap shared instances. */\r
-template <typename T>\r
-Shared<T> toShared (T* obj) { return Detail::Adopt::toOwnerType<Shared> (obj); }\r
-\r
-/** Common function to wrap used instances. */\r
-template <typename T>\r
-Used<T> toUsed (T* obj) { return Detail::Adopt::toOwnerType<Used> (obj); }\r
-\r
-//------------------------------------------------------------------------\r
-} // SKI\r
-#endif\r
-} // Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Helpers\r
-// Filename : pluginterfaces/base/ustring.cpp\r
-// Created by : Steinberg, 12/2005\r
-// Description : UTF-16 String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "ustring.h"\r
-\r
-#if SMTG_OS_WINDOWS\r
-#include <stdio.h>\r
-#pragma warning (disable : 4996)\r
-\r
-#elif SMTG_OS_MACOS\r
-#include <CoreFoundation/CoreFoundation.h>\r
-\r
-#elif SMTG_OS_LINUX\r
-#include <cstring>\r
-#include <string>\r
-#include <codecvt>\r
-#include <sstream>\r
-#include <locale>\r
-\r
-#include <wctype.h>\r
-#include <wchar.h>\r
-\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-#if SMTG_OS_LINUX\r
-\r
-//------------------------------------------------------------------------\r
-namespace {\r
-\r
-using Converter = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>;\r
-\r
-//------------------------------------------------------------------------\r
-Converter& converter ()\r
-{\r
- static Converter instance;\r
- return instance;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // anonymous\r
-\r
-//------------------------------------------------------------------------\r
-#endif // SMTG_OS_LINUX\r
-\r
-//------------------------------------------------------------------------\r
-/** Copy strings of different character width. */\r
-//------------------------------------------------------------------------\r
-template <class TDstChar, class TSrcChar>\r
-void StringCopy (TDstChar* dst, int32 dstSize, const TSrcChar* src, int32 srcSize = -1)\r
-{\r
- int32 count = dstSize;\r
- if (srcSize >= 0 && srcSize < dstSize)\r
- count = srcSize;\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- dst[i] = (TDstChar)src[i];\r
- if (src[i] == 0)\r
- break;\r
- }\r
- dst[dstSize - 1] = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Find length of null-terminated string. */\r
-//------------------------------------------------------------------------\r
-template <class TSrcChar>\r
-int32 StringLength (const TSrcChar* src, int32 srcSize = -1)\r
-{\r
- if (srcSize == 0)\r
- return 0;\r
- int32 length = 0;\r
- while (src[length])\r
- {\r
- length++;\r
- if (srcSize > 0 && length >= srcSize)\r
- break;\r
- }\r
- return length;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// UString\r
-//------------------------------------------------------------------------\r
-int32 UString::getLength () const\r
-{\r
- return StringLength<char16> (thisBuffer, thisSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::assign (const char16* src, int32 srcSize)\r
-{\r
- StringCopy<char16, char16> (thisBuffer, thisSize, src, srcSize);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::append (const char16* src, int32 srcSize)\r
-{\r
- int32 length = getLength ();\r
- StringCopy<char16, char16> (thisBuffer + length, thisSize - length, src, srcSize);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const UString& UString::copyTo (char16* dst, int32 dstSize) const\r
-{\r
- StringCopy<char16, char16> (dst, dstSize, thisBuffer, thisSize);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-UString& UString::fromAscii (const char* src, int32 srcSize)\r
-{\r
- StringCopy<char16, char> (thisBuffer, thisSize, src, srcSize);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const UString& UString::toAscii (char* dst, int32 dstSize) const\r
-{\r
- StringCopy<char, char16> (dst, dstSize, thisBuffer, thisSize);\r
- return *this;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::scanFloat (double& value) const\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return swscanf ((const wchar_t*)thisBuffer, L"%lf", &value) != -1;\r
-\r
-#elif TARGET_API_MAC_CARBON\r
- CFStringRef cfStr = CFStringCreateWithBytes (0, (const UInt8 *)thisBuffer, getLength () * 2, kCFStringEncodingUTF16, false);\r
- if (cfStr)\r
- {\r
- value = CFStringGetDoubleValue (cfStr);\r
- CFRelease (cfStr);\r
- return true;\r
- }\r
- return false;\r
-\r
-#elif SMTG_OS_LINUX\r
- auto str = converter ().to_bytes (thisBuffer);\r
- return sscanf (str.data (), "%lf", &value) == 1;\r
-\r
-#else\r
-#warning Implement me\r
- // implement me!\r
- return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::printFloat (double value, int32 precision)\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return swprintf ((wchar_t*)thisBuffer, L"%.*lf", precision, value) != -1;\r
-#elif SMTG_OS_MACOS\r
- bool result = false;\r
- CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%.*lf"), precision, value);\r
- if (cfStr)\r
- {\r
- memset (thisBuffer, 0, thisSize);\r
- CFRange range = {0, CFStringGetLength (cfStr)};\r
- CFStringGetBytes (cfStr, range, kCFStringEncodingUTF16, 0, false, (UInt8*)thisBuffer, thisSize, 0);\r
- CFRelease (cfStr);\r
- return true;\r
- }\r
- return result;\r
-#elif SMTG_OS_LINUX\r
- auto utf8Buffer = reinterpret_cast<char*> (thisBuffer);\r
- auto len = snprintf (utf8Buffer, thisSize, "%.*lf", precision, value);\r
- if (len > 0)\r
- {\r
- auto utf16Buffer = reinterpret_cast<char16*> (thisBuffer);\r
- utf16Buffer[len] = 0;\r
- while (--len >= 0)\r
- {\r
- utf16Buffer[len] = utf8Buffer[len];\r
- }\r
- return true;\r
- }\r
- return false;\r
-#else\r
-#warning Implement me\r
- // implement me!\r
- return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::scanInt (int64& value) const\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return swscanf ((const wchar_t*)thisBuffer, L"%I64d", &value) != -1;\r
-\r
-#elif SMTG_OS_MACOS\r
- CFStringRef cfStr = CFStringCreateWithBytes (0, (const UInt8 *)thisBuffer, getLength () * 2, kCFStringEncodingUTF16, false);\r
- if (cfStr)\r
- {\r
- value = CFStringGetIntValue (cfStr);\r
- CFRelease (cfStr);\r
- return true;\r
- }\r
- return false;\r
-\r
-#elif SMTG_OS_LINUX\r
- auto str = converter ().to_bytes (thisBuffer);\r
- return sscanf (str.data (), "%lld", &value) == 1;\r
-\r
-#else\r
-#warning Implement me\r
- // implement me!\r
- return false;\r
-#endif\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool UString::printInt (int64 value)\r
-{\r
-#if SMTG_OS_WINDOWS\r
- return swprintf ((wchar_t*)thisBuffer, L"%I64d", value) != -1;\r
-\r
-#elif SMTG_OS_MACOS\r
- CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%lld"), value);\r
- if (cfStr)\r
- {\r
- memset (thisBuffer, 0, thisSize);\r
- CFRange range = {0, CFStringGetLength (cfStr)};\r
- CFStringGetBytes (cfStr, range, kCFStringEncodingUTF16, 0, false, (UInt8*)thisBuffer, thisSize, 0);\r
- CFRelease (cfStr);\r
- return true;\r
- }\r
- return false;\r
-#elif SMTG_OS_LINUX\r
- auto utf8Buffer = reinterpret_cast<char*> (thisBuffer);\r
- auto len = snprintf (utf8Buffer, thisSize, "%lld", value);\r
- if (len > 0)\r
- {\r
- auto utf16Buffer = reinterpret_cast<char16*> (thisBuffer);\r
- utf16Buffer[len] = 0;\r
- while (--len >= 0)\r
- {\r
- utf16Buffer[len] = utf8Buffer[len];\r
- }\r
- return true;\r
- }\r
- return false;\r
-\r
-#else\r
-#warning Implement me\r
- // implement me!\r
- return false;\r
-#endif\r
-}\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Helpers\r
-// Filename : pluginterfaces/base/ustring.h\r
-// Created by : Steinberg, 12/2005\r
-// Description : UTF-16 String class\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ftypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** UTF-16 string class without buffer management. */\r
-//------------------------------------------------------------------------\r
-class UString\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- UString (char16* buffer, int32 size)\r
- : thisBuffer (buffer),\r
- thisSize (size)\r
- {}\r
-\r
- int32 getSize () const { return thisSize; } ///< returns buffer size\r
- operator const char16* () const { return thisBuffer; } ///< cast to char16*\r
-\r
- /** Returns length of string (in code units). */\r
- int32 getLength () const;\r
-\r
- /** Copy from UTF-16 buffer. */\r
- UString& assign (const char16* src, int32 srcSize = -1);\r
-\r
- /** Append UTF-16 buffer. */\r
- UString& append (const char16* src, int32 srcSize = -1);\r
-\r
- /** Copy to UTF-16 buffer. */\r
- const UString& copyTo (char16* dst, int32 dstSize) const;\r
-\r
- /** Copy from ASCII string. */\r
- UString& fromAscii (const char* src, int32 srcSize = -1);\r
- UString& assign (const char* src, int32 srcSize = -1) { return fromAscii (src, srcSize); }\r
-\r
- /** Copy to ASCII string. */\r
- const UString& toAscii (char* dst, int32 dstSize) const;\r
-\r
- /** Scan integer from string. */\r
- bool scanInt (int64& value) const;\r
-\r
- /** Print integer to string. */\r
- bool printInt (int64 value);\r
-\r
- /** Scan float from string. */\r
- bool scanFloat (double& value) const;\r
-\r
- /** Print float to string. */\r
- bool printFloat (double value, int32 precision = 4);\r
-//------------------------------------------------------------------------\r
-protected:\r
- char16* thisBuffer;\r
- int32 thisSize;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** UTF-16 string with fixed buffer size. */\r
-//------------------------------------------------------------------------\r
-template<int32 maxSize>\r
-class UStringBuffer: public UString\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- UStringBuffer ()\r
- : UString (data, maxSize)\r
- { data[0] = 0; }\r
-\r
- /** Construct from UTF-16 string. */\r
- UStringBuffer (const char16* src, int32 srcSize = -1)\r
- : UString (data, maxSize)\r
- { data[0] = 0; if (src) assign (src, srcSize); }\r
-\r
- /** Construct from ASCII string. */\r
- UStringBuffer (const char* src, int32 srcSize = -1)\r
- : UString (data, maxSize)\r
- { data[0] = 0; if (src) fromAscii (src, srcSize); }\r
-//------------------------------------------------------------------------\r
-protected:\r
- char16 data[maxSize];\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-typedef UStringBuffer<128> UString128; ///< 128 character UTF-16 string\r
-typedef UStringBuffer<256> UString256; ///< 256 character UTF-16 string\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#define USTRING(asciiString) Steinberg::UString256 (asciiString)\r
-#define USTRINGSIZE(var) (sizeof (var) / sizeof (Steinberg::char16))\r
-\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK GUI Interfaces\r
-// Filename : pluginterfaces/gui/iplugview.h\r
-// Created by : Steinberg, 12/2007\r
-// Description : Plug-in User Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-namespace Steinberg {\r
-\r
-class IPlugFrame;\r
-\r
-//------------------------------------------------------------------------\r
-/*! \defgroup pluginGUI Graphical User Interface\r
-*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Graphical rectangle structure. Used with IPlugView.\r
-\ingroup pluginGUI\r
-*/\r
-//------------------------------------------------------------------------\r
-struct ViewRect\r
-{\r
- ViewRect (int32 l = 0, int32 t = 0, int32 r = 0, int32 b = 0)\r
- : left (l), top (t), right (r), bottom (b)\r
- {\r
- }\r
-\r
- int32 left;\r
- int32 top;\r
- int32 right;\r
- int32 bottom;\r
-\r
- //--- ---------------------------------------------------------------------\r
- int32 getWidth () const { return right - left; }\r
- int32 getHeight () const { return bottom - top; }\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** \defgroup platformUIType Platform UI Types\r
-\ingroup pluginGUI\r
-List of Platform UI types for IPlugView. This list is used to match the GUI-System between\r
-the host and a Plug-in in case that an OS provides multiple GUI-APIs.\r
-*/\r
-/*@{*/\r
-/** The parent parameter in IPlugView::attached() is a HWND handle.\r
- * You should attach a child window to it. */\r
-const FIDString kPlatformTypeHWND = "HWND"; ///< HWND handle. (Microsoft Windows)\r
-\r
-/** The parent parameter in IPlugView::attached() is a WindowRef.\r
- * You should attach a HIViewRef to the content view of the window. */\r
-const FIDString kPlatformTypeHIView = "HIView"; ///< HIViewRef. (Mac OS X)\r
-\r
-/** The parent parameter in IPlugView::attached() is a NSView pointer.\r
- * You should attach a NSView to it. */\r
-const FIDString kPlatformTypeNSView = "NSView"; ///< NSView pointer. (Mac OS X)\r
-\r
-/** The parent parameter in IPlugView::attached() is a UIView pointer.\r
- * You should attach an UIView to it. */\r
-const FIDString kPlatformTypeUIView = "UIView"; ///< UIView pointer. (iOS)\r
-\r
-/** The parent parameter in IPlugView::attached() is a X11 Window supporting XEmbed.\r
- * You should attach a Window to it that supports the XEmbed extension. */\r
-const FIDString kPlatformTypeX11EmbedWindowID = "X11EmbedWindowID"; ///< X11 Window ID. (X11)\r
-\r
-/*@}*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Plug-in definition of a view.\r
-\ingroup pluginGUI vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-\r
-\par Sizing of a view\r
-Usually the size of a Plug-in view is fixed. But both the host and the Plug-in can cause\r
-a view to be resized:\r
-\n\r
-- <b> Host </b> : If IPlugView::canResize () returns kResultTrue the host will setup the window\r
- so that the user can resize it. While the user resizes the window\r
- IPlugView::checkSizeConstraint () is called, allowing the Plug-in to change the size to a valid\r
- rect. The host then resizes the window to this rect and has to call IPlugView::onSize ().\r
-\n\r
-\n\r
-- <b> Plug-in </b> : The Plug-in can call IPlugFrame::resizeView () and cause the host to resize the\r
- window.\r
- Afterwards in the same callstack the host has to call IPlugView::onSize () if a resize is needed (size was changed).\r
- Note that if the host calls IPlugView::getSize () before calling IPlugView::onSize () (if needed),\r
- it will get the current (old) size not the wanted one!!\r
- Here the calling sequence:\r
- * plug-in->host: IPlugFrame::resizeView (newSize)\r
- * host->plug-in (optional): IPlugView::getSize () returns the currentSize (not the newSize)!\r
- * host->plug-in: if newSize is different from the current size: IPlugView::onSize (newSize)\r
- * host->plug-in (optional): IPlugView::getSize () returns the newSize\r
-\n\r
-<b>Please only resize the platform representation of the view when IPlugView::onSize () is\r
-called.</b>\r
-\r
-\par Keyboard handling\r
-The Plug-in view receives keyboard events from the host. A view implementation must not handle\r
-keyboard events by the means of platform callbacks, but let the host pass them to the view. The host\r
-depends on a proper return value when IPlugView::onKeyDown is called, otherwise the Plug-in view may\r
-cause a malfunction of the host's key command handling!\r
-\r
-\see IPlugFrame, \ref platformUIType\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPlugView : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Is Platform UI Type supported\r
- \param type : IDString of \ref platformUIType */\r
- virtual tresult PLUGIN_API isPlatformTypeSupported (FIDString type) = 0;\r
-\r
- /** The parent window of the view has been created, the (platform) representation of the view\r
- should now be created as well.\r
- Note that the parent is owned by the caller and you are not allowed to alter it in any way\r
- other than adding your own views.\r
- Note that in this call the Plug-in could call a IPlugFrame::resizeView ()!\r
- \param parent : platform handle of the parent window or view\r
- \param type : \ref platformUIType which should be created */\r
- virtual tresult PLUGIN_API attached (void* parent, FIDString type) = 0;\r
-\r
- /** The parent window of the view is about to be destroyed.\r
- You have to remove all your own views from the parent window or view. */\r
- virtual tresult PLUGIN_API removed () = 0;\r
-\r
- /** Handling of mouse wheel. */\r
- virtual tresult PLUGIN_API onWheel (float distance) = 0;\r
-\r
- /** Handling of keyboard events : Key Down.\r
- \param key : unicode code of key\r
- \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h\r
- \param modifiers : any combination of modifiers - see \ref KeyModifier in keycodes.h\r
- \return kResultTrue if the key is handled, otherwise kResultFalse. \n\r
- <b> Please note that kResultTrue must only be returned if the key has really been\r
- handled. </b> Otherwise key command handling of the host might be blocked! */\r
- virtual tresult PLUGIN_API onKeyDown (char16 key, int16 keyCode, int16 modifiers) = 0;\r
-\r
- /** Handling of keyboard events : Key Up.\r
- \param key : unicode code of key\r
- \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h\r
- \param modifiers : any combination of KeyModifier - see \ref KeyModifier in keycodes.h\r
- \return kResultTrue if the key is handled, otherwise return kResultFalse. */\r
- virtual tresult PLUGIN_API onKeyUp (char16 key, int16 keyCode, int16 modifiers) = 0;\r
-\r
- /** Returns the size of the platform representation of the view. */\r
- virtual tresult PLUGIN_API getSize (ViewRect* size) = 0;\r
-\r
- /** Resizes the platform representation of the view to the given rect. Note that if the Plug-in\r
- * requests a resize (IPlugFrame::resizeView ()) onSize has to be called afterward. */\r
- virtual tresult PLUGIN_API onSize (ViewRect* newSize) = 0;\r
-\r
- /** Focus changed message. */\r
- virtual tresult PLUGIN_API onFocus (TBool state) = 0;\r
-\r
- /** Sets IPlugFrame object to allow the Plug-in to inform the host about resizing. */\r
- virtual tresult PLUGIN_API setFrame (IPlugFrame* frame) = 0;\r
-\r
- /** Is view sizable by user. */\r
- virtual tresult PLUGIN_API canResize () = 0;\r
-\r
- /** On live resize this is called to check if the view can be resized to the given rect, if not\r
- * adjust the rect to the allowed size. */\r
- virtual tresult PLUGIN_API checkSizeConstraint (ViewRect* rect) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugView, 0x5BC32507, 0xD06049EA, 0xA6151B52, 0x2B755B29)\r
-\r
-//------------------------------------------------------------------------\r
-/** Callback interface passed to IPlugView.\r
-\ingroup pluginGUI vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-Enables a Plug-in to resize the view and cause the host to resize the window.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IPlugFrame : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Called to inform the host about the resize of a given view.\r
- * Afterwards the host has to call IPlugView::onSize (). */\r
- virtual tresult PLUGIN_API resizeView (IPlugView* view, ViewRect* newSize) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugFrame, 0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3)\r
-\r
-#if SMTG_OS_LINUX\r
-//------------------------------------------------------------------------\r
-namespace Linux {\r
-\r
-using TimerInterval = uint64;\r
-using FileDescriptor = int;\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux event handler interface\r
-\ingroup pluginGUI vst368\r
-- [plug imp]\r
-- [released: 3.6.8]\r
-\see IRunLoop\r
-*/\r
-class IEventHandler : public FUnknown\r
-{\r
-public:\r
- virtual void PLUGIN_API onFDIsSet (FileDescriptor fd) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IEventHandler, 0x561E65C9, 0x13A0496F, 0x813A2C35, 0x654D7983)\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux timer handler interface\r
-\ingroup pluginGUI vst368\r
-- [plug imp]\r
-- [released: 3.6.8]\r
-\see IRunLoop\r
-*/\r
-class ITimerHandler : public FUnknown\r
-{\r
-public:\r
- virtual void PLUGIN_API onTimer () = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (ITimerHandler, 0x10BDD94F, 0x41424774, 0x821FAD8F, 0xECA72CA9)\r
-\r
-//------------------------------------------------------------------------\r
-/** Linux host run loop interface\r
-\ingroup pluginGUI vst368\r
-- [host imp]\r
-- [extends IPlugFrame]\r
-- [released: 3.6.8]\r
-\r
-On Linux the host has to provide this interface to the plug-in as there's no global event run loop\r
-defined as on other platforms.\r
-\r
-A plug-in can register an event handler for a file descriptor. The host has to call the event\r
-handler when the file descriptor is marked readable.\r
-\r
-A plug-in also can register a timer which will be called repeatedly until it is unregistered.\r
-*/\r
-class IRunLoop : public FUnknown\r
-{\r
-public:\r
- virtual tresult PLUGIN_API registerEventHandler (IEventHandler* handler, FileDescriptor fd) = 0;\r
- virtual tresult PLUGIN_API unregisterEventHandler (IEventHandler* handler) = 0;\r
-\r
- virtual tresult PLUGIN_API registerTimer (ITimerHandler* handler,\r
- TimerInterval milliseconds) = 0;\r
- virtual tresult PLUGIN_API unregisterTimer (ITimerHandler* handler) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IRunLoop, 0x18C35366, 0x97764F1A, 0x9C5B8385, 0x7A871389)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Linux\r
-\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : SDK GUI Interfaces\r
-// Filename : pluginterfaces/gui/iplugviewcontentscalesupport.h\r
-// Created by : Steinberg, 06/2016\r
-// Description : Plug-in User Interface Scaling\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Plug-in view content scale support\r
-\ingroup pluginGUI vstIPlug vst366\r
-- [plug impl]\r
-- [extends IPlugView]\r
-- [optional]\r
-\r
-This interface communicates the content scale factor from the host to the plug-in view on\r
-systems where plug-ins cannot get this information directly like Microsoft Windows.\r
-\r
-The host calls setContentScaleFactor directly after the plug view was attached and when the scale\r
-factor changes (system change or window moved to another screen with different scaling settings).\r
-The host could call setContentScaleFactor in a different context, for example: scaling the\r
-plug-in editor for better readability.\r
-When a plug-in handles this (by returning kResultTrue), it needs to scale the width and height of\r
-its view by the scale factor and inform the host via a IPlugFrame::resizeView(), the host will then\r
-call IPlugView::onSize()\r
- */\r
-class IPlugViewContentScaleSupport : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- typedef float ScaleFactor;\r
-\r
- virtual tresult PLUGIN_API setContentScaleFactor (ScaleFactor factor) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPlugViewContentScaleSupport, 0x65ED9690, 0x8AC44525, 0x8AADEF7A, 0x72EA703F)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstattributes.h\r
-// Created by : Steinberg, 05/2006\r
-// Description : VST Attribute Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Attribute list used in IMessage and IStreamAttributes.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-An attribute list associates values with a key (id: some predefined keys could be found in \ref presetAttributes). */\r
-//------------------------------------------------------------------------\r
-class IAttributeList: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- typedef const char* AttrID;\r
-\r
- /** Sets integer value. */\r
- virtual tresult PLUGIN_API setInt (AttrID id, int64 value) = 0;\r
-\r
- /** Gets integer value. */\r
- virtual tresult PLUGIN_API getInt (AttrID id, int64& value) = 0;\r
-\r
- /** Sets float value. */\r
- virtual tresult PLUGIN_API setFloat (AttrID id, double value) = 0;\r
-\r
- /** Gets float value. */\r
- virtual tresult PLUGIN_API getFloat (AttrID id, double& value) = 0;\r
-\r
- /** Sets string value (UTF16). */\r
- virtual tresult PLUGIN_API setString (AttrID id, const TChar* string) = 0;\r
-\r
- /** Gets string value (UTF16). Note that Size is in Byte, not the string Length! (Do not forget to multiply the length by sizeof (TChar)!) */\r
- virtual tresult PLUGIN_API getString (AttrID id, TChar* string, uint32 size) = 0;\r
-\r
- /** Sets binary data. */\r
- virtual tresult PLUGIN_API setBinary (AttrID id, const void* data, uint32 size) = 0;\r
-\r
- /** Gets binary data. */\r
- virtual tresult PLUGIN_API getBinary (AttrID id, const void*& data, uint32& size) = 0;\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAttributeList, 0x1E5F0AEB, 0xCC7F4533, 0xA2544011, 0x38AD5EE4)\r
-\r
-//------------------------------------------------------------------------\r
-/** Meta attributes of a stream.\r
-\ingroup vstIHost vst360\r
-- [host imp]\r
-- [extends IBStream]\r
-- [released: 3.6.0]\r
-\r
-\code\r
-...\r
-#include "pluginterfaces/base/ustring.h"\r
-#include "pluginterfaces/vst/vstpresetkeys.h"\r
-...\r
-\r
-tresult PLUGIN_API MyPlugin::setState (IBStream* state)\r
-{\r
- FUnknownPtr<IStreamAttributes> stream (state);\r
- if (stream)\r
- {\r
- IAttributeList* list = stream->getAttributes ();\r
- if (list)\r
- {\r
- // get the current type (project/Default..) of this state\r
- String128 string;\r
- if (list->getString (PresetAttributes::kStateType, string, 128 * sizeof (TChar)) == kResultTrue)\r
- {\r
- UString128 tmp (string);\r
- char ascii[128];\r
- tmp.toAscii (ascii, 128);\r
- if (!strncmp (ascii, StateType::kProject, strlen (StateType::kProject)))\r
- {\r
- // we are in project loading context...\r
- }\r
- }\r
-\r
- // get the full file path of this state\r
- TChar fullPath[1024];\r
- if (list->getString (PresetAttributes::kFilePathStringType, fullPath, 1024 * sizeof (TChar)) == kResultTrue)\r
- {\r
- // here we have the full path ...\r
- }\r
- }\r
- }\r
-\r
- //...read the state here.....\r
- return kResultTrue;\r
-}\r
-\endcode\r
-Interface to access preset meta information from stream, used for example in setState in order to inform the plug-in about\r
-the current context in which this preset loading occurs (Project context or Preset load (see \ref StateType))\r
-or used to get the full file path of the loaded preset (if available). */\r
-//------------------------------------------------------------------------\r
-class IStreamAttributes: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** Gets filename (without file extension) of the stream. */\r
- virtual tresult PLUGIN_API getFileName (String128 name) = 0;\r
-\r
- /** Gets meta information list. */\r
- virtual IAttributeList* PLUGIN_API getAttributes () = 0;\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IStreamAttributes, 0xD6CE2FFC, 0xEFAF4B8C, 0x9E74F1BB, 0x12DA44B4)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstaudioprocessor.h\r
-// Created by : Steinberg, 10/2005\r
-// Description : VST Audio Processing Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "ivstcomponent.h"\r
-#include "vstspeaker.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Class Category Name for Audio Processor Component */\r
-//------------------------------------------------------------------------\r
-#ifndef kVstAudioEffectClass\r
-#define kVstAudioEffectClass "Audio Module Class"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-class IEventList;\r
-class IParameterChanges;\r
-struct ProcessContext;\r
-\r
-//------------------------------------------------------------------------\r
-/** Component Types used as subCategories in PClassInfo2 */\r
-//------------------------------------------------------------------------\r
-namespace PlugType\r
-{\r
-/**\r
-\defgroup plugType Plug-in Type used for subCategories */\r
-/*@{*/\r
-//------------------------------------------------------------------------\r
-const CString kFxAnalyzer = "Fx|Analyzer"; ///< Scope, FFT-Display, Loudness Processing...\r
-const CString kFxDelay = "Fx|Delay"; ///< Delay, Multi-tap Delay, Ping-Pong Delay...\r
-const CString kFxDistortion = "Fx|Distortion"; ///< Amp Simulator, Sub-Harmonic, SoftClipper...\r
-const CString kFxDynamics = "Fx|Dynamics"; ///< Compressor, Expander, Gate, Limiter, Maximizer, Tape Simulator, EnvelopeShaper...\r
-const CString kFxEQ = "Fx|EQ"; ///< Equalization, Graphical EQ...\r
-const CString kFxFilter = "Fx|Filter"; ///< WahWah, ToneBooster, Specific Filter,...\r
-const CString kFx = "Fx"; ///< others type (not categorized)\r
-const CString kFxInstrument = "Fx|Instrument"; ///< Fx which could be loaded as Instrument too\r
-const CString kFxInstrumentExternal = "Fx|Instrument|External"; ///< Fx which could be loaded as Instrument too and is external (wrapped Hardware)\r
-const CString kFxSpatial = "Fx|Spatial"; ///< MonoToStereo, StereoEnhancer,...\r
-const CString kFxGenerator = "Fx|Generator"; ///< Tone Generator, Noise Generator...\r
-const CString kFxMastering = "Fx|Mastering"; ///< Dither, Noise Shaping,...\r
-const CString kFxModulation = "Fx|Modulation"; ///< Phaser, Flanger, Chorus, Tremolo, Vibrato, AutoPan, Rotary, Cloner...\r
-const CString kFxPitchShift = "Fx|Pitch Shift"; ///< Pitch Processing, Pitch Correction, Vocal Tuning...\r
-const CString kFxRestoration = "Fx|Restoration"; ///< Denoiser, Declicker,...\r
-const CString kFxReverb = "Fx|Reverb"; ///< Reverberation, Room Simulation, Convolution Reverb...\r
-const CString kFxSurround = "Fx|Surround"; ///< dedicated to surround processing: LFE Splitter, Bass Manager...\r
-const CString kFxTools = "Fx|Tools"; ///< Volume, Mixer, Tuner...\r
-const CString kFxNetwork = "Fx|Network"; ///< using Network\r
-\r
-const CString kInstrument = "Instrument"; ///< Effect used as instrument (sound generator), not as insert\r
-const CString kInstrumentDrum = "Instrument|Drum"; ///< Instrument for Drum sounds\r
-const CString kInstrumentSampler = "Instrument|Sampler"; ///< Instrument based on Samples\r
-const CString kInstrumentSynth = "Instrument|Synth"; ///< Instrument based on Synthesis\r
-const CString kInstrumentSynthSampler = "Instrument|Synth|Sampler"; ///< Instrument based on Synthesis and Samples\r
-const CString kInstrumentExternal = "Instrument|External";///< External Instrument (wrapped Hardware)\r
-\r
-const CString kSpatial = "Spatial"; ///< used for SurroundPanner\r
-const CString kSpatialFx = "Spatial|Fx"; ///< used for SurroundPanner and as insert effect\r
-const CString kOnlyRealTime = "OnlyRT"; ///< indicates that it supports only realtime process call, no processing faster than realtime\r
-const CString kOnlyOfflineProcess = "OnlyOfflineProcess"; ///< used for Plug-in offline processing (will not work as normal insert Plug-in)\r
-const CString kNoOfflineProcess = "NoOfflineProcess"; ///< will be NOT used for Plug-in offline processing (will work as normal insert Plug-in)\r
-const CString kUpDownMix = "Up-Downmix"; ///< used for Mixconverter/Up-Mixer/Down-Mixer\r
-const CString kAnalyzer = "Analyzer"; ///< Meter, Scope, FFT-Display, not selectable as insert plugin\r
-const CString kAmbisonic = "Ambisonic"; ///< used for Ambisonic channel (FX or Panner/Mixconverter/Up-Mixer/Down-Mixer when combined with other category)\r
-\r
-const CString kMono = "Mono"; ///< used for Mono only Plug-in [optional]\r
-const CString kStereo = "Stereo"; ///< used for Stereo only Plug-in [optional]\r
-const CString kSurround = "Surround"; ///< used for Surround only Plug-in [optional]\r
-\r
-//------------------------------------------------------------------------\r
-/*@}*/\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Component Flags used as classFlags in PClassInfo2 */\r
-//------------------------------------------------------------------------\r
-enum ComponentFlags\r
-{\r
-//------------------------------------------------------------------------\r
- kDistributable = 1 << 0, ///< Component can be run on remote computer\r
- kSimpleModeSupported = 1 << 1 ///< Component supports simple IO mode (or works in simple mode anyway) see \ref vst3IoMode\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Symbolic sample size.\r
-\see ProcessSetup, ProcessData */\r
-//------------------------------------------------------------------------\r
-enum SymbolicSampleSizes\r
-{\r
- kSample32, ///< 32-bit precision\r
- kSample64 ///< 64-bit precision\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Processing mode informs the Plug-in about the context and at which frequency the process call is called.\r
-VST3 defines 3 modes:\r
-- kRealtime: each process call is called at a realtime frequency (defined by [numSamples of ProcessData] / samplerate).\r
- The Plug-in should always try to process as fast as possible in order to let enough time slice to other Plug-ins.\r
-- kPrefetch: each process call could be called at a variable frequency (jitter, slower / faster than realtime),\r
- the Plug-in should process at the same quality level than realtime, Plug-in must not slow down to realtime\r
- (e.g. disk streaming)!\r
- The host should avoid to process in kPrefetch mode such sampler based Plug-in.\r
-- kOffline: each process call could be faster than realtime or slower, higher quality than realtime could be used.\r
- Plug-ins using disk streaming should be sure that they have enough time in the process call for streaming,\r
- if needed by slowing down to realtime or slower.\r
-.\r
-Note about Process Modes switching:\r
- -Switching between kRealtime and kPrefetch process modes are done in realtime thread without need of calling\r
- IAudioProcessor::setupProcessing, the Plug-in should check in process call the member processMode of ProcessData\r
- in order to know in which mode it is processed.\r
- -Switching between kRealtime (or kPrefetch) and kOffline requires that the host calls IAudioProcessor::setupProcessing\r
- in order to inform the Plug-in about this mode change.\r
-.\r
-\see ProcessSetup, ProcessData */\r
-//------------------------------------------------------------------------\r
-enum ProcessModes\r
-{\r
- kRealtime, ///< realtime processing\r
- kPrefetch, ///< prefetch processing\r
- kOffline ///< offline processing\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** kNoTail\r
- *\r
- * to be returned by getTailSamples when no tail is wanted\r
- \see IAudioProcessor::getTailSamples */\r
-//------------------------------------------------------------------------\r
-static const uint32 kNoTail = 0;\r
-//------------------------------------------------------------------------\r
-/** kInfiniteTail\r
- *\r
- * to be returned by getTailSamples when infinite tail is wanted\r
- \see IAudioProcessor::getTailSamples */\r
-//------------------------------------------------------------------------\r
-static const uint32 kInfiniteTail = kMaxInt32u;\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio processing setup.\r
-\see IAudioProcessor::setupProcessing */\r
-//------------------------------------------------------------------------\r
-struct ProcessSetup\r
-{\r
-//------------------------------------------------------------------------\r
- int32 processMode; ///< \ref ProcessModes\r
- int32 symbolicSampleSize; ///< \ref SymbolicSampleSizes\r
- int32 maxSamplesPerBlock; ///< maximum number of samples per audio block\r
- SampleRate sampleRate; ///< sample rate\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Processing buffers of an audio bus.\r
-This structure contains the processing buffer for each channel of an audio bus.\r
-- The number of channels (numChannels) must always match the current bus arrangement.\r
- It could be set to value '0' when the host wants to flush the parameters (when the Plug-in is not processed).\r
-- The size of the channel buffer array must always match the number of channels. So the host\r
- must always supply an array for the channel buffers, regardless if the\r
- bus is active or not. However, if an audio bus is currently inactive, the actual sample\r
- buffer addresses are safe to be null.\r
-- The silence flag is set when every sample of the according buffer has the value '0'. It is\r
- intended to be used as help for optimizations allowing a Plug-in to reduce processing activities.\r
- But even if this flag is set for a channel, the channel buffers must still point to valid memory!\r
- This flag is optional. A host is free to support it or not.\r
-.\r
-\see ProcessData */\r
-//------------------------------------------------------------------------\r
-struct AudioBusBuffers\r
-{\r
- AudioBusBuffers () : numChannels (0), silenceFlags (0), channelBuffers64 (0) {}\r
-\r
-//------------------------------------------------------------------------\r
- int32 numChannels; ///< number of audio channels in bus\r
- uint64 silenceFlags; ///< Bitset of silence state per channel\r
- union\r
- {\r
- Sample32** channelBuffers32; ///< sample buffers to process with 32-bit precision\r
- Sample64** channelBuffers64; ///< sample buffers to process with 64-bit precision\r
- };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Any data needed in audio processing.\r
- The host prepares AudioBusBuffers for each input/output bus,\r
- regardless of the bus activation state. Bus buffer indices always match\r
- with bus indices used in IComponent::getBusInfo of media type kAudio.\r
-\see AudioBusBuffers, IParameterChanges, IEventList, ProcessContext */\r
-//------------------------------------------------------------------------\r
-struct ProcessData\r
-{\r
- ProcessData ()\r
- : processMode (0), symbolicSampleSize (kSample32), numSamples (0), numInputs (0)\r
- , numOutputs (0), inputs (0), outputs (0), inputParameterChanges (0), outputParameterChanges (0)\r
- , inputEvents (0), outputEvents (0), processContext (0) {}\r
-\r
-//------------------------------------------------------------------------\r
- int32 processMode; ///< processing mode - value of \ref ProcessModes\r
- int32 symbolicSampleSize; ///< sample size - value of \ref SymbolicSampleSizes\r
- int32 numSamples; ///< number of samples to process\r
- int32 numInputs; ///< number of audio input buses\r
- int32 numOutputs; ///< number of audio output buses\r
- AudioBusBuffers* inputs; ///< buffers of input buses\r
- AudioBusBuffers* outputs; ///< buffers of output buses\r
-\r
- IParameterChanges* inputParameterChanges; ///< incoming parameter changes for this block\r
- IParameterChanges* outputParameterChanges; ///< outgoing parameter changes for this block (optional)\r
- IEventList* inputEvents; ///< incoming events for this block (optional)\r
- IEventList* outputEvents; ///< outgoing events for this block (optional)\r
- ProcessContext* processContext; ///< processing context (optional, but most welcome)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio Processing Interface.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-- [mandatory]\r
-\r
-This interface must always be supported by audio processing Plug-ins. */\r
-//------------------------------------------------------------------------\r
-class IAudioProcessor: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Try to set (from host) a predefined arrangement for inputs and outputs.\r
- The host should always deliver the same number of input and output buses than the Plug-in needs\r
- (see \ref IComponent::getBusCount).\r
- The Plug-in returns kResultFalse if wanted arrangements are not supported.\r
- If the Plug-in accepts these arrangements, it should modify its buses to match the new arrangements\r
- (asked by the host with IComponent::getInfo () or IAudioProcessor::getBusArrangement ()) and then return kResultTrue.\r
- If the Plug-in does not accept these arrangements, but can adapt its current arrangements (according to the wanted ones),\r
- it should modify its buses arrangements and return kResultFalse. */\r
- virtual tresult PLUGIN_API setBusArrangements (SpeakerArrangement* inputs, int32 numIns,\r
- SpeakerArrangement* outputs, int32 numOuts) = 0;\r
-\r
- /** Gets the bus arrangement for a given direction (input/output) and index.\r
- Note: IComponent::getInfo () and IAudioProcessor::getBusArrangement () should be always return the same\r
- information about the buses arrangements. */\r
- virtual tresult PLUGIN_API getBusArrangement (BusDirection dir, int32 index, SpeakerArrangement& arr) = 0;\r
-\r
- /** Asks if a given sample size is supported see \ref SymbolicSampleSizes. */\r
- virtual tresult PLUGIN_API canProcessSampleSize (int32 symbolicSampleSize) = 0;\r
-\r
- /** Gets the current Latency in samples.\r
- The returned value defines the group delay or the latency of the Plug-in. For example, if the Plug-in internally needs\r
- to look in advance (like compressors) 512 samples then this Plug-in should report 512 as latency.\r
- If during the use of the Plug-in this latency change, the Plug-in has to inform the host by\r
- using IComponentHandler::restartComponent (kLatencyChanged), this could lead to audio playback interruption\r
- because the host has to recompute its internal mixer delay compensation.\r
- Note that for player live recording this latency should be zero or small. */\r
- virtual uint32 PLUGIN_API getLatencySamples () = 0;\r
-\r
- /** Called in disable state (not active) before processing will begin. */\r
- virtual tresult PLUGIN_API setupProcessing (ProcessSetup& setup) = 0;\r
-\r
- /** Informs the Plug-in about the processing state. This will be called before any process calls start with true and after with false.\r
- Note that setProcessing (false) may be called after setProcessing (true) without any process calls.\r
- In this call the Plug-in should do only light operation (no memory allocation or big setup reconfiguration),\r
- this could be used to reset some buffers (like Delay line or Reverb). */\r
- virtual tresult PLUGIN_API setProcessing (TBool state) = 0;\r
-\r
- /** The Process call, where all information (parameter changes, event, audio buffer) are passed. */\r
- virtual tresult PLUGIN_API process (ProcessData& data) = 0;\r
-\r
- /** Gets tail size in samples. For example, if the Plug-in is a Reverb Plug-in and it knows that\r
- the maximum length of the Reverb is 2sec, then it has to return in getTailSamples()\r
- (in VST2 it was getGetTailSize ()): 2*sampleRate.\r
- This information could be used by host for offline processing, process optimization and\r
- downmix (avoiding signal cut (clicks)).\r
- It should return:\r
- - kNoTail when no tail\r
- - x * sampleRate when x Sec tail.\r
- - kInfiniteTail when infinite tail. */\r
- virtual uint32 PLUGIN_API getTailSamples () = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAudioProcessor, 0x42043F99, 0xB7DA453C, 0xA569E79D, 0x9AAEC33D)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended IAudioProcessor interface for a component.\r
-\ingroup vstIPlug vst310\r
-- [plug imp]\r
-- [extends IAudioProcessor]\r
-- [released: 3.1.0]\r
-\r
-Inform the Plug-in about how long from the moment of generation/acquiring (from file or from Input)\r
-it will take for its input to arrive, and how long it will take for its output to be presented (to output or to Speaker).\r
-\r
-Note for Input Presentation Latency: when reading from file, the first Plug-in will have an input presentation latency set to zero.\r
-When monitoring audio input from a Audio Device, then this initial input latency will be the input latency of the Audio Device itself.\r
-\r
-Note for Output Presentation Latency: when writing to a file, the last Plug-in will have an output presentation latency set to zero.\r
-When the output of this Plug-in is connected to a Audio Device then this initial output latency will be the output\r
-latency of the Audio Device itself.\r
-\r
-A value of zero means either no latency or an unknown latency.\r
-\r
-Each Plug-in adding a latency (returning a none zero value for IAudioProcessor::getLatencySamples) will modify the input\r
-presentation latency of the next Plug-ins in the mixer routing graph and will modify the output presentation latency\r
-of the previous Plug-ins.\r
-\r
-\n\r
-\image html "iaudiopresentationlatency_usage.png"\r
-\n\r
-\see IAudioProcessor\r
-\see IComponent*/\r
-//------------------------------------------------------------------------\r
-class IAudioPresentationLatency: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** Informs the Plug-in about the Audio Presentation Latency in samples for a given direction (kInput/kOutput) and bus index. */\r
- virtual tresult PLUGIN_API setAudioPresentationLatencySamples (BusDirection dir, int32 busIndex, uint32 latencyInSamples) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAudioPresentationLatency, 0x309ECE78, 0xEB7D4fae, 0x8B2225D9, 0x09FD08B6)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstautomationstate.h\r
-// Created by : Steinberg, 02/2015\r
-// Description : VST Automation State Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended IComponent interface for a component.\r
-\ingroup vstIPlug vst365\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-Hosts could inform the Plug-in about its current automation state (Read/Write/Nothing).\r
-*/\r
-//------------------------------------------------------------------------\r
-class IAutomationState : public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- enum AutomationStates\r
- {\r
- kNoAutomation = 0, ///< Not Read and not Write\r
- kReadState = 1 << 0, ///< Read state\r
- kWriteState = 1 << 1, ///< Write state\r
-\r
- kReadWriteState = kReadState | kWriteState, ///< Read and Write enable\r
- };\r
-\r
- /** Sets the current Automation state. */\r
- virtual tresult PLUGIN_API setAutomationState (int32 state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IAutomationState, 0xB4E8287F, 0x1BB346AA, 0x83A46667, 0x68937BAB)\r
-\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstchannelcontextinfo.h\r
-// Created by : Steinberg, 02/2014\r
-// Description : VST Channel Context Info Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-/** For Channel Context Info Interface */\r
-namespace ChannelContext {\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** Channel Context Interface.\r
-\ingroup vstIHost vst365\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-Allows the host to inform the Plug-in about the context in which the Plug-in is instantiated,\r
-mainly channel based info (color, name, index,...). Index could be defined inside a namespace\r
-(for example index start from 1 to N for Type Input/Output Channel (Index namespace) and index\r
-start from 1 to M for Type Audio Channel).\n\r
-As soon as the Plug-in provides this IInfoListener interface, the host will call setChannelContextInfos\r
-for each change occurring to this channel (new name, new color, new indexation,...)\r
-\r
-\section IChannelContextExample Example\r
-\code\r
-tresult PLUGIN_API MyPlugin::setChannelContextInfos (IAttributeList* list)\r
-{\r
- if (list)\r
- {\r
- // optional we can ask for the Channel Name Length\r
- int64 length;\r
- if (list->getInt (ChannelContext::kChannelNameLengthKey, length) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get the Channel Name where we, as Plug-in, are instantiated\r
- String128 name;\r
- if (list->getString (ChannelContext::kChannelNameKey, name, sizeof (name)) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get the Channel UID\r
- if (list->getString (ChannelContext::kChannelUIDKey, name, sizeof (name)) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get Channel Index\r
- int64 index;\r
- if (list->getInt (ChannelContext::kChannelIndexKey, index) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get the Channel Color\r
- int64 color;\r
- if (list->getInt (ChannelContext::kChannelColorKey, color) == kResultTrue)\r
- {\r
- uint32 channelColor = (uint32)color;\r
- String str;\r
- str.printf ("%x%x%x%x", ChannelContext::GetAlpha (channelColor),\r
- ChannelContext::GetRed (channelColor),\r
- ChannelContext::GetGreen (channelColor),\r
- ChannelContext::GetBlue (channelColor));\r
- String128 string128;\r
- Steinberg::UString (string128, 128).fromAscii (str);\r
- ...\r
- }\r
-\r
- // get Channel Index Namespace Order of the current used index namespace\r
- if (list->getInt (ChannelContext::kChannelIndexNamespaceOrderKey, index) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get the channel Index Namespace Length\r
- if (list->getInt (ChannelContext::kChannelIndexNamespaceLengthKey, length) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get the channel Index Namespace\r
- String128 namespaceName;\r
- if (list->getString (ChannelContext::kChannelIndexNamespaceKey, namespaceName, sizeof (namespaceName)) == kResultTrue)\r
- {\r
- ...\r
- }\r
-\r
- // get Plug-in Channel Location\r
- int64 location;\r
- if (list->getInt (ChannelContext::kChannelPluginLocationKey, location) == kResultTrue)\r
- {\r
- String128 string128;\r
- switch (location)\r
- {\r
- case ChannelContext::kPreVolumeFader:\r
- Steinberg::UString (string128, 128).fromAscii ("PreVolFader");\r
- break;\r
- case ChannelContext::kPostVolumeFader:\r
- Steinberg::UString (string128, 128).fromAscii ("PostVolFader");\r
- break;\r
- case ChannelContext::kUsedAsPanner:\r
- Steinberg::UString (string128, 128).fromAscii ("UsedAsPanner");\r
- break;\r
- default: Steinberg::UString (string128, 128).fromAscii ("unknown!");\r
- break;\r
- }\r
- }\r
-\r
- // do not forget to call addRef () if you want to keep this list\r
- }\r
-}\r
-\endcode */\r
-//------------------------------------------------------------------------\r
-class IInfoListener: public FUnknown\r
-{\r
-public:\r
- /** Receive the channel context infos from host. */\r
- virtual tresult PLUGIN_API setChannelContextInfos (IAttributeList* list) = 0;\r
-\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInfoListener, 0x0F194781, 0x8D984ADA, 0xBBA0C1EF, 0xC011D8D0)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Values used for kChannelPluginLocationKey */\r
-//------------------------------------------------------------------------\r
-enum ChannelPluginLocation\r
-{\r
- kPreVolumeFader = 0,\r
- kPostVolumeFader,\r
- kUsedAsPanner\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-// Colors\r
-typedef uint32 ColorSpec; ///< ARGB (Alpha-Red-Green-Blue)\r
-typedef uint8 ColorComponent;\r
-\r
-inline ColorComponent GetBlue (ColorSpec cs) {return (ColorComponent)(cs & 0x000000FF); }\r
-inline ColorComponent GetGreen (ColorSpec cs) {return (ColorComponent)((cs >> 8) & 0x000000FF); }\r
-inline ColorComponent GetRed (ColorSpec cs) {return (ColorComponent)((cs >> 16) & 0x000000FF); }\r
-inline ColorComponent GetAlpha (ColorSpec cs) {return (ColorComponent)((cs >> 24) & 0x000000FF); }\r
-\r
-//------------------------------------------------------------------------\r
-/** Keys used as AttrID (Attribute ID) in the return IAttributeList of\r
- * IInfoListener::setChannelContextInfos */\r
-//------------------------------------------------------------------------\r
-/** string (TChar) [optional]: unique id string used to identify a channel */\r
-const CString kChannelUIDKey = "channel uid";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelUIDKey */\r
-const CString kChannelUIDLengthKey = "channel uid length";\r
-\r
-/** string (TChar) [optional]: name of the channel like displayed in the mixer */\r
-const CString kChannelNameKey = "channel name";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelNameKey */\r
-const CString kChannelNameLengthKey = "channel name length";\r
-\r
-/** color (ColorSpec) [optional]: used color for the channel in mixer or track */\r
-const CString kChannelColorKey = "channel color";\r
-\r
-/** integer (int64) [optional]: index of the channel in a channel index namespace, start with 1 not * 0! */\r
-const CString kChannelIndexKey = "channel index";\r
-\r
-/** integer (int64) [optional]: define the order of the current used index namespace, start with 1 not 0!\r
- For example:\r
- index namespace is "Input" -> order 1,\r
- index namespace is "Channel" -> order 2,\r
- index namespace is "Output" -> order 3 */\r
-const CString kChannelIndexNamespaceOrderKey = "channel index namespace order";\r
-\r
-/** string (TChar) [optional]: name of the channel index namespace for example "Input", "Output", "Channel", ... */\r
-const CString kChannelIndexNamespaceKey = "channel index namespace";\r
-\r
-/** integer (int64) [optional]: number of characters in kChannelIndexNamespaceKey */\r
-const CString kChannelIndexNamespaceLengthKey = "channel index namespace length";\r
-\r
-/** PNG image representation as binary [optional] */\r
-const CString kChannelImageKey = "channel image";\r
-\r
-/** integer (int64) [optional]: routing position of the Plug-in in the channel (see ChannelPluginLocation) */\r
-const CString kChannelPluginLocationKey = "channel plugin location";\r
-//------------------------------------------------------------------------\r
-\r
-} // namespace ChannelContext\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstcomponent.h\r
-// Created by : Steinberg, 04/2005\r
-// Description : Basic VST Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-/** All VST specific interfaces are located in Vst namespace */\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-const int32 kDefaultFactoryFlags = PFactoryInfo::kUnicode; ///< Standard value for PFactoryInfo::flags\r
-\r
-#define BEGIN_FACTORY_DEF(vendor,url,email) using namespace Steinberg; \\r
- EXPORT_FACTORY IPluginFactory* PLUGIN_API GetPluginFactory () { \\r
- if (!gPluginFactory) \\r
- { static PFactoryInfo factoryInfo (vendor,url,email,Vst::kDefaultFactoryFlags); \\r
- gPluginFactory = new CPluginFactory (factoryInfo);\r
-\r
-//------------------------------------------------------------------------\r
-/** \defgroup vstBus VST Buses\r
-Bus Description\r
-\r
-A bus can be understood as a "collection of data channels" belonging together.\r
-It describes a data input or a data output of the Plug-in.\r
-A VST component can define any desired number of buses, but this number must \b never change.\r
-Dynamic usage of buses is handled in the host by activating and deactivating buses.\r
-The component has to define the maximum number of supported buses and it has to\r
-define which of them are active by default. A host that can handle multiple buses,\r
-allows the user to activate buses that were initially inactive.\r
-\r
-See also: IComponent::getBusInfo, IComponent::activateBus\r
-\r
-@{*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus media types */\r
-//------------------------------------------------------------------------\r
-enum MediaTypes\r
-{\r
-//------------------------------------------------------------------------\r
- kAudio = 0, ///< audio\r
- kEvent, ///< events\r
- kNumMediaTypes\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus directions */\r
-//------------------------------------------------------------------------\r
-enum BusDirections\r
-{\r
-//------------------------------------------------------------------------\r
- kInput = 0, ///< input bus\r
- kOutput ///< output bus\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Bus types */\r
-//------------------------------------------------------------------------\r
-enum BusTypes\r
-{\r
-//------------------------------------------------------------------------\r
- kMain = 0, ///< main bus\r
- kAux ///< auxiliary bus (sidechain)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** BusInfo:\r
-This is the structure used with getBusInfo, informing the host about what is a specific given bus.\r
-See also: IComponent::getBusInfo\r
-*/\r
-//------------------------------------------------------------------------\r
-struct BusInfo\r
-{\r
-//------------------------------------------------------------------------\r
- MediaType mediaType; ///< Media type - has to be a value of \ref MediaTypes\r
- BusDirection direction; ///< input or output \ref BusDirections\r
- int32 channelCount; ///< number of channels (if used then need to be recheck after \ref\r
- /// IAudioProcessor::setBusArrangements is called).\r
- /// For a bus of type MediaTypes::kEvent the channelCount corresponds\r
- /// to the number of supported MIDI channels by this bus\r
- String128 name; ///< name of the bus\r
- BusType busType; ///< main or aux - has to be a value of \ref BusTypes\r
- uint32 flags; ///< flags - a combination of \ref BusFlags\r
- enum BusFlags\r
- {\r
- kDefaultActive = 1 << 0 ///< bus active per default\r
- };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** I/O modes */\r
-//------------------------------------------------------------------------\r
-enum IoModes\r
-{\r
- kSimple = 0, ///< 1:1 Input / Output. Only used for Instruments. See \ref vst3IoMode\r
- kAdvanced, ///< n:m Input / Output. Only used for Instruments.\r
- kOfflineProcessing ///< Plug-in used in an offline processing context\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Routing Information:\r
- When the Plug-in supports multiple I/O buses, a host may want to know how the\r
- buses are related. The relation of an event-input-channel to an audio-output-bus\r
- in particular is of interest to the host (in order to relate MIDI-tracks to audio-channels)\r
- \n See also: IComponent::getRoutingInfo, \ref vst3Routing */\r
-//------------------------------------------------------------------------\r
-struct RoutingInfo\r
-{\r
- MediaType mediaType; ///< media type see \ref MediaTypes\r
- int32 busIndex; ///< bus index\r
- int32 channel; ///< channel (-1 for all channels)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// IComponent Interface\r
-//------------------------------------------------------------------------\r
-/** Component Base Interface\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-- [mandatory]\r
-\r
-This is the basic interface for a VST component and must always be supported.\r
-It contains the common parts of any kind of processing class. The parts that\r
-are specific to a media type are defined in a separate interface. An implementation\r
-component must provide both the specific interface and IComponent.\r
-*/\r
-class IComponent: public IPluginBase\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Called before initializing the component to get information about the controller class. */\r
- virtual tresult PLUGIN_API getControllerClassId (TUID classId) = 0;\r
-\r
- /** Called before 'initialize' to set the component usage (optional). See \ref IoModes */\r
- virtual tresult PLUGIN_API setIoMode (IoMode mode) = 0;\r
-\r
- /** Called after the Plug-in is initialized. See \ref MediaTypes, BusDirections */\r
- virtual int32 PLUGIN_API getBusCount (MediaType type, BusDirection dir) = 0;\r
-\r
- /** Called after the Plug-in is initialized. See \ref MediaTypes, BusDirections */\r
- virtual tresult PLUGIN_API getBusInfo (MediaType type, BusDirection dir, int32 index, BusInfo& bus /*out*/) = 0;\r
-\r
- /** Retrieves routing information (to be implemented when more than one regular input or output bus exists).\r
- The inInfo always refers to an input bus while the returned outInfo must refer to an output bus! */\r
- virtual tresult PLUGIN_API getRoutingInfo (RoutingInfo& inInfo, RoutingInfo& outInfo /*out*/) = 0;\r
-\r
- /** Called upon (de-)activating a bus in the host application. The Plug-in should only processed an activated bus,\r
- the host could provide less see \ref AudioBusBuffers in the process call (see \ref IAudioProcessor::process) if last buses are not activated */\r
- virtual tresult PLUGIN_API activateBus (MediaType type, BusDirection dir, int32 index, TBool state) = 0;\r
-\r
- /** Activates / deactivates the component. */\r
- virtual tresult PLUGIN_API setActive (TBool state) = 0;\r
-\r
- /** Sets complete state of component. */\r
- virtual tresult PLUGIN_API setState (IBStream* state) = 0;\r
-\r
- /** Retrieves complete state of component. */\r
- virtual tresult PLUGIN_API getState (IBStream* state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponent, 0xE831FF31, 0xF2D54301, 0x928EBBEE, 0x25697802)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstcontextmenu.h\r
-// Created by : Steinberg, 10/2010\r
-// Description : VST Context Menu Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IPlugView;\r
-\r
-namespace Vst {\r
-class IContextMenu;\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandler3 for an edit controller.\r
-\ingroup vstIHost vst350\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.5.0]\r
-\r
-A Plug-in can ask the host to create a context menu for a given exported Parameter ID or a generic context menu.\n\r
-\r
-The host may pre-fill this context menu with specific items regarding the parameter ID like "Show automation for parameter",\r
-"MIDI learn" etc...\n\r
-\r
-The Plug-in can use the context menu in two ways :\r
-- add its own items to the menu via the IContextMenu interface and call IContextMenu::popup(..) to pop-up it. See the \ref IContextMenuExample.\r
-- extract the host menu items and add them to its own created context menu\r
-\r
-\b Note: You can and should use this even if you don't add your own items to the menu as this is considered to be a big user value.\r
-\r
-\sa IContextMenu\r
-\sa IContextMenuTarget\r
-\r
-\section IContextMenuExample Example\r
-Adding Plug-in specific items to the context menu\r
-\code\r
-class PluginContextMenuTarget : public IContextMenuTarget, public FObject\r
-{\r
-public:\r
- PluginContextMenuTarget () {}\r
-\r
- virtual tresult PLUGIN_API executeMenuItem (int32 tag)\r
- {\r
- // this will be called if the user has executed one of the menu items of the Plug-in.\r
- // It won't be called for items of the host.\r
- switch (tag)\r
- {\r
- case 1: break;\r
- case 2: break;\r
- }\r
- return kResultTrue;\r
- }\r
-\r
- OBJ_METHODS(PluginContextMenuTarget, FObject)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IContextMenuTarget)\r
- END_DEFINE_INTERFACES (FObject)\r
- REFCOUNT_METHODS(FObject)\r
-};\r
-\r
-// The following is the code to create the context menu\r
-void popupContextMenu (IComponentHandler* componentHandler, IPlugView* view, const ParamID* paramID, UCoord x, UCoord y)\r
-{\r
- if (componentHandler == 0 || view == 0)\r
- return;\r
- FUnknownPtr<IComponentHandler3> handler (componentHandler);\r
- if (handler == 0)\r
- return;\r
- IContextMenu* menu = handler->createContextMenu (view, paramID);\r
- if (menu)\r
- {\r
- // here you can add your entries (optional)\r
- PluginContextMenuTarget* target = new PluginContextMenuTarget ();\r
-\r
- IContextMenu::Item item = {0};\r
- UString128 ("My Item 1").copyTo (item.name, 128);\r
- item.tag = 1;\r
- menu->addItem (item, target);\r
-\r
- UString128 ("My Item 2").copyTo (item.name, 128);\r
- item.tag = 2;\r
- menu->addItem (item, target);\r
- target->release ();\r
- //--end of adding new entries\r
-\r
- // here the the context menu will be pop-up (and it waits a user interaction)\r
- menu->popup (x, y);\r
- menu->release ();\r
- }\r
-}\r
-\endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class IComponentHandler3 : public FUnknown\r
-{\r
-public:\r
- /** Creates a host context menu for a Plug-in:\r
- - If paramID is zero, the host may create a generic context menu.\r
- - The IPlugView object must be valid.\r
- - The return IContextMenu object needs to be released afterwards by the Plug-in.\r
- */\r
- virtual IContextMenu* PLUGIN_API createContextMenu (IPlugView* plugView, const ParamID* paramID) = 0;\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler3, 0x69F11617, 0xD26B400D, 0xA4B6B964, 0x7B6EBBAB)\r
-\r
-//------------------------------------------------------------------------\r
-/** Context Menu Item Target Interface.\r
-\ingroup vstIHost vstIPlug vst350\r
-- [host imp]\r
-- [plug imp]\r
-- [released: 3.5.0]\r
-\r
-A receiver of a menu item should implement this interface, which will be called after the user has selected\r
-this menu item.\r
-\r
-See IComponentHandler3 for more.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IContextMenuTarget : public FUnknown\r
-{\r
-public:\r
- /** Called when an menu item was executed. */\r
- virtual tresult PLUGIN_API executeMenuItem (int32 tag) = 0;\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IContextMenuTarget, 0x3CDF2E75, 0x85D34144, 0xBF86D36B, 0xD7C4894D)\r
-\r
-//------------------------------------------------------------------------\r
-/** Context Menu Interface.\r
-\ingroup vstIHost vst350\r
-- [host imp]\r
-- [create with IComponentHandler3::createContextMenu(..)]\r
-- [released: 3.5.0]\r
-\r
-A context menu is composed of Item (entry). A Item is defined by a name, a tag, a flag\r
-and a associated target (called when this item will be selected/executed).\r
-With IContextMenu the Plug-in can retrieve a Item, add a Item, remove a Item and pop-up the menu.\r
-\r
-See IComponentHandler3 for more.\r
-*/\r
-//------------------------------------------------------------------------\r
-class IContextMenu : public FUnknown\r
-{\r
-public:\r
- /** Item is a entry element of the context menu. */\r
- struct Item\r
- {\r
- String128 name; ///< Name of the item\r
- int32 tag; ///< Identifier tag of the item\r
- int32 flags; ///< Flags of the item\r
-\r
- enum Flags {\r
- kIsSeparator = 1 << 0, ///< Item is a separator\r
- kIsDisabled = 1 << 1, ///< Item is disabled\r
- kIsChecked = 1 << 2, ///< Item is checked\r
- kIsGroupStart = 1 << 3 | kIsDisabled, ///< Item is a group start (like sub folder)\r
- kIsGroupEnd = 1 << 4 | kIsSeparator, ///< Item is a group end\r
- };\r
- };\r
-\r
- /** Gets the number of menu items. */\r
- virtual int32 PLUGIN_API getItemCount () = 0;\r
-\r
- /** Gets a menu item and its target (target could be not assigned). */\r
- virtual tresult PLUGIN_API getItem (int32 index, Item& item /*out*/, IContextMenuTarget** target /*out*/) = 0;\r
-\r
- /** Adds a menu item and its target. */\r
- virtual tresult PLUGIN_API addItem (const Item& item, IContextMenuTarget* target) = 0;\r
-\r
- /** Removes a menu item. */\r
- virtual tresult PLUGIN_API removeItem (const Item& item, IContextMenuTarget* target) = 0;\r
-\r
- /** Pop-ups the menu. Coordinates are relative to the top-left position of the Plug-ins view. */\r
- virtual tresult PLUGIN_API popup (UCoord x, UCoord y) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IContextMenu, 0x2E93C863, 0x0C9C4588, 0x97DBECF5, 0xAD17817D)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivsteditcontroller.h\r
-// Created by : Steinberg, 09/2005\r
-// Description : VST Edit Controller Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Class Category Name for Controller Component */\r
-//------------------------------------------------------------------------\r
-#ifndef kVstComponentControllerClass\r
-#define kVstComponentControllerClass "Component Controller Class"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-class IPlugView;\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Controller Parameter Info. */\r
-//------------------------------------------------------------------------\r
-struct ParameterInfo\r
-{\r
-//------------------------------------------------------------------------\r
- ParamID id; ///< unique identifier of this parameter (named tag too)\r
- String128 title; ///< parameter title (e.g. "Volume")\r
- String128 shortTitle; ///< parameter shortTitle (e.g. "Vol")\r
- String128 units; ///< parameter unit (e.g. "dB")\r
- int32 stepCount; ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise\r
- ///< (corresponding to max - min, for example: 127 for a min = 0 and a max = 127) - see \ref vst3parameterIntro)\r
- ParamValue defaultNormalizedValue; ///< default normalized value [0,1] (in case of discrete value: defaultNormalizedValue = defDiscreteValue / stepCount)\r
- UnitID unitId; ///< id of unit this parameter belongs to (see \ref vst3UnitsIntro)\r
-\r
- int32 flags; ///< ParameterFlags (see below)\r
- enum ParameterFlags\r
- {\r
- kCanAutomate = 1 << 0, ///< parameter can be automated\r
- kIsReadOnly = 1 << 1, ///< parameter cannot be changed from outside (implies that kCanAutomate is false)\r
- kIsWrapAround = 1 << 2, ///< attempts to set the parameter value out of the limits will result in a wrap around [SDK 3.0.2]\r
- kIsList = 1 << 3, ///< parameter should be displayed as list in generic editor or automation editing [SDK 3.1.0]\r
-\r
- kIsProgramChange = 1 << 15, ///< parameter is a program change (unitId gives info about associated unit\r
- ///< - see \ref vst3UnitPrograms)\r
- kIsBypass = 1 << 16 ///< special bypass parameter (only one allowed): Plug-in can handle bypass\r
- ///< (highly recommended to export a bypass parameter for effect Plug-in)\r
- };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** View Types used for IEditController::createView */\r
-//------------------------------------------------------------------------\r
-namespace ViewType {\r
-const CString kEditor = "editor";\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Flags used for IComponentHandler::restartComponent */\r
-//------------------------------------------------------------------------\r
-enum RestartFlags\r
-{\r
- kReloadComponent = 1 << 0, ///< The Component should be reloaded [SDK 3.0.0]\r
- kIoChanged = 1 << 1, ///< Input and/or Output Bus configuration has changed [SDK 3.0.0]\r
- kParamValuesChanged = 1 << 2, ///< Multiple parameter values have changed\r
- ///< (as result of a program change for example) [SDK 3.0.0]\r
- kLatencyChanged = 1 << 3, ///< Latency has changed (IAudioProcessor.getLatencySamples) [SDK 3.0.0]\r
- kParamTitlesChanged = 1 << 4, ///< Parameter titles or default values or flags have changed [SDK 3.0.0]\r
- kMidiCCAssignmentChanged = 1 << 5, ///< MIDI Controller Assignments have changed [SDK 3.0.1]\r
- kNoteExpressionChanged = 1 << 6, ///< Note Expression has changed (info, count...) [SDK 3.5.0]\r
- kIoTitlesChanged = 1 << 7, ///< Input and/or Output bus titles have changed [SDK 3.5.0]\r
- kPrefetchableSupportChanged = 1 << 8, ///< Prefetch support has changed (\see IPrefetchableSupport) [SDK 3.6.1]\r
- kRoutingInfoChanged = 1 << 9 ///< RoutingInfo has changed (\see IComponent) [SDK 3.6.6]\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback interface for an edit controller.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-Allow transfer of parameter editing to component (processor) via host and support automation.\r
-Cause the host to react on configuration changes (restartComponent)\r
-\r
-\see IEditController */\r
-//------------------------------------------------------------------------\r
-class IComponentHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** To be called before calling a performEdit (e.g. on mouse-click-down event). */\r
- virtual tresult PLUGIN_API beginEdit (ParamID id) = 0;\r
-\r
- /** Called between beginEdit and endEdit to inform the handler that a given parameter has a new value. */\r
- virtual tresult PLUGIN_API performEdit (ParamID id, ParamValue valueNormalized) = 0;\r
-\r
- /** To be called after calling a performEdit (e.g. on mouse-click-up event). */\r
- virtual tresult PLUGIN_API endEdit (ParamID id) = 0;\r
-\r
- /** Instructs host to restart the component. This should be called in the UI-Thread context!\r
- \param flags is a combination of RestartFlags */\r
- virtual tresult PLUGIN_API restartComponent (int32 flags) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler, 0x93A0BEA3, 0x0BD045DB, 0x8E890B0C, 0xC1E46AC6)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandler2 for an edit controller\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.1.0]\r
-\r
-One part handles:\r
-- Setting dirty state of Plug-in\r
-- requesting the host to open the editor\r
-\r
-The other part handles parameter group editing from Plug-in UI. It wraps a set of \ref IComponentHandler::beginEdit /\r
-\ref IComponentHandler::performEdit / \ref IComponentHandler::endEdit functions (see \ref IComponentHandler)\r
-which should use the same timestamp in the host when writing automation.\r
-This allows for better synchronizing multiple parameter changes at once.\r
-\r
-\section IComponentHandler2Example Examples of different use cases\r
-\code\r
- //--------------------------------------\r
- // in case of multiple switch buttons (with associated ParamID 1 and 3)\r
- // on mouse down :\r
- hostHandler2->startGroupEdit ();\r
- hostHandler->beginEdit (1);\r
- hostHandler->beginEdit (3);\r
- hostHandler->performEdit (1, 1.0);\r
- hostHandler->performEdit (3, 0.0); // the opposite of paramID 1 for example\r
- ....\r
- // on mouse up :\r
- hostHandler->endEdit (1);\r
- hostHandler->endEdit (3);\r
- hostHandler2->finishGroupEdit ();\r
- ....\r
- ....\r
- //--------------------------------------\r
- // in case of multiple faders (with associated ParamID 1 and 3)\r
- // on mouse down :\r
- hostHandler2->startGroupEdit ();\r
- hostHandler->beginEdit (1);\r
- hostHandler->beginEdit (3);\r
- hostHandler2->finishGroupEdit ();\r
- ....\r
- // on mouse move :\r
- hostHandler2->startGroupEdit ();\r
- hostHandler->performEdit (1, x); // x the wanted value\r
- hostHandler->performEdit (3, x);\r
- hostHandler2->finishGroupEdit ();\r
- ....\r
- // on mouse up :\r
- hostHandler2->startGroupEdit ();\r
- hostHandler->endEdit (1);\r
- hostHandler->endEdit (3);\r
- hostHandler2->finishGroupEdit ();\r
-\endcode\r
-\see IComponentHandler\r
-\see IEditController*/\r
-//------------------------------------------------------------------------\r
-class IComponentHandler2: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** Tells host that the Plug-in is dirty (something besides parameters has changed since last save),\r
- if true the host should apply a save before quitting. */\r
- virtual tresult PLUGIN_API setDirty (TBool state) = 0;\r
-\r
- /** Tells host that it should open the Plug-in editor the next time it's possible.\r
- You should use this instead of showing an alert and blocking the program flow (especially on loading projects). */\r
- virtual tresult PLUGIN_API requestOpenEditor (FIDString name = ViewType::kEditor) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- /** Starts the group editing (call before a \ref IComponentHandler::beginEdit),\r
- the host will keep the current timestamp at this call and will use it for all \ref IComponentHandler::beginEdit\r
- / \ref IComponentHandler::performEdit / \ref IComponentHandler::endEdit calls until a \ref finishGroupEdit (). */\r
- virtual tresult PLUGIN_API startGroupEdit () = 0;\r
-\r
- /** Finishes the group editing started by a \ref startGroupEdit (call after a \ref IComponentHandler::endEdit). */\r
- virtual tresult PLUGIN_API finishGroupEdit () = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandler2, 0xF040B4B3, 0xA36045EC, 0xABCDC045, 0xB4D5A2CC)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Host callback interface IComponentHandlerBusActivation for an edit controller.\r
-\ingroup vstIHost vst368\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.6.8]\r
-\r
-Allows the Plug-in to request the host to activate or deactivate a specific bus,\r
-if the host accepts it will call later on IComponent::activateBus (see \ref IComponent::activateBus).\r
-Useful especially for Instrument with more than 1 outputs, where the user could request\r
-from the Plug-in UI a given output bus activation.\r
-\r
-\see \ref IComponentHandler */\r
-//------------------------------------------------------------------------\r
-class IComponentHandlerBusActivation : public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** request the host to activate or deactivate a specific bus. */\r
- virtual tresult PLUGIN_API requestBusActivation (MediaType type, BusDirection dir, int32 index,\r
- TBool state) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IComponentHandlerBusActivation, 0x067D02C1, 0x5B4E274D, 0xA92D90FD, 0x6EAF7240)\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller component interface.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [released: 3.0.0]\r
-\r
-The Controller part of an effect or instrument with parameter handling (export, definition, conversion...).\r
-\see IComponent::getControllerClassId, IMidiMapping */\r
-//------------------------------------------------------------------------\r
-class IEditController: public IPluginBase\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Receives the component state. */\r
- virtual tresult PLUGIN_API setComponentState (IBStream* state) = 0;\r
-\r
- /** Sets the controller state. */\r
- virtual tresult PLUGIN_API setState (IBStream* state) = 0;\r
-\r
- /** Gets the controller state. */\r
- virtual tresult PLUGIN_API getState (IBStream* state) = 0;\r
-\r
- // parameters -------------------------\r
- /** Returns the number of parameters exported. */\r
- virtual int32 PLUGIN_API getParameterCount () = 0;\r
- /** Gets for a given index the parameter information. */\r
- virtual tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info /*out*/) = 0;\r
-\r
- /** Gets for a given paramID and normalized value its associated string representation. */\r
- virtual tresult PLUGIN_API getParamStringByValue (ParamID id, ParamValue valueNormalized /*in*/, String128 string /*out*/) = 0;\r
- /** Gets for a given paramID and string its normalized value. */\r
- virtual tresult PLUGIN_API getParamValueByString (ParamID id, TChar* string /*in*/, ParamValue& valueNormalized /*out*/) = 0;\r
-\r
- /** Returns for a given paramID and a normalized value its plain representation\r
- (for example 90 for 90db - see \ref vst3AutomationIntro). */\r
- virtual ParamValue PLUGIN_API normalizedParamToPlain (ParamID id, ParamValue valueNormalized) = 0;\r
- /** Returns for a given paramID and a plain value its normalized value. (see \ref vst3AutomationIntro) */\r
- virtual ParamValue PLUGIN_API plainParamToNormalized (ParamID id, ParamValue plainValue) = 0;\r
-\r
- /** Returns the normalized value of the parameter associated to the paramID. */\r
- virtual ParamValue PLUGIN_API getParamNormalized (ParamID id) = 0;\r
- /** Sets the normalized value to the parameter associated to the paramID. The controller must never\r
- pass this value-change back to the host via the IComponentHandler. It should update the according\r
- GUI element(s) only!*/\r
- virtual tresult PLUGIN_API setParamNormalized (ParamID id, ParamValue value) = 0;\r
-\r
- // handler ----------------------------\r
- /** Gets from host a handler. */\r
- virtual tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) = 0;\r
-\r
- // view -------------------------------\r
- /** Creates the editor view of the Plug-in, currently only "editor" is supported, see \ref ViewType.\r
- The life time of the editor view will never exceed the life time of this controller instance. */\r
- virtual IPlugView* PLUGIN_API createView (FIDString name) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditController, 0xDCD7BBE3, 0x7742448D, 0xA874AACC, 0x979C759E)\r
-\r
-//------------------------------------------------------------------------\r
-/** Knob Mode */\r
-//------------------------------------------------------------------------\r
-enum KnobModes\r
-{\r
- kCircularMode = 0, ///< Circular with jump to clicked position\r
- kRelativCircularMode, ///< Circular without jump to clicked position\r
- kLinearMode ///< Linear: depending on vertical movement\r
-};\r
-\r
-typedef int32 KnobMode; ///< Knob Mode\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller component interface extension.\r
-\ingroup vstIPlug vst310\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.1.0]\r
-\r
-Extension to inform the Plug-in about the host Knob Mode,\r
-and to open the Plug-in about box or help documentation.\r
-\r
-\see IEditController*/\r
-//------------------------------------------------------------------------\r
-class IEditController2: public FUnknown\r
-{\r
-public:\r
- /** Host could set the Knob Mode for the Plug-in. Return kResultFalse means not supported mode. \see KnobModes. */\r
- virtual tresult PLUGIN_API setKnobMode (KnobMode mode) = 0;\r
-\r
- /** Host could ask to open the Plug-in help (could be: opening a PDF document or link to a web page).\r
- The host could call it with onlyCheck set to true for testing support of open Help.\r
- Return kResultFalse means not supported function. */\r
- virtual tresult PLUGIN_API openHelp (TBool onlyCheck) = 0;\r
-\r
- /** Host could ask to open the Plug-in about box.\r
- The host could call it with onlyCheck set to true for testing support of open AboutBox.\r
- Return kResultFalse means not supported function. */\r
- virtual tresult PLUGIN_API openAboutBox (TBool onlyCheck) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditController2, 0x7F4EFE59, 0xF3204967, 0xAC27A3AE, 0xAFB63038)\r
-\r
-//------------------------------------------------------------------------\r
-/** MIDI Mapping Interface.\r
-\ingroup vstIPlug vst301\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.0.1]\r
-\r
-MIDI controllers are not transmitted directly to a VST component. MIDI as hardware protocol has\r
-restrictions that can be avoided in software. Controller data in particular come along with unclear\r
-and often ignored semantics. On top of this they can interfere with regular parameter automation and\r
-the host is unaware of what happens in the Plug-in when passing MIDI controllers directly.\r
-\r
-So any functionality that is to be controlled by MIDI controllers must be exported as regular parameter.\r
-The host will transform incoming MIDI controller data using this interface and transmit them as normal\r
-parameter change. This allows the host to automate them in the same way as other parameters.\r
-CtrlNumber could be typical MIDI controller value extended to some others values like pitch bend or\r
-after touch (see \ref ControllerNumbers).\r
-If the mapping has changed, the Plug-in should call IComponentHandler::restartComponent (kMidiCCAssignmentChanged)\r
-to inform the host about this change. */\r
-//------------------------------------------------------------------------\r
-class IMidiMapping: public FUnknown\r
-{\r
-public:\r
-\r
- /** Gets an (preferred) associated ParamID for a given Input Event Bus index, channel and MIDI Controller.\r
- * @param[in] busIndex - index of Input Event Bus\r
- * @param[in] channel - channel of the bus\r
- * @param[in] midiControllerNumber - see \ref ControllerNumbers for expected values (could be bigger than 127)\r
- * @param[in] id - return the associated ParamID to the given midiControllerNumber\r
- */\r
- virtual tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex, int16 channel,\r
- CtrlNumber midiControllerNumber, ParamID& id/*out*/) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IMidiMapping, 0xDF0FF9F7, 0x49B74669, 0xB63AB732, 0x7ADBF5E5)\r
-\r
-//------------------------------------------------------------------------\r
-/** Parameter Editing from Host.\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-If this interface is implemented by the edit controller and when performing edits from outside\r
-the Plug-in (host / remote) of a not automatable and not read only flagged parameter (kind of helper parameter),\r
-the host will start with a beginEditFromHost before calling setParamNormalized and end with an endEditFromHost.\r
-Here the sequencing, the host will call:\r
-- beginEditFromHost ()\r
-- setParamNormalized ()\r
-- setParamNormalized ()\r
-- ...\r
-- endEditFromHost ()\r
-\see IEditController */\r
-//------------------------------------------------------------------------\r
-class IEditControllerHostEditing : public FUnknown\r
-{\r
-public:\r
- /** Called before a setParamNormalized sequence, a endEditFromHost will be call at the end of the editing action. */\r
- virtual tresult PLUGIN_API beginEditFromHost (ParamID paramID) = 0;\r
-\r
- /** Called after a beginEditFromHost and a sequence of setParamNormalized. */\r
- virtual tresult PLUGIN_API endEditFromHost (ParamID paramID) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEditControllerHostEditing, 0xC1271208, 0x70594098, 0xB9DD34B3, 0x6BB0195E)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstevents.h\r
-// Created by : Steinberg, 11/2005\r
-// Description : VST Events (MIDI) Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstprocesscontext.h"\r
-#include "pluginterfaces/vst/ivstnoteexpression.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Note-on event specific data. Used in \ref Event (union)*/\r
-struct NoteOnEvent\r
-{\r
- int16 channel; ///< channel index in event bus\r
- int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
- float tuning; ///< 1.f = +1 cent, -1.f = -1 cent\r
- float velocity; ///< range [0.0, 1.0]\r
- int32 length; ///< in sample frames (optional, Note Off has to follow in any case!)\r
- int32 noteId; ///< note identifier (if not available then -1)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Note-off event specific data. Used in \ref Event (union)*/\r
-struct NoteOffEvent\r
-{\r
- int16 channel; ///< channel index in event bus\r
- int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
- float velocity; ///< range [0.0, 1.0]\r
- int32 noteId; ///< associated noteOn identifier (if not available then -1)\r
- float tuning; ///< 1.f = +1 cent, -1.f = -1 cent\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Data event specific data. Used in \ref Event (union)*/\r
-struct DataEvent\r
-{\r
- uint32 size; ///< size in bytes of the data block bytes\r
- uint32 type; ///< type of this data block (see \ref DataTypes)\r
- const uint8* bytes; ///< pointer to the data block\r
-\r
- /** Value for DataEvent::type */\r
- enum DataTypes\r
- {\r
- kMidiSysEx = 0 ///< for MIDI system exclusive message\r
- };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** PolyPressure event specific data. Used in \ref Event (union)*/\r
-struct PolyPressureEvent\r
-{\r
- int16 channel; ///< channel index in event bus\r
- int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
- float pressure; ///< range [0.0, 1.0]\r
- int32 noteId; ///< event should be applied to the noteId (if not -1)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Chord event specific data. Used in \ref Event (union)*/\r
-struct ChordEvent\r
-{\r
- int16 root; ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
- int16 bassNote; ///< range [0, 127] = [C-2, G8] with A3=440Hz\r
- int16 mask; ///< root is bit 0\r
- uint16 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating\r
- ///< null character (without including the terminating null character itself)\r
- const TChar* text; ///< UTF-16, null terminated Hosts Chord Name\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Scale event specific data. Used in \ref Event (union)*/\r
-struct ScaleEvent\r
-{\r
- int16 root; ///< range [0, 127] = root Note/Transpose Factor\r
- int16 mask; ///< Bit 0 = C, Bit 1 = C#, ... (0x5ab5 = Major Scale)\r
- uint16 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating\r
- ///< null character (without including the terminating null character itself)\r
- const TChar* text; ///< UTF-16, null terminated, Hosts Scale Name\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Event */\r
-//------------------------------------------------------------------------\r
-struct Event\r
-{\r
- int32 busIndex; ///< event bus index\r
- int32 sampleOffset; ///< sample frames related to the current block start sample position\r
- TQuarterNotes ppqPosition; ///< position in project\r
- uint16 flags; ///< combination of \ref EventFlags\r
-\r
- /** Event Flags - used for Event::flags */\r
- enum EventFlags\r
- {\r
- kIsLive = 1 << 0, ///< indicates that the event is played live (directly from keyboard)\r
-\r
- kUserReserved1 = 1 << 14, ///< reserved for user (for internal use)\r
- kUserReserved2 = 1 << 15 ///< reserved for user (for internal use)\r
- };\r
-\r
- /** Event Types - used for Event::type */\r
- enum EventTypes\r
- {\r
- kNoteOnEvent = 0, ///< is \ref NoteOnEvent\r
- kNoteOffEvent, ///< is \ref NoteOffEvent\r
- kDataEvent, ///< is \ref DataEvent\r
- kPolyPressureEvent, ///< is \ref PolyPressureEvent\r
- kNoteExpressionValueEvent, ///< is \ref NoteExpressionValueEvent\r
- kNoteExpressionTextEvent, ///< is \ref NoteExpressionTextEvent\r
- kChordEvent, ///< is \ref ChordEvent\r
- kScaleEvent ///< is \ref ScaleEvent\r
- };\r
-\r
- uint16 type; ///< a value from \ref EventTypes\r
- union\r
- {\r
- NoteOnEvent noteOn; ///< type == kNoteOnEvent\r
- NoteOffEvent noteOff; ///< type == kNoteOffEvent\r
- DataEvent data; ///< type == kDataEvent\r
- PolyPressureEvent polyPressure; ///< type == kPolyPressureEvent\r
- NoteExpressionValueEvent noteExpressionValue; ///< type == kNoteExpressionValueEvent\r
- NoteExpressionTextEvent noteExpressionText; ///< type == kNoteExpressionTextEvent\r
- ChordEvent chord; ///< type == kChordEvent\r
- ScaleEvent scale; ///< type == kScaleEvent\r
- };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** List of events to process.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-\see ProcessData, Event */\r
-//------------------------------------------------------------------------\r
-class IEventList: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns the count of events. */\r
- virtual int32 PLUGIN_API getEventCount () = 0;\r
-\r
- /** Gets parameter by index. */\r
- virtual tresult PLUGIN_API getEvent (int32 index, Event& e /*out*/) = 0;\r
-\r
- /** Adds a new event. */\r
- virtual tresult PLUGIN_API addEvent (Event& e /*in*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IEventList, 0x3A2C4214, 0x346349FE, 0xB2C4F397, 0xB9695A44)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivsthostapplication.h\r
-// Created by : Steinberg, 04/2006\r
-// Description : VST Host Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Basic Host Callback Interface.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [passed as 'context' in to IPluginBase::initialize () ]\r
-- [released: 3.0.0]\r
-\r
-Basic VST host application interface. */\r
-//------------------------------------------------------------------------\r
-class IHostApplication: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Gets host application name. */\r
- virtual tresult PLUGIN_API getName (String128 name) = 0;\r
-\r
- /** Creates host object (e.g. Vst::IMessage). */\r
- virtual tresult PLUGIN_API createInstance (TUID cid, TUID _iid, void** obj) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IHostApplication, 0x58E595CC, 0xDB2D4969, 0x8B6AAF8C, 0x36A664E5)\r
-\r
-//------------------------------------------------------------------------\r
-inline IMessage* allocateMessage (IHostApplication* host)\r
-{\r
- TUID iid;\r
- IMessage::iid.toTUID (iid);\r
- IMessage* m = 0;\r
- if (host->createInstance (iid, iid, (void**)&m) == kResultOk)\r
- return m;\r
- return 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to VST 2 Wrapper Interface.\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.1.0]\r
-\r
-Informs the Plug-in that a VST 3 to VST 2 wrapper is used between the Plug-in and the real host.\r
-Implemented by the VST 2 Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToVst2Wrapper: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IVst3ToVst2Wrapper, 0x29633AEC, 0x1D1C47E2, 0xBB85B97B, 0xD36EAC61)\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to AU Wrapper Interface.\r
-\ingroup vstIHost vst310\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.1.0]\r
-\r
-Informs the Plug-in that a VST 3 to AU wrapper is used between the Plug-in and the real host.\r
-Implemented by the AU Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToAUWrapper: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IVst3ToAUWrapper, 0xA3B8C6C5, 0xC0954688, 0xB0916F0B, 0xB697AA44)\r
-\r
-//------------------------------------------------------------------------\r
-/** VST 3 to AAX Wrapper Interface.\r
-\ingroup vstIHost vst368\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.6.8]\r
-\r
-Informs the Plug-in that a VST 3 to AAX wrapper is used between the Plug-in and the real host.\r
-Implemented by the AAX Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IVst3ToAAXWrapper : public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-DECLARE_CLASS_IID (IVst3ToAAXWrapper, 0x6D319DC6, 0x60C56242, 0xB32C951B, 0x93BEF4C6)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstinterappaudio.h\r
-// Created by : Steinberg, 08/2013\r
-// Description : VST InterAppAudio Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-struct ViewRect;\r
-namespace Vst {\r
-struct Event;\r
-class IInterAppAudioPresetManager;\r
-\r
-//------------------------------------------------------------------------\r
-/** Inter-App Audio host Interface.\r
-\ingroup vstIHost vst360\r
-- [host imp]\r
-- [passed as 'context' to IPluginBase::initialize () ]\r
-- [released: 3.6.0]\r
-\r
-Implemented by the InterAppAudio Wrapper. */\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioHost: public FUnknown\r
-{\r
-public:\r
- /** get the size of the screen\r
- * @param size size of the screen\r
- * @param scale scale of the screen\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API getScreenSize (ViewRect* size, float* scale) = 0;\r
-\r
- /** get status of connection\r
- * @return kResultTrue if an Inter-App Audio connection is established\r
- */\r
- virtual tresult PLUGIN_API connectedToHost () = 0;\r
-\r
- /** switch to the host.\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API switchToHost () = 0;\r
-\r
- /** send a remote control event to the host\r
- * @param event event type, see AudioUnitRemoteControlEvent in the iOS SDK documentation for possible types\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API sendRemoteControlEvent (uint32 event) = 0;\r
-\r
- /** ask for the host icon.\r
- * @param icon pointer to a CGImageRef\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API getHostIcon (void** icon) = 0;\r
-\r
- /** schedule an event from the user interface thread\r
- * @param event the event to schedule\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API scheduleEventFromUI (Event& event) = 0;\r
-\r
- /** get the preset manager\r
- * @param cid class ID to use by the preset manager\r
- * @return the preset manager. Needs to be released by called.\r
- */\r
- virtual IInterAppAudioPresetManager* PLUGIN_API createPresetManager (const TUID& cid) = 0;\r
-\r
- /** show the settings view\r
- * currently includes MIDI settings and Tempo setting\r
- * @return kResultTrue on success\r
- */\r
- virtual tresult PLUGIN_API showSettingsView () = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioHost, 0x0CE5743D, 0x68DF415E, 0xAE285BD4, 0xE2CDC8FD)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for Inter-App Audio connection state change notifications\r
-\ingroup vstIPlug vst360\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.0]\r
-*/\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioConnectionNotification : public FUnknown\r
-{\r
-public:\r
- /** called when the Inter-App Audio connection state changes\r
- * @param newState true if an Inter-App Audio connection is established, otherwise false\r
- */\r
- virtual void PLUGIN_API onInterAppAudioConnectionStateChange (TBool newState) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioConnectionNotification, 0x6020C72D, 0x5FC24AA1, 0xB0950DB5, 0xD7D6D5CF)\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for Inter-App Audio Preset Management\r
-\ingroup vstIPlug vst360\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.6.0]\r
-*/\r
-//------------------------------------------------------------------------\r
-class IInterAppAudioPresetManager : public FUnknown\r
-{\r
-public:\r
- /** TODO */\r
- virtual tresult PLUGIN_API runLoadPresetBrowser () = 0;\r
- /** TODO */\r
- virtual tresult PLUGIN_API runSavePresetBrowser () = 0;\r
- /** TODO */\r
- virtual tresult PLUGIN_API loadNextPreset () = 0;\r
- /** TODO */\r
- virtual tresult PLUGIN_API loadPreviousPreset () = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IInterAppAudioPresetManager, 0xADE6FCC4, 0x46C94E1D, 0xB3B49A80, 0xC93FEFDD)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstmessage.h\r
-// Created by : Steinberg, 04/2005\r
-// Description : VST Message Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Private Plug-in message.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [create via IHostApplication::createInstance]\r
-- [released: 3.0.0]\r
-\r
-Messages are sent from a VST-controller component to a VST-editor component and vice versa.\r
-\see IAttributeList, IConnectionPoint, \ref vst3Communication */\r
-//------------------------------------------------------------------------\r
-class IMessage: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns the message ID (for example "TextMessage"). */\r
- virtual FIDString PLUGIN_API getMessageID () = 0;\r
-\r
- /** Sets a message ID (for example "TextMessage"). */\r
- virtual void PLUGIN_API setMessageID (FIDString id /*in*/) = 0;\r
-\r
- /** Returns the attribute list associated to the message. */\r
- virtual IAttributeList* PLUGIN_API getAttributes () = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IMessage, 0x936F033B, 0xC6C047DB, 0xBB0882F8, 0x13C1E613)\r
-\r
-//------------------------------------------------------------------------\r
-/** Connect a component with another one.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-This interface is used for the communication of separate components.\r
-Note that some hosts will place a proxy object between the components so that they are not directly connected.\r
-\r
-\see \ref vst3Communication*/\r
-//------------------------------------------------------------------------\r
-class IConnectionPoint: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Connects this instance with another connection point. */\r
- virtual tresult PLUGIN_API connect (IConnectionPoint* other) = 0;\r
-\r
- /** Disconnects a given connection point from this. */\r
- virtual tresult PLUGIN_API disconnect (IConnectionPoint* other) = 0;\r
-\r
- /** Called when a message has been sent from the connection point to this. */\r
- virtual tresult PLUGIN_API notify (IMessage* message) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IConnectionPoint, 0x70A4156F, 0x6E6E4026, 0x989148BF, 0xAA60D8D1)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstmidicontrollers.h\r
-// Created by : Steinberg, 02/2006\r
-// Description : VST MIDI Controller Enumeration\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Controller Numbers (MIDI) */\r
-//------------------------------------------------------------------------\r
-enum ControllerNumbers\r
-{\r
- kCtrlBankSelectMSB = 0, ///< Bank Select MSB\r
- kCtrlModWheel = 1, ///< Modulation Wheel\r
- kCtrlBreath = 2, ///< Breath controller\r
-\r
- kCtrlFoot = 4, ///< Foot Controller\r
- kCtrlPortaTime = 5, ///< Portamento Time\r
- kCtrlDataEntryMSB = 6, ///< Data Entry MSB\r
- kCtrlVolume = 7, ///< Channel Volume (formerly Main Volume)\r
- kCtrlBalance = 8, ///< Balance\r
-\r
- kCtrlPan = 10, ///< Pan\r
- kCtrlExpression = 11, ///< Expression\r
- kCtrlEffect1 = 12, ///< Effect Control 1\r
- kCtrlEffect2 = 13, ///< Effect Control 2\r
-\r
- //---General Purpose Controllers #1 to #4---\r
- kCtrlGPC1 = 16, ///< General Purpose Controller #1\r
- kCtrlGPC2 = 17, ///< General Purpose Controller #2\r
- kCtrlGPC3 = 18, ///< General Purpose Controller #3\r
- kCtrlGPC4 = 19, ///< General Purpose Controller #4\r
-\r
- kCtrlBankSelectLSB = 32, ///< Bank Select LSB\r
-\r
- kCtrlDataEntryLSB = 38, ///< Data Entry LSB\r
-\r
- kCtrlSustainOnOff = 64, ///< Damper Pedal On/Off (Sustain)\r
- kCtrlPortaOnOff = 65, ///< Portamento On/Off\r
- kCtrlSustenutoOnOff = 66, ///< Sustenuto On/Off\r
- kCtrlSoftPedalOnOff = 67, ///< Soft Pedal On/Off\r
- kCtrlLegatoFootSwOnOff= 68, ///< Legato Footswitch On/Off\r
- kCtrlHold2OnOff = 69, ///< Hold 2 On/Off\r
-\r
- //---Sound Controllers #1 to #10---\r
- kCtrlSoundVariation = 70, ///< Sound Variation\r
- kCtrlFilterCutoff = 71, ///< Filter Cutoff (Timbre/Harmonic Intensity)\r
- kCtrlReleaseTime = 72, ///< Release Time\r
- kCtrlAttackTime = 73, ///< Attack Time\r
- kCtrlFilterResonance= 74, ///< Filter Resonance (Brightness)\r
- kCtrlDecayTime = 75, ///< Decay Time\r
- kCtrlVibratoRate = 76, ///< Vibrato Rate\r
- kCtrlVibratoDepth = 77, ///< Vibrato Depth\r
- kCtrlVibratoDelay = 78, ///< Vibrato Delay\r
- kCtrlSoundCtrler10 = 79, ///< undefined\r
-\r
- //---General Purpose Controllers #5 to #8---\r
- kCtrlGPC5 = 80, ///< General Purpose Controller #5\r
- kCtrlGPC6 = 81, ///< General Purpose Controller #6\r
- kCtrlGPC7 = 82, ///< General Purpose Controller #7\r
- kCtrlGPC8 = 83, ///< General Purpose Controller #8\r
-\r
- kCtrlPortaControl = 84, ///< Portamento Control\r
-\r
- //---Effect Controllers---\r
- kCtrlEff1Depth = 91, ///< Effect 1 Depth (Reverb Send Level)\r
- kCtrlEff2Depth = 92, ///< Effect 2 Depth\r
- kCtrlEff3Depth = 93, ///< Effect 3 Depth (Chorus Send Level)\r
- kCtrlEff4Depth = 94, ///< Effect 4 Depth (Delay/Variation Level)\r
- kCtrlEff5Depth = 95, ///< Effect 5 Depth\r
-\r
- kCtrlDataIncrement = 96, ///< Data Increment (+1)\r
- kCtrlDataDecrement = 97, ///< Data Decrement (-1)\r
- kCtrlNRPNSelectLSB = 98, ///< NRPN Select LSB\r
- kCtrlNRPNSelectMSB = 99, ///< NRPN Select MSB\r
- kCtrlRPNSelectLSB = 100, ///< RPN Select LSB\r
- kCtrlRPNSelectMSB = 101, ///< RPN Select MSB\r
-\r
- //---Other Channel Mode Messages---\r
- kCtrlAllSoundsOff = 120, ///< All Sounds Off\r
- kCtrlResetAllCtrlers = 121, ///< Reset All Controllers\r
- kCtrlLocalCtrlOnOff = 122, ///< Local Control On/Off\r
- kCtrlAllNotesOff = 123, ///< All Notes Off\r
- kCtrlOmniModeOff = 124, ///< Omni Mode Off + All Notes Off\r
- kCtrlOmniModeOn = 125, ///< Omni Mode On + All Notes Off\r
- kCtrlPolyModeOnOff = 126, ///< Poly Mode On/Off + All Sounds Off\r
- kCtrlPolyModeOn = 127, ///< Poly Mode On\r
-\r
- //---Extra--------------------------\r
- kAfterTouch = 128, ///< After Touch\r
- kPitchBend, ///< Pitch Bend\r
-\r
- kCountCtrlNumber ///< Count of Controller Number\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstnoteexpression.h\r
-// Created by : Steinberg, 10/2010\r
-// Description : VST Note Expression Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-typedef uint32 NoteExpressionTypeID;\r
-typedef double NoteExpressionValue;\r
-\r
-//------------------------------------------------------------------------\r
-/** NoteExpressionTypeIDs describes the type of the note expression.\r
-VST predefines some types like volume, pan, tuning by defining their ranges and curves.\r
-Used by NoteExpressionEvent::typeId and NoteExpressionTypeID::typeId\r
-\see NoteExpressionTypeInfo\r
-*/\r
-enum NoteExpressionTypeIDs\r
-{\r
- kVolumeTypeID = 0, ///< Volume, plain range [0 = -oo , 0.25 = 0dB, 0.5 = +6dB, 1 = +12dB]: plain = 20 * log (4 * norm)\r
- kPanTypeID, ///< Panning (L-R), plain range [0 = left, 0.5 = center, 1 = right]\r
- kTuningTypeID, ///< Tuning, plain range [0 = -120.0 (ten octaves down), 0.5 none, 1 = +120.0 (ten octaves up)]\r
- ///< plain = 240 * (norm - 0.5) and norm = plain / 240 + 0.5\r
- ///< oneOctave is 12.0 / 240.0; oneHalfTune = 1.0 / 240.0;\r
- kVibratoTypeID, ///< Vibrato\r
- kExpressionTypeID, ///< Expression\r
- kBrightnessTypeID, ///< Brightness\r
- kTextTypeID, ///< TODO:\r
- kPhonemeTypeID, ///< TODO:\r
-\r
- kCustomStart = 100000 ///< custom note change type ids must start from here\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a Note Expression Type\r
-This structure is part of the NoteExpressionTypeInfo structure, it describes for given NoteExpressionTypeID its default value\r
-(for example 0.5 for a kTuningTypeID (kIsBipolar: centered)), its minimum and maximum (for predefined NoteExpressionTypeID the full range is predefined too)\r
-and a stepCount when the given NoteExpressionTypeID is limited to discrete values (like on/off state).\r
-\see NoteExpressionTypeInfo\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionValueDescription\r
-{\r
- NoteExpressionValue defaultValue; ///< default normalized value [0,1]\r
- NoteExpressionValue minimum; ///< minimum normalized value [0,1]\r
- NoteExpressionValue maximum; ///< maximum normalized value [0,1]\r
- int32 stepCount; ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise - see \ref vst3parameterIntro)\r
-};\r
-\r
-#if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64\r
-#include "pluginterfaces/vst/vstpshpack4.h"\r
-#endif\r
-//------------------------------------------------------------------------\r
-/** Note Expression Value event. Used in \ref Event (union)\r
-A note expression event affects one single playing note (referring its noteId).\r
-This kind of event is send from host to the Plug-in like other events (NoteOnEvent, NoteOffEvent,...) in \ref ProcessData during the process call.\r
-Note expression events for a specific noteId can only occur after a NoteOnEvent. The host must take care that the event list (\ref IEventList) is properly sorted.\r
-Expression events are always absolute normalized values [0.0, 1.0].\r
-The predefined types have a predefined mapping of the normalized values (see \ref NoteExpressionTypeIDs)\r
-\sa INoteExpressionController\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionValueEvent\r
-{\r
- NoteExpressionTypeID typeId; ///< see \ref NoteExpressionTypeID\r
- int32 noteId; ///< associated note identifier to apply the change\r
-\r
- NoteExpressionValue value; ///< normalized value [0.0, 1.0].\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Note Expression Text event. Used in Event (union)\r
-A Expression event affects one single playing note. \sa INoteExpressionController\r
-\r
-\see NoteExpressionTypeInfo*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionTextEvent\r
-{\r
- NoteExpressionTypeID typeId; ///< see \ref NoteExpressionTypeID (kTextTypeID or kPhoneticTypeID)\r
- int32 noteId; ///< associated note identifier to apply the change\r
-\r
- uint32 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating\r
- ///< null character (without including the terminating null character itself)\r
-\r
- const TChar* text; ///< UTF-16, null terminated\r
-};\r
-\r
-#if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64\r
-#include "pluginterfaces/base/falignpop.h"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** NoteExpressionTypeInfo is the structure describing a note expression supported by the Plug-in.\r
-This structure is used by the method \ref INoteExpressionController::getNoteExpressionInfo.\r
-\see INoteExpressionController\r
-*/\r
-//------------------------------------------------------------------------\r
-struct NoteExpressionTypeInfo\r
-{\r
- NoteExpressionTypeID typeId; ///< unique identifier of this note Expression type\r
- String128 title; ///< note Expression type title (e.g. "Volume")\r
- String128 shortTitle; ///< note Expression type short title (e.g. "Vol")\r
- String128 units; ///< note Expression type unit (e.g. "dB")\r
- int32 unitId; ///< id of unit this NoteExpression belongs to (see \ref vst3UnitsIntro), in order to sort the note expression, it is possible to use unitId like for parameters. -1 means no unit used.\r
- NoteExpressionValueDescription valueDesc; ///< value description see \ref NoteExpressionValueDescription\r
- ParamID associatedParameterId; ///< optional associated parameter ID (for mapping from note expression to global (using the parameter automation for example) and back). Only used when kAssociatedParameterIDValid is set in flags.\r
-\r
- int32 flags; ///< NoteExpressionTypeFlags (see below)\r
- enum NoteExpressionTypeFlags\r
- {\r
- kIsBipolar = 1 << 0, ///< event is bipolar (centered), otherwise unipolar\r
- kIsOneShot = 1 << 1, ///< event occurs only one time for its associated note (at begin of the noteOn)\r
- kIsAbsolute = 1 << 2, ///< This note expression will apply an absolute change to the sound (not relative (offset))\r
- kAssociatedParameterIDValid = 1 << 3,///< indicates that the associatedParameterID is valid and could be used\r
- };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for note expression event support\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-With this Plug-in interface, the host can retrieve all necessary note expression information supported by the Plug-in.\r
-Note expression information (\ref NoteExpressionTypeInfo) are specific for given channel and event bus.\r
-\r
-Note that there is only one NoteExpressionTypeID per given channel of an event bus.\r
-\r
-The method getNoteExpressionStringByValue allows conversion from a normalized value to a string representation\r
-and the getNoteExpressionValueByString method from a string to a normalized value.\r
-\r
-When the note expression state changes (per example when switching presets) the Plug-in needs\r
-to inform the host about it via \ref IComponentHandler::restartComponent (kNoteExpressionChanged).\r
-*/\r
-//------------------------------------------------------------------------\r
-class INoteExpressionController: public FUnknown\r
-{\r
-public:\r
- /** Returns number of supported note change types for event bus index and channel. */\r
- virtual int32 PLUGIN_API getNoteExpressionCount (int32 busIndex, int16 channel) = 0;\r
-\r
- /** Returns note change type info. */\r
- virtual tresult PLUGIN_API getNoteExpressionInfo (int32 busIndex, int16 channel, int32 noteExpressionIndex, NoteExpressionTypeInfo& info /*out*/) = 0;\r
-\r
- /** Gets a user readable representation of the normalized note change value. */\r
- virtual tresult PLUGIN_API getNoteExpressionStringByValue (int32 busIndex, int16 channel, NoteExpressionTypeID id, NoteExpressionValue valueNormalized /*in*/, String128 string /*out*/) = 0;\r
-\r
- /** Converts the user readable representation to the normalized note change value. */\r
- virtual tresult PLUGIN_API getNoteExpressionValueByString (int32 busIndex, int16 channel, NoteExpressionTypeID id, const TChar* string /*in*/, NoteExpressionValue& valueNormalized /*out*/) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (INoteExpressionController, 0xB7F8F859, 0x41234872, 0x91169581, 0x4F3721A3)\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** KeyswitchTypeIDs describes the type of a key switch\r
-\see KeyswitchInfo\r
-*/\r
-enum KeyswitchTypeIDs\r
-{\r
- kNoteOnKeyswitchTypeID = 0, ///< press before noteOn is played\r
- kOnTheFlyKeyswitchTypeID, ///< press while noteOn is played\r
- kOnReleaseKeyswitchTypeID, ///< press before entering release\r
- kKeyRangeTypeID ///< key should be maintained pressed for playing\r
-};\r
-\r
-typedef uint32 KeyswitchTypeID;\r
-\r
-//------------------------------------------------------------------------\r
-/** KeyswitchInfo is the structure describing a key switch\r
-This structure is used by the method \ref IKeyswitchController::getKeyswitchInfo.\r
-\see IKeyswitchController\r
-*/\r
-struct KeyswitchInfo\r
-{\r
- KeyswitchTypeID typeId; ///< see KeyswitchTypeID\r
- String128 title; ///< name of key switch (e.g. "Accentuation")\r
- String128 shortTitle; ///< short title (e.g. "Acc")\r
-\r
- int32 keyswitchMin; ///< associated main key switch min (value between [0, 127])\r
- int32 keyswitchMax; ///< associated main key switch max (value between [0, 127])\r
- int32 keyRemapped; /** optional remapped key switch (default -1), the Plug-in could provide one remapped\r
- key for a key switch (allowing better location on the keyboard of the key switches) */\r
-\r
- int32 unitId; ///< id of unit this key switch belongs to (see \ref vst3UnitsIntro), -1 means no unit used.\r
-\r
- int32 flags; ///< not yet used (set to 0)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for key switches support\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-When a (instrument) Plug-in supports such interface, the host could get from the Plug-in the current set\r
-of used key switches (megatrig/articulation) for a given channel of a event bus and then automatically use them (like in Cubase 6) to\r
-create VST Expression Map (allowing to associated symbol to a given articulation / key switch).\r
-*/\r
-//------------------------------------------------------------------------\r
-class IKeyswitchController: public FUnknown\r
-{\r
-public:\r
- /** Returns number of supported key switches for event bus index and channel. */\r
- virtual int32 PLUGIN_API getKeyswitchCount (int32 busIndex, int16 channel) = 0;\r
-\r
- /** Returns key switch info. */\r
- virtual tresult PLUGIN_API getKeyswitchInfo (int32 busIndex, int16 channel, int32 keySwitchIndex, KeyswitchInfo& info /*out*/) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IKeyswitchController, 0x1F2F76D3, 0xBFFB4B96, 0xB99527A5, 0x5EBCCEF4)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstparameterchanges.h\r
-// Created by : Steinberg, 09/2005\r
-// Description : VST Parameter Change Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//----------------------------------------------------------------------\r
-/** Queue of changes for a specific parameter.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-The change queue can be interpreted as segment of an automation curve. For each\r
-processing block a segment with the size of the block is transmitted to the processor.\r
-The curve is expressed as sampling points of a linear approximation of\r
-the original automation curve. If the original already is a linear curve it can\r
-be transmitted precisely. A non-linear curve has to be converted to a linear\r
-approximation by the host. Every point of the value queue defines a linear\r
-section of the curve as a straight line from the previous point of a block to\r
-the new one. So the Plug-in can calculate the value of the curve for any sample\r
-position in the block.\r
-\r
-<b>Implicit Points:</b> \n\r
-In each processing block the section of the curve for each parameter is transmitted.\r
-In order to reduce the amount of points, the point at block position 0 can be omitted.\r
-- If the curve has a slope of 0 over a period of multiple blocks, only one point is\r
-transmitted for the block where the constant curve section starts. The queue for the following\r
-blocks will be empty as long as the curve slope is 0.\r
-- If the curve has a constant slope other than 0 over the period of several blocks, only\r
-the value for the last sample of the block is transmitted. In this case the last valid point\r
-is at block position -1. The processor can calculate the value for each sample in the block\r
-by using a linear interpolation:\r
-\code\r
-double x1 = -1; // position of last point related to current buffer\r
-double y1 = currentParameterValue; // last transmitted value\r
-\r
-int32 pointTime = 0;\r
-ParamValue pointValue = 0;\r
-IParamValueQueue::getPoint (0, pointTime, pointValue);\r
-\r
-double x2 = pointTime;\r
-double y2 = pointValue;\r
-\r
-double slope = (y2 - y1) / (x2 - x1);\r
-double offset = y1 - (slope * x1);\r
-\r
-double curveValue = (slope * bufferTime) + offset; // bufferTime is any position in buffer\r
-\endcode\r
-\r
-<b>Jumps:</b> \n\r
-A jump in the automation curve has to be transmitted as two points: one with the\r
-old value and one with the new value at the next sample position.\r
-\r
-\image html "automation.jpg"\r
-\see IParameterChanges, ProcessData\r
-*/\r
-//----------------------------------------------------------------------\r
-class IParamValueQueue: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns its associated ID. */\r
- virtual ParamID PLUGIN_API getParameterId () = 0;\r
-\r
- /** Returns count of points in the queue. */\r
- virtual int32 PLUGIN_API getPointCount () = 0;\r
-\r
- /** Gets the value and offset at a given index. */\r
- virtual tresult PLUGIN_API getPoint (int32 index, int32& sampleOffset /*out*/, ParamValue& value /*out*/) = 0;\r
-\r
- /** Adds a new value at the end of the queue, its index is returned. */\r
- virtual tresult PLUGIN_API addPoint (int32 sampleOffset, ParamValue value, int32& index /*out*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParamValueQueue, 0x01263A18, 0xED074F6F, 0x98C9D356, 0x4686F9BA)\r
-\r
-//----------------------------------------------------------------------\r
-/** All parameter changes of a processing block.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [released: 3.0.0]\r
-\r
-This interface is used to transmit any changes that shall be applied to parameters\r
-in the current processing block. A change can be caused by GUI interaction as\r
-well as automation. They are transmitted as a list of queues (IParamValueQueue)\r
-containing only queues for parameters that actually did change.\r
-\see IParamValueQueue, ProcessData */\r
-//----------------------------------------------------------------------\r
-class IParameterChanges: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns count of Parameter changes in the list. */\r
- virtual int32 PLUGIN_API getParameterCount () = 0;\r
-\r
- /** Returns the queue at a given index. */\r
- virtual IParamValueQueue* PLUGIN_API getParameterData (int32 index) = 0;\r
-\r
- /** Adds a new parameter queue with a given ID at the end of the list,\r
- returns it and its index in the parameter changes list. */\r
- virtual IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, int32& index /*out*/) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParameterChanges, 0xA4779663, 0x0BB64A56, 0xB44384A8, 0x466FEB9D)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstplugview.h\r
-// Created by : Steinberg, 01/2009\r
-// Description : Plug-in User Interface Extension\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-// IParameterFinder Interface\r
-//------------------------------------------------------------------------\r
-/** Extension for IPlugView to find view parameters (lookup value under mouse support)\r
-\ingroup pluginGUI vst302\r
-- [plug imp]\r
-- [extends IPlugView]\r
-- [released: 3.0.2]\r
-\r
-It is highly recommended to implement this interface.\r
-A host can implement important functionality when a plug-in supports this interface.\r
-\r
-For example, all Steinberg hosts require this interface in order to support the "AI Knob".\r
-*/\r
-class IParameterFinder: public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** Find out which parameter in Plug-in view is at given position (relative to Plug-in view). */\r
- virtual tresult PLUGIN_API findParameter (int32 xPos, int32 yPos, ParamID& resultTag /*out*/) = 0;\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IParameterFinder, 0x0F618302, 0x215D4587, 0xA512073C, 0x77B9D383)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstprefetchablesupport.h\r
-// Created by : Steinberg, 02/2015\r
-// Description : VST Prefetchable Support Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-#include "pluginterfaces/vst/ivstattributes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-typedef uint32 PrefetchableSupport;\r
-enum ePrefetchableSupport\r
-{\r
- kIsNeverPrefetchable = 0, ///< every instance of the plug does not support prefetch processing\r
- kIsYetPrefetchable, ///< in the current state the plug support prefetch processing\r
- kIsNotYetPrefetchable, ///< in the current state the plug does not support prefetch processing\r
- kNumPrefetchableSupport\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// IPrefetchableSupport Interface\r
-//------------------------------------------------------------------------\r
-/** Indicates that the Plug-in could or not support Prefetch (dynamically).\r
-\ingroup vstIPlug vst365\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.6.5]\r
-- [optional]\r
-\r
-The Plug-in should implement this interface if it needs to dynamically change between Prefetchable or not.\r
-By default (without implementing this interface) the host will decide in which mode the Plug-in will be process.\r
-For more info about Prefetch processing mode check ProcessModes::kPrefetch documentation.\r
-\r
-\section IPrefetchableSupportExample Example\r
-\code\r
-tresult PLUGIN_API myPlug::getPrefetchableSupport (PrefetchableSupport& prefetchable)\r
-{\r
- prefetchable = kIsNeverPrefetchable;\r
-\r
- switch (myPrefetchableMode)\r
- {\r
- case 0: prefetchable = kIsNeverPrefetchable; break;\r
- case 1: prefetchable = kIsYetPrefetchable; break;\r
- case 2: prefetchable = kIsNotYetPrefetchable; break;\r
- }\r
- return kResultOk;\r
-}\r
-\endcode */\r
-class IPrefetchableSupport : public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** retrieve the current prefetch support. Use IComponentHandler::restartComponent (kPrefetchableSupportChanged)\r
- to inform the host that this support has changed. */\r
- virtual tresult PLUGIN_API getPrefetchableSupport (PrefetchableSupport& prefetchable /*out*/) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IPrefetchableSupport, 0x8AE54FDA, 0xE93046B9, 0xA28555BC, 0xDC98E21E)\r
-\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstprocesscontext.h\r
-// Created by : Steinberg, 10/2005\r
-// Description : VST Processing Context Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Frame Rate */\r
-//------------------------------------------------------------------------\r
-struct FrameRate\r
-{\r
-//------------------------------------------------------------------------\r
- enum FrameRateFlags\r
- {\r
- kPullDownRate = 1 << 0, ///< for ex. HDTV: 23.976 fps with 24 as frame rate\r
- kDropRate = 1 << 1 ///< for ex. 29.97 fps drop with 30 as frame rate\r
- };\r
-//------------------------------------------------------------------------\r
- uint32 framesPerSecond; ///< frame rate\r
- uint32 flags; ///< flags #FrameRateFlags\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a chord.\r
-A chord is described with a key note, a root note and the\r
-\copydoc chordMask\r
-\see ProcessContext*/\r
-//------------------------------------------------------------------------\r
-struct Chord\r
-{\r
-//------------------------------------------------------------------------\r
- uint8 keyNote; ///< key note in chord\r
- uint8 rootNote; ///< lowest note in chord\r
-\r
- /** Bitmask of a chord.\r
- 1st bit set: minor second; 2nd bit set: major second, and so on. \n\r
- There is \b no bit for the keynote (root of the chord) because it is inherently always present. \n\r
- Examples:\r
- - XXXX 0000 0100 1000 (= 0x0048) -> major chord\n\r
- - XXXX 0000 0100 0100 (= 0x0044) -> minor chord\n\r
- - XXXX 0010 0100 0100 (= 0x0244) -> minor chord with minor seventh */\r
- int16 chordMask;\r
-\r
- enum Masks {\r
- kChordMask = 0x0FFF, ///< mask for chordMask\r
- kReservedMask = 0xF000 ///< reserved for future use\r
- };\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Audio processing context.\r
-For each processing block the host provides timing information and\r
-musical parameters that can change over time. For a host that supports jumps\r
-(like cycle) it is possible to split up a processing block into multiple parts in\r
-order to provide a correct project time inside of every block, but this behaviour\r
-is not mandatory. Since the timing will be correct at the beginning of the next block\r
-again, a host that is dependent on a fixed processing block size can choose to neglect\r
-this problem.\r
-\see IAudioProcessor, ProcessData*/\r
-//------------------------------------------------------------------------\r
-struct ProcessContext\r
-{\r
-//------------------------------------------------------------------------\r
- /** Transport state & other flags */\r
- enum StatesAndFlags\r
- {\r
- kPlaying = 1 << 1, ///< currently playing\r
- kCycleActive = 1 << 2, ///< cycle is active\r
- kRecording = 1 << 3, ///< currently recording\r
-\r
- kSystemTimeValid = 1 << 8, ///< systemTime contains valid information\r
- kContTimeValid = 1 << 17, ///< continousTimeSamples contains valid information\r
-\r
- kProjectTimeMusicValid = 1 << 9,///< projectTimeMusic contains valid information\r
- kBarPositionValid = 1 << 11, ///< barPositionMusic contains valid information\r
- kCycleValid = 1 << 12, ///< cycleStartMusic and barPositionMusic contain valid information\r
-\r
- kTempoValid = 1 << 10, ///< tempo contains valid information\r
- kTimeSigValid = 1 << 13, ///< timeSigNumerator and timeSigDenominator contain valid information\r
- kChordValid = 1 << 18, ///< chord contains valid information\r
-\r
- kSmpteValid = 1 << 14, ///< smpteOffset and frameRate contain valid information\r
- kClockValid = 1 << 15 ///< samplesToNextClock valid\r
- };\r
-\r
- uint32 state; ///< a combination of the values from \ref StatesAndFlags\r
-\r
- double sampleRate; ///< current sample rate (always valid)\r
- TSamples projectTimeSamples; ///< project time in samples (always valid)\r
-\r
- int64 systemTime; ///< system time in nanoseconds (optional)\r
- TSamples continousTimeSamples; ///< project time, without loop (optional)\r
-\r
- TQuarterNotes projectTimeMusic; ///< musical position in quarter notes (1.0 equals 1 quarter note)\r
- TQuarterNotes barPositionMusic; ///< last bar start position, in quarter notes\r
- TQuarterNotes cycleStartMusic; ///< cycle start in quarter notes\r
- TQuarterNotes cycleEndMusic; ///< cycle end in quarter notes\r
-\r
- double tempo; ///< tempo in BPM (Beats Per Minute)\r
- int32 timeSigNumerator; ///< time signature numerator (e.g. 3 for 3/4)\r
- int32 timeSigDenominator; ///< time signature denominator (e.g. 4 for 3/4)\r
-\r
- Chord chord; ///< musical info\r
-\r
- int32 smpteOffsetSubframes; ///< SMPTE (sync) offset in subframes (1/80 of frame)\r
- FrameRate frameRate; ///< frame rate\r
-\r
- int32 samplesToNextClock; ///< MIDI Clock Resolution (24 Per Quarter Note), can be negative (nearest)\r
-//------------------------------------------------------------------------\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstrepresentation.h\r
-// Created by : Steinberg, 08/2010\r
-// Description : VST Representation Interface\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "pluginterfaces/vst/vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** RepresentationInfo is the structure describing a representation\r
-This structure is used in the function \see IXmlRepresentationController::getXmlRepresentationStream.\r
-\see IXmlRepresentationController\r
-*/\r
-struct RepresentationInfo\r
-{\r
- RepresentationInfo ()\r
- {\r
- memset (vendor, 0, kNameSize);\r
- memset (name, 0, kNameSize);\r
- memset (version, 0, kNameSize);\r
- memset (host, 0, kNameSize);\r
- }\r
-\r
- RepresentationInfo (char8* _vendor, char8* _name = 0, char8* _version = 0, char8* _host = 0)\r
- {\r
- memset (vendor, 0, kNameSize);\r
- if (_vendor)\r
- strcpy (vendor, _vendor);\r
- memset (name, 0, kNameSize);\r
- if (_name)\r
- strcpy (name, _name);\r
- memset (version, 0, kNameSize);\r
- if (_version)\r
- strcpy (version, _version);\r
- memset (host, 0, kNameSize);\r
- if (_host)\r
- strcpy (host, _host);\r
- }\r
-\r
- enum\r
- {\r
- kNameSize = 64\r
- };\r
- char8 vendor[kNameSize]; ///< Vendor name of the associated representation (remote) (eg. "Yamaha").\r
- char8 name[kNameSize]; ///< Representation (remote) Name (eg. "O2").\r
- char8 version[kNameSize]; ///< Version of this "Remote" (eg. "1.0").\r
- char8 host[kNameSize]; ///< Optional: used if the representation is for a given host only (eg. "Nuendo").\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-//------------------------------------------------------------------------\r
-/** Extended Plug-in interface IEditController for a component.\r
-\ingroup vstIPlug vst350\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.5.0]\r
-- [optional]\r
-\r
-A Representation based on XML is a way to export and structure, group Plug-ins parameters for a specific remote (could be hardware or software rack (like quickcontrols)).\r
-\n\r
-It allows to describe more precisely each parameter (what is the best matching to a knob, different titles lengths matching limited remote display,...).\n See an \ref Example.\r
- \n\n\r
-- A Representation is composed of Pages (this means that to see all exported parameters the user has to navigate through the pages).\r
-- A Page is composed of Cells (for example 8 Cells per page).\r
-- A Cell is composed of Layers (for example a cell could have a knob, a display and a button which are 3 Layers).\r
-- A Layer is associated to a Plug-in parameter using the ParameterID as identifier:\r
- - it could be a knob with a display for Title and/or value, this display uses the same parameterId, but it could an another one.\r
- - Switch\r
- - link which allows to jump directly to a subpage (an another page)\r
- - more... See Vst::LayerType\r
-.\r
-\r
-\n\r
-This Representation is implemented as XML text following the Document Type Definition (DTD): http://dtd.steinberg.net/VST-Remote-1.1.dtd\r
-\r
-\section Example\r
-Here an example of what should be passed in the stream of getXmlRepresentationStream:\r
-\r
-\code\r
-<?xml version="1.0" encoding="utf-8"?>\r
-<!DOCTYPE vstXML PUBLIC "-//Steinberg//DTD VST Remote 1.1//EN" "http://dtd.steinberg.net/VST-Remote-1.1.dtd">\r
-<vstXML version="1.0">\r
- <plugin classID="341FC5898AAA46A7A506BC0799E882AE" name="Chorus" vendor="Steinberg Media Technologies" />\r
- <originator>My name</originator>\r
- <date>2010-12-31</date>\r
- <comment>This is an example for 4 Cells per Page for the Remote named ProductRemote\r
- from company HardwareCompany.</comment>\r
-\r
- <!-- ===================================== -->\r
- <representation name="ProductRemote" vendor="HardwareCompany" version="1.0">\r
- <page name="Root">\r
- <cell>\r
- <layer type="knob" parameterID="0">\r
- <titleDisplay>\r
- <name>Mix dry/wet</name>\r
- <name>Mix</name>\r
- </titleDisplay>\r
- </layer>\r
- </cell>\r
- <cell>\r
- <layer type="display"></layer>\r
- </cell>\r
- <cell>\r
- <layer type="knob" parameterID="3">\r
- <titleDisplay>\r
- <name>Delay</name>\r
- <name>Dly</name>\r
- </titleDisplay>\r
- </layer>\r
- </cell>\r
- <cell>\r
- <layer type="knob" parameterID="15">\r
- <titleDisplay>\r
- <name>Spatial</name>\r
- <name>Spat</name>\r
- </titleDisplay>\r
- </layer>\r
- </cell>\r
- </page>\r
- <page name="Page 2">\r
- <cell>\r
- <layer type="LED" ledStyle="spread" parameterID="2">\r
- <titleDisplay>\r
- <name>Width +</name>\r
- <name>Widt</name>\r
- </titleDisplay>\r
- </layer>\r
- <!--this is the switch for shape A/B-->\r
- <layer type="switch" switchStyle="pushIncLooped" parameterID="4"></layer>\r
- </cell>\r
- <cell>\r
- <layer type="display"></layer>\r
- </cell>\r
- <cell>\r
- <layer type="LED" ledStyle="singleDot" parameterID="17">\r
- <titleDisplay>\r
- <name>Sync Note +</name>\r
- <name>Note</name>\r
- </titleDisplay>\r
- </layer>\r
- <!--this is the switch for sync to tempo on /off-->\r
- <layer type="switch" switchStyle="pushIncLooped" parameterID="16"></layer>\r
- </cell>\r
- <cell>\r
- <layer type="knob" parameterID="1">\r
- <titleDisplay>\r
- <name>Rate</name>\r
- </titleDisplay>\r
- </layer>\r
- </cell>\r
- </page>\r
- </representation>\r
-</vstXML>\r
-\endcode\r
-*/\r
-//------------------------------------------------------------------------\r
-class IXmlRepresentationController: public FUnknown\r
-{\r
-public:\r
- /** Retrieves a stream containing a XmlRepresentation for a wanted representation info */\r
- virtual tresult PLUGIN_API getXmlRepresentationStream (RepresentationInfo& info /*in*/, IBStream* stream /*out*/) = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IXmlRepresentationController, 0xA81A0471, 0x48C34DC4, 0xAC30C9E1, 0x3C8393D5)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Defines for XML representation Tags and Attributes */\r
-\r
-#define ROOTXML_TAG "vstXML"\r
-\r
-#define COMMENT_TAG "comment"\r
-#define CELL_TAG "cell"\r
-#define CELLGROUP_TAG "cellGroup"\r
-#define CELLGROUPTEMPLATE_TAG "cellGroupTemplate"\r
-#define CURVE_TAG "curve"\r
-#define CURVETEMPLATE_TAG "curveTemplate"\r
-#define DATE_TAG "date"\r
-#define LAYER_TAG "layer"\r
-#define NAME_TAG "name"\r
-#define ORIGINATOR_TAG "originator"\r
-#define PAGE_TAG "page"\r
-#define PAGETEMPLATE_TAG "pageTemplate"\r
-#define PLUGIN_TAG "plugin"\r
-#define VALUE_TAG "value"\r
-#define VALUEDISPLAY_TAG "valueDisplay"\r
-#define VALUELIST_TAG "valueList"\r
-#define REPRESENTATION_TAG "representation"\r
-#define SEGMENT_TAG "segment"\r
-#define SEGMENTLIST_TAG "segmentList"\r
-#define TITLEDISPLAY_TAG "titleDisplay"\r
-\r
-#define ATTR_CATEGORY "category"\r
-#define ATTR_CLASSID "classID"\r
-#define ATTR_ENDPOINT "endPoint"\r
-#define ATTR_INDEX "index"\r
-#define ATTR_FLAGS "flags"\r
-#define ATTR_FUNCTION "function"\r
-#define ATTR_HOST "host"\r
-#define ATTR_LEDSTYLE "ledStyle"\r
-#define ATTR_LENGTH "length"\r
-#define ATTR_LINKEDTO "linkedTo"\r
-#define ATTR_NAME "name"\r
-#define ATTR_ORDER "order"\r
-#define ATTR_PAGE "page"\r
-#define ATTR_PARAMID "parameterID"\r
-#define ATTR_STARTPOINT "startPoint"\r
-#define ATTR_STYLE "style"\r
-#define ATTR_SWITCHSTYLE "switchStyle"\r
-#define ATTR_TEMPLATE "template"\r
-#define ATTR_TURNSPERFULLRANGE "turnsPerFullRange"\r
-#define ATTR_TYPE "type"\r
-#define ATTR_UNITID "unitID"\r
-#define ATTR_VARIABLES "variables"\r
-#define ATTR_VENDOR "vendor"\r
-#define ATTR_VERSION "version"\r
-\r
-//------------------------------------------------------------------------\r
-/** Defines some predefined Representation Remote Names */\r
-#define GENERIC "Generic"\r
-#define GENERIC_4_CELLS "Generic 4 Cells"\r
-#define GENERIC_8_CELLS "Generic 8 Cells"\r
-#define GENERIC_12_CELLS "Generic 12 Cells"\r
-#define GENERIC_24_CELLS "Generic 24 Cells"\r
-#define GENERIC_N_CELLS "Generic %d Cells"\r
-#define QUICK_CONTROL_8_CELLS "Quick Controls 8 Cells"\r
-\r
-//------------------------------------------------------------------------\r
-/** Layer Types used in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace LayerType\r
-{\r
- enum\r
- {\r
- kKnob = 0, ///< a knob (encoder or not)\r
- kPressedKnob, ///< a knob which is used by pressing and turning\r
- kSwitchKnob, ///< knob could be pressed to simulate a switch\r
- kSwitch, ///< a "on/off" button\r
- kLED, ///< LED like VU-meter or display around a knob\r
- kLink, ///< indicates that this layer is a folder linked to an another INode (page)\r
- kDisplay, ///< only for text display (not really a control)\r
- kFader, ///< a fader\r
- kEndOfLayerType\r
- };\r
-\r
- /** FIDString variant of the LayerType */\r
- static const FIDString layerTypeFIDString[] = {\r
- "knob"\r
- ,"pressedKnob"\r
- ,"switchKnob"\r
- ,"switch"\r
- ,"LED"\r
- ,"link"\r
- ,"display"\r
- ,"fader"\r
- ,0\r
- };\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Curve Types used in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace CurveType\r
-{\r
- const CString kSegment = "segment"; ///<\r
- const CString kValueList = "valueList"; ///<\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes used to defined a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace Attributes\r
-{\r
- const CString kStyle = ATTR_STYLE; ///< string attribute : See AttributesStyle for available string value\r
- const CString kLEDStyle = ATTR_LEDSTYLE; ///< string attribute : See AttributesStyle for available string value\r
- const CString kSwitchStyle = ATTR_SWITCHSTYLE; ///< string attribute : See AttributesStyle for available string value\r
- const CString kKnobTurnsPerFullRange = ATTR_TURNSPERFULLRANGE; ///< float attribute\r
- const CString kFunction = ATTR_FUNCTION; ///< string attribute : See AttributesFunction for available string value\r
- const CString kFlags = ATTR_FLAGS; ///< string attribute : See AttributesFlags for available string value\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Function used to defined the function of a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesFunction\r
-{\r
- /// Global Style\r
- const CString kPanPosCenterXFunc = "PanPosCenterX"; ///< Gravity point X-axis (L-R) (for stereo: middle between left and right)\r
- const CString kPanPosCenterYFunc = "PanPosCenterY"; ///< Gravity point Y-axis (Front-Rear)\r
- const CString kPanPosFrontLeftXFunc = "PanPosFrontLeftX"; ///< Left channel Position in X-axis\r
- const CString kPanPosFrontLeftYFunc = "PanPosFrontLeftY"; ///< Left channel Position in Y-axis\r
- const CString kPanPosFrontRightXFunc = "PanPosFrontRightX"; ///< Right channel Position in X-axis\r
- const CString kPanPosFrontRightYFunc = "PanPosFrontRightY"; ///< Right channel Position in Y-axis\r
- const CString kPanRotationFunc = "PanRotation"; ///< Rotation around the Center (gravity point)\r
- const CString kPanLawFunc = "PanLaw"; ///< Panning Law\r
- const CString kPanMirrorModeFunc = "PanMirrorMode"; ///< Panning Mirror Mode\r
- const CString kPanLfeGainFunc = "PanLfeGain"; ///< Panning LFE Gain\r
- const CString kGainReductionFunc = "GainReduction"; ///< Gain Reduction for compressor\r
- const CString kSoloFunc = "Solo"; ///< Solo\r
- const CString kMuteFunc = "Mute"; ///< Mute\r
- const CString kVolumeFunc = "Volume"; ///< Volume\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Style associated a specific Layer Type in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesStyle\r
-{\r
- /// Global Style\r
- const CString kInverseStyle = "inverse"; ///< the associated layer should use the inverse value of parameter (1 - x).\r
-\r
- /// LED Style\r
- const CString kLEDWrapLeftStyle = "wrapLeft"; ///< |======>----- (the default one if not specified)\r
- const CString kLEDWrapRightStyle = "wrapRight"; ///< -------<====|\r
- const CString kLEDSpreadStyle = "spread"; ///< ---<==|==>---\r
- const CString kLEDBoostCutStyle = "boostCut"; ///< ------|===>--\r
- const CString kLEDSingleDotStyle = "singleDot"; ///< --------|----\r
-\r
- /// Switch Style\r
- const CString kSwitchPushStyle = "push"; ///< Apply only when pressed, unpressed will reset the value to min.\r
- const CString kSwitchPushIncLoopedStyle = "pushIncLooped"; ///< Push will increment the value. When the max is reached it will restart with min.\r
- ///< The default one if not specified (with 2 states values it is a OnOff switch).\r
- const CString kSwitchPushDecLoopedStyle = "pushDecLooped"; ///< Push will decrement the value. When the min is reached it will restart with max.\r
- const CString kSwitchPushIncStyle = "pushInc"; ///< Increment after each press (delta depends of the curve).\r
- const CString kSwitchPushDecStyle = "pushDec"; ///< Decrement after each press (delta depends of the curve).\r
- const CString kSwitchLatchStyle = "latch"; ///< Each push-release will change the value between min and max.\r
- ///< A timeout between push and release could be used to simulate a push style (if timeout is reached).\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Attributes Flags defining a Layer in a VST XML Representation */\r
-//------------------------------------------------------------------------\r
-namespace AttributesFlags\r
-{\r
- const CString kHideableFlag = "hideable"; ///< the associated layer marked as hideable allows a remote to hide or make it not usable a parameter when the associated value is inactive\r
-};\r
-\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/ivstunits.h\r
-// Created by : Steinberg, 2005\r
-// Description : VST Units Interfaces\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-#include "vsttypes.h"\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpush.h"\r
-//------------------------------------------------------------------------\r
-\r
-namespace Steinberg {\r
-class IBStream;\r
-\r
-//------------------------------------------------------------------------\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** Special UnitIDs for UnitInfo */\r
-static const UnitID kRootUnitId = 0; ///< identifier for the top level unit (root)\r
-static const UnitID kNoParentUnitId = -1; ///< used for the root unit which doesn't have a parent.\r
-\r
-//------------------------------------------------------------------------\r
-/** Special ProgramListIDs for UnitInfo */\r
-static const ProgramListID kNoProgramListId = -1; ///< no programs are used in the unit.\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Unit Description.\r
-\see IUnitInfo */\r
-//------------------------------------------------------------------------\r
-struct UnitInfo\r
-{\r
- UnitID id; ///< unit identifier\r
- UnitID parentUnitId; ///< identifier of parent unit (kNoParentUnitId: does not apply, this unit is the root)\r
- String128 name; ///< name, optional for the root component, required otherwise\r
- ProgramListID programListId; ///< id of program list used in unit (kNoProgramListId = no programs used in this unit)\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Program List Description.\r
-\see IUnitInfo */\r
-//------------------------------------------------------------------------\r
-struct ProgramListInfo\r
-{\r
- ProgramListID id; ///< program list identifier\r
- String128 name; ///< name of program list\r
- int32 programCount; ///< number of programs in this list\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Special programIndex value for IUnitHandler::notifyProgramListChange */\r
-static const int32 kAllProgramInvalid = -1; ///< all program information is invalid\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback for unit support.\r
-\ingroup vstIHost vst300\r
-- [host imp]\r
-- [extends IComponentHandler]\r
-- [released: 3.0.0]\r
-\r
-Host callback interface, used with IUnitInfo.\r
-Retrieve via queryInterface from IComponentHandler.\r
-\r
-\see \ref vst3Units, IUnitInfo */\r
-//------------------------------------------------------------------------\r
-class IUnitHandler: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Notify host when a module is selected in Plug-in GUI. */\r
- virtual tresult PLUGIN_API notifyUnitSelection (UnitID unitId) = 0;\r
-\r
- /** Tell host that the Plug-in controller changed a program list (rename, load, PitchName changes).\r
- \param listId is the specified program list ID to inform.\r
- \param programIndex : when kAllProgramInvalid, all program information is invalid, otherwise only the program of given index. */\r
- virtual tresult PLUGIN_API notifyProgramListChange (ProgramListID listId, int32 programIndex) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitHandler, 0x4B5147F8, 0x4654486B, 0x8DAB30BA, 0x163A3C56)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Host callback for extended unit support.\r
-\ingroup vstIHost vst365\r
-- [host imp]\r
-- [extends IUnitHandler]\r
-- [released: 3.6.5]\r
-\r
-Host callback interface, used with IUnitInfo.\r
-Retrieve via queryInterface from IComponentHandler.\r
-\r
-\see \ref vst3Units, IUnitHandler */\r
-//------------------------------------------------------------------------\r
-class IUnitHandler2 : public FUnknown\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- /** Tell host that assignment Unit-Bus defined by IUnitInfo::getUnitByBus has changed. */\r
- virtual tresult PLUGIN_API notifyUnitByBusChange () = 0;\r
-\r
- //------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitHandler2, 0xF89F8CDF, 0x699E4BA5, 0x96AAC9A4, 0x81452B01)\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Edit controller extension to describe the Plug-in structure.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IEditController]\r
-- [released: 3.0.0]\r
-\r
-IUnitInfo describes the internal structure of the Plug-in.\r
-- The root unit is the component itself, so getUnitCount must return 1 at least.\r
-- The root unit id has to be 0 (kRootUnitId).\r
-- Each unit can reference one program list - this reference must not change.\r
-- Each unit using a program list, references one program of the list.\r
-\r
-\see \ref vst3Units, IUnitHandler */\r
-//------------------------------------------------------------------------\r
-class IUnitInfo: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns the flat count of units. */\r
- virtual int32 PLUGIN_API getUnitCount () = 0;\r
-\r
- /** Gets UnitInfo for a given index in the flat list of unit. */\r
- virtual tresult PLUGIN_API getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) = 0;\r
-\r
- /** Component intern program structure. */\r
- /** Gets the count of Program List. */\r
- virtual int32 PLUGIN_API getProgramListCount () = 0;\r
-\r
- /** Gets for a given index the Program List Info. */\r
- virtual tresult PLUGIN_API getProgramListInfo (int32 listIndex, ProgramListInfo& info /*out*/) = 0;\r
-\r
- /** Gets for a given program list ID and program index its program name. */\r
- virtual tresult PLUGIN_API getProgramName (ProgramListID listId, int32 programIndex, String128 name /*out*/) = 0;\r
-\r
- /** Gets for a given program list ID, program index and attributeId the associated attribute value. */\r
- virtual tresult PLUGIN_API getProgramInfo (ProgramListID listId, int32 programIndex,\r
- CString attributeId /*in*/, String128 attributeValue /*out*/) = 0;\r
-\r
- /** Returns kResultTrue if the given program index of a given program list ID supports PitchNames. */\r
- virtual tresult PLUGIN_API hasProgramPitchNames (ProgramListID listId, int32 programIndex) = 0;\r
-\r
- /** Gets the PitchName for a given program list ID, program index and pitch.\r
- If PitchNames are changed the Plug-in should inform the host with IUnitHandler::notifyProgramListChange. */\r
- virtual tresult PLUGIN_API getProgramPitchName (ProgramListID listId, int32 programIndex,\r
- int16 midiPitch, String128 name /*out*/) = 0;\r
-\r
- // units selection --------------------\r
- /** Gets the current selected unit. */\r
- virtual UnitID PLUGIN_API getSelectedUnit () = 0;\r
-\r
- /** Sets a new selected unit. */\r
- virtual tresult PLUGIN_API selectUnit (UnitID unitId) = 0;\r
-\r
- /** Gets the according unit if there is an unambiguous relation between a channel or a bus and a unit.\r
- This method mainly is intended to find out which unit is related to a given MIDI input channel. */\r
- virtual tresult PLUGIN_API getUnitByBus (MediaType type, BusDirection dir, int32 busIndex,\r
- int32 channel, UnitID& unitId /*out*/) = 0;\r
-\r
- /** Receives a preset data stream.\r
- - If the component supports program list data (IProgramListData), the destination of the data\r
- stream is the program specified by list-Id and program index (first and second parameter)\r
- - If the component supports unit data (IUnitData), the destination is the unit specified by the first\r
- parameter - in this case parameter programIndex is < 0). */\r
- virtual tresult PLUGIN_API setUnitProgramData (int32 listOrUnitId, int32 programIndex, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitInfo, 0x3D4BD6B5, 0x913A4FD2, 0xA886E768, 0xA5EB92C1)\r
-\r
-//------------------------------------------------------------------------\r
-/** Component extension to access program list data.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-\r
-A component can either support program list data via this interface or\r
-unit preset data (IUnitData), but not both!\r
-\r
-\see \ref vst3UnitPrograms */\r
-//------------------------------------------------------------------------\r
-class IProgramListData: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns kResultTrue if the given Program List ID supports Program Data. */\r
- virtual tresult PLUGIN_API programDataSupported (ProgramListID listId) = 0;\r
-\r
- /** Gets for a given program list ID and program index the program Data. */\r
- virtual tresult PLUGIN_API getProgramData (ProgramListID listId, int32 programIndex, IBStream* data) = 0;\r
-\r
- /** Sets for a given program list ID and program index a program Data. */\r
- virtual tresult PLUGIN_API setProgramData (ProgramListID listId, int32 programIndex, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IProgramListData, 0x8683B01F, 0x7B354F70, 0xA2651DEC, 0x353AF4FF)\r
-\r
-//------------------------------------------------------------------------\r
-/** Component extension to access unit data.\r
-\ingroup vstIPlug vst300\r
-- [plug imp]\r
-- [extends IComponent]\r
-- [released: 3.0.0]\r
-\r
-A component can either support unit preset data via this interface or\r
-program list data (IProgramListData), but not both!\r
-\r
-\see \ref vst3UnitPrograms */\r
-//------------------------------------------------------------------------\r
-class IUnitData: public FUnknown\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Returns kResultTrue if the specified unit supports export and import of preset data. */\r
- virtual tresult PLUGIN_API unitDataSupported (UnitID unitID) = 0;\r
-\r
- /** Gets the preset data for the specified unit. */\r
- virtual tresult PLUGIN_API getUnitData (UnitID unitId, IBStream* data) = 0;\r
-\r
- /** Sets the preset data for the specified unit. */\r
- virtual tresult PLUGIN_API setUnitData (UnitID unitId, IBStream* data) = 0;\r
-\r
-//------------------------------------------------------------------------\r
- static const FUID iid;\r
-};\r
-\r
-DECLARE_CLASS_IID (IUnitData, 0x6C389611, 0xD391455D, 0xB870B833, 0x94A0EFDD)\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
-\r
-//------------------------------------------------------------------------\r
-#include "pluginterfaces/base/falignpop.h"\r
-//------------------------------------------------------------------------\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-// Version : 3.6.7\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/vstpshpack4.h\r
-// Created by : Steinberg, 05/2010\r
-// Description : This file turns 4 Bytes packing of structures on. The file\r
-// pluginterfaces/base/falignpop.h is the complement to this file.\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-//----------------------------------------------------------------------------------------------\r
-#if defined __BORLANDC__\r
- #pragma -a4\r
-#else\r
- #if (_MSC_VER >= 800 && !defined(_M_I86)) || defined(_PUSHPOP_SUPPORTED)\r
- #pragma warning(disable:4103)\r
- #endif\r
-\r
- #pragma pack(push)\r
- #pragma pack(4)\r
-#endif\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/vstspeaker.h\r
-// Created by : Steinberg, 01/2019\r
-// Description : common defines\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-#include "vsttypes.h"\r
-\r
-//#include "pluginterfaces/base/ftype.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-/** \defgroup speakerArrangements Speaker Arrangements\r
-\image html "vst3_speaker_types.jpg"\r
-\n\r
-A SpeakerArrangement is a bitset combination of speakers. For example:\r
-\code\r
-const SpeakerArrangement kStereo = kSpeakerL | kSpeakerR; // => hex: 0x03 / binary: 0011.\r
-\endcode*/\r
-//------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Definitions.\r
-\ingroup speakerArrangements */\r
-//------------------------------------------------------------------------\r
-/**@{*/\r
-const Speaker kSpeakerL = 1 << 0; ///< Left (L)\r
-const Speaker kSpeakerR = 1 << 1; ///< Right (R)\r
-const Speaker kSpeakerC = 1 << 2; ///< Center (C)\r
-const Speaker kSpeakerLfe = 1 << 3; ///< Subbass (Lfe)\r
-const Speaker kSpeakerLs = 1 << 4; ///< Left Surround (Ls)\r
-const Speaker kSpeakerRs = 1 << 5; ///< Right Surround (Rs)\r
-const Speaker kSpeakerLc = 1 << 6; ///< Left of Center (Lc) - Front Left Center\r
-const Speaker kSpeakerRc = 1 << 7; ///< Right of Center (Rc) - Front Right Center\r
-const Speaker kSpeakerS = 1 << 8; ///< Surround (S)\r
-const Speaker kSpeakerCs = kSpeakerS; ///< Center of Surround (Cs) - Back Center - Surround (S)\r
-const Speaker kSpeakerSl = 1 << 9; ///< Side Left (Sl)\r
-const Speaker kSpeakerSr = 1 << 10; ///< Side Right (Sr)\r
-const Speaker kSpeakerTc = 1 << 11; ///< Top Center Over-head, Top Middle (Tc)\r
-const Speaker kSpeakerTfl = 1 << 12; ///< Top Front Left (Tfl)\r
-const Speaker kSpeakerTfc = 1 << 13; ///< Top Front Center (Tfc)\r
-const Speaker kSpeakerTfr = 1 << 14; ///< Top Front Right (Tfr)\r
-const Speaker kSpeakerTrl = 1 << 15; ///< Top Rear/Back Left (Trl)\r
-const Speaker kSpeakerTrc = 1 << 16; ///< Top Rear/Back Center (Trc)\r
-const Speaker kSpeakerTrr = 1 << 17; ///< Top Rear/Back Right (Trr)\r
-const Speaker kSpeakerLfe2 = 1 << 18; ///< Subbass 2 (Lfe2)\r
-const Speaker kSpeakerM = 1 << 19; ///< Mono (M)\r
-\r
-const Speaker kSpeakerACN0 = (Speaker)1 << 20; ///< Ambisonic ACN 0\r
-const Speaker kSpeakerACN1 = (Speaker)1 << 21; ///< Ambisonic ACN 1\r
-const Speaker kSpeakerACN2 = (Speaker)1 << 22; ///< Ambisonic ACN 2\r
-const Speaker kSpeakerACN3 = (Speaker)1 << 23; ///< Ambisonic ACN 3\r
-const Speaker kSpeakerACN4 = (Speaker)1 << 38; ///< Ambisonic ACN 4\r
-const Speaker kSpeakerACN5 = (Speaker)1 << 39; ///< Ambisonic ACN 5\r
-const Speaker kSpeakerACN6 = (Speaker)1 << 40; ///< Ambisonic ACN 6\r
-const Speaker kSpeakerACN7 = (Speaker)1 << 41; ///< Ambisonic ACN 7\r
-const Speaker kSpeakerACN8 = (Speaker)1 << 42; ///< Ambisonic ACN 8\r
-const Speaker kSpeakerACN9 = (Speaker)1 << 43; ///< Ambisonic ACN 9\r
-const Speaker kSpeakerACN10 = (Speaker)1 << 44; ///< Ambisonic ACN 10\r
-const Speaker kSpeakerACN11 = (Speaker)1 << 45; ///< Ambisonic ACN 11\r
-const Speaker kSpeakerACN12 = (Speaker)1 << 46; ///< Ambisonic ACN 12\r
-const Speaker kSpeakerACN13 = (Speaker)1 << 47; ///< Ambisonic ACN 13\r
-const Speaker kSpeakerACN14 = (Speaker)1 << 48; ///< Ambisonic ACN 14\r
-const Speaker kSpeakerACN15 = (Speaker)1 << 49; ///< Ambisonic ACN 15\r
-\r
-const Speaker kSpeakerTsl = 1 << 24; ///< Top Side Left (Tsl)\r
-const Speaker kSpeakerTsr = 1 << 25; ///< Top Side Right (Tsr)\r
-const Speaker kSpeakerLcs = 1 << 26; ///< Left of Center Surround (Lcs) - Back Left Center\r
-const Speaker kSpeakerRcs = 1 << 27; ///< Right of Center Surround (Rcs) - Back Right Center\r
-\r
-const Speaker kSpeakerBfl = 1 << 28; ///< Bottom Front Left (Bfl)\r
-const Speaker kSpeakerBfc = 1 << 29; ///< Bottom Front Center (Bfc)\r
-const Speaker kSpeakerBfr = 1 << 30; ///< Bottom Front Right (Bfr)\r
-\r
-const Speaker kSpeakerPl = (Speaker)1 << 31; ///< Proximity Left (Pl)\r
-const Speaker kSpeakerPr = (Speaker)1 << 32; ///< Proximity Right (Pr)\r
-\r
-const Speaker kSpeakerBsl = (Speaker)1 << 33; ///< Bottom Side Left (Bsl)\r
-const Speaker kSpeakerBsr = (Speaker)1 << 34; ///< Bottom Side Right (Bsr)\r
-const Speaker kSpeakerBrl = (Speaker)1 << 35; ///< Bottom Rear Left (Brl)\r
-const Speaker kSpeakerBrc = (Speaker)1 << 36; ///< Bottom Rear Center (Brc)\r
-const Speaker kSpeakerBrr = (Speaker)1 << 37; ///< Bottom Rear Right (Brr)\r
-//------------------------------------------------------------------------\r
-/** @}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement Definitions (SpeakerArrangement)*/\r
-//------------------------------------------------------------------------\r
-namespace SpeakerArr\r
-{\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement Definitions.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const SpeakerArrangement kEmpty = 0; ///< empty arrangement\r
-const SpeakerArrangement kMono = kSpeakerM; ///< M\r
-const SpeakerArrangement kStereo = kSpeakerL | kSpeakerR; ///< L R\r
-const SpeakerArrangement kStereoSurround = kSpeakerLs | kSpeakerRs; ///< Ls Rs\r
-const SpeakerArrangement kStereoCenter = kSpeakerLc | kSpeakerRc; ///< Lc Rc\r
-const SpeakerArrangement kStereoSide = kSpeakerSl | kSpeakerSr; ///< Sl Sr\r
-const SpeakerArrangement kStereoCLfe = kSpeakerC | kSpeakerLfe; ///< C Lfe\r
-const SpeakerArrangement kStereoTF = kSpeakerTfl | kSpeakerTfr; ///< Tfl Tfr\r
-const SpeakerArrangement kStereoTS = kSpeakerTsl | kSpeakerTsr; ///< Tsl Tsr\r
-const SpeakerArrangement kStereoTR = kSpeakerTrl | kSpeakerTrr; ///< Trl Trr\r
-const SpeakerArrangement kStereoBF = kSpeakerBfl | kSpeakerBfr; ///< Bfl Bfr\r
-\r
-/** L R C */\r
-const SpeakerArrangement k30Cine = kSpeakerL | kSpeakerR | kSpeakerC;\r
-/** L R S */\r
-const SpeakerArrangement k30Music = kSpeakerL | kSpeakerR | kSpeakerS;\r
-/** L R C Lfe */\r
-const SpeakerArrangement k31Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe;\r
-/** L R Lfe S */\r
-const SpeakerArrangement k31Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerS;\r
-/** L R C S (LCRS) */\r
-const SpeakerArrangement k40Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerS;\r
-/** L R Ls Rs (Quadro) */\r
-const SpeakerArrangement k40Music = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs;\r
-/** L R C Lfe S (LCRS+Lfe) */\r
-const SpeakerArrangement k41Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerS;\r
-/** L R Lfe Ls Rs (Quadro+Lfe) */\r
-const SpeakerArrangement k41Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs;\r
-/** L R C Ls Rs */\r
-const SpeakerArrangement k50 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs;\r
-/** L R C Lfe Ls Rs */\r
-const SpeakerArrangement k51 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs;\r
-/** L R C Ls Rs Cs */\r
-const SpeakerArrangement k60Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerCs;\r
-/** L R Ls Rs Sl Sr */\r
-const SpeakerArrangement k60Music = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Lfe Ls Rs Cs */\r
-const SpeakerArrangement k61Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs;\r
-/** L R Lfe Ls Rs Sl Sr */\r
-const SpeakerArrangement k61Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Ls Rs Lc Rc */\r
-const SpeakerArrangement k70Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc;\r
-/** L R C Ls Rs Sl Sr */\r
-const SpeakerArrangement k70Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Lfe Ls Rs Lc Rc */\r
-const SpeakerArrangement k71Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc;\r
-const SpeakerArrangement k71CineFullFront= k71Cine;\r
-/** L R C Lfe Ls Rs Lcs Rcs */\r
-const SpeakerArrangement k71CineFullRear = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLcs | kSpeakerRcs;\r
-/** L R C Lfe Ls Rs Sl Sr */\r
-const SpeakerArrangement k71Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr;\r
-const SpeakerArrangement k71CineSideFill = k71Music;\r
-/** L R C Lfe Ls Rs Pl Pr */\r
-const SpeakerArrangement k71Proximity = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerPl | kSpeakerPr;\r
-/** L R C Ls Rs Lc Rc Cs */\r
-const SpeakerArrangement k80Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs;\r
-/** L R C Ls Rs Cs Sl Sr */\r
-const SpeakerArrangement k80Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr;\r
-/** L R C Lfe Ls Rs Lc Rc Cs */\r
-const SpeakerArrangement k81Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs;\r
-/** L R C Lfe Ls Rs Cs Sl Sr */\r
-const SpeakerArrangement k81Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr;\r
-\r
-\r
-/** First-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi1stOrderACN = kSpeakerACN0 | kSpeakerACN1 | kSpeakerACN2 | kSpeakerACN3;\r
-/** Second-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi2cdOrderACN = kAmbi1stOrderACN | kSpeakerACN4 | kSpeakerACN5 | kSpeakerACN6 | kSpeakerACN7 | kSpeakerACN8;\r
-/** Third-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */\r
-const SpeakerArrangement kAmbi3rdOrderACN = kAmbi2cdOrderACN | kSpeakerACN9 | kSpeakerACN10 | kSpeakerACN11 | kSpeakerACN12 | kSpeakerACN13 | kSpeakerACN14 | kSpeakerACN15;\r
-\r
-\r
-/*-----------*/\r
-/* 3D formats */\r
-/*-----------*/\r
-/** L R Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k80Cube = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerTfl| kSpeakerTfr| kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Cs Tc */\r
-const SpeakerArrangement k71CineTopCenter = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerTc;\r
-/** L R C Lfe Ls Rs Cs Tfc */\r
-const SpeakerArrangement k71CineCenterHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerTfc;\r
-/** L R C Lfe Ls Rs Tfl Tfr */\r
-const SpeakerArrangement k71CineFrontHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTfl | kSpeakerTfr;\r
-const SpeakerArrangement k71MPEG3D = k71CineFrontHigh;\r
-/** L R C Lfe Ls Rs Tsl Tsr */\r
-const SpeakerArrangement k71CineSideHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTsl | kSpeakerTsr;\r
-\r
-/** L R Lfe Ls Rs Tfl Tfc Tfr Bfc */\r
-const SpeakerArrangement k81MPEG3D = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerBfc;\r
-\r
-/** L R C Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k90 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTfl| kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k50_4 = k90;\r
-/** L R C Lfe Ls Rs Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k91 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTfl| kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k51_4 = k91;\r
-\r
-/** L R C Lfe Ls Rs Sl Sr Tsl Tsr */\r
-const SpeakerArrangement k71_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs |\r
- kSpeakerRs | kSpeakerSl | kSpeakerSr | kSpeakerTsl | kSpeakerTsr;\r
-const SpeakerArrangement k91Atmos = k71_2;\r
-\r
-/** L R C Ls Rs Tc Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k100 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Tc Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k101 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k101MPEG3D = k101;\r
-\r
-/** L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Lfe2 */\r
-const SpeakerArrangement k102 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2;\r
-\r
-/** L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k110 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k111 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k70_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trl Trr */\r
-const SpeakerArrangement k71_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-const SpeakerArrangement k111MPEG3D = k71_4;\r
-\r
-/** L R C Lfe Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr Lfe2 */\r
-const SpeakerArrangement k122 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc |\r
- kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2;\r
-/** L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k130 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-/** L R C Lfe Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */\r
-const SpeakerArrangement k131 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr;\r
-\r
-/** L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr */\r
-const SpeakerArrangement k140 = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr |\r
- kSpeakerBfl | kSpeakerBfr | kSpeakerBrl | kSpeakerBrr;\r
-\r
-/** L R C Lfe Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr Lfe2 Tsl Tsr Bfl Bfc Bfr */\r
-const SpeakerArrangement k222 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs | kSpeakerSl | kSpeakerSr |\r
- kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrc | kSpeakerTrr | kSpeakerLfe2 | kSpeakerTsl | kSpeakerTsr |\r
- kSpeakerBfl| kSpeakerBfc | kSpeakerBfr;\r
-\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement String Representation.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const CString kStringEmpty = "";\r
-const CString kStringMono = "Mono";\r
-const CString kStringStereo = "Stereo";\r
-const CString kStringStereoR = "Stereo (Ls Rs)";\r
-const CString kStringStereoC = "Stereo (Lc Rc)";\r
-const CString kStringStereoSide = "Stereo (Sl Sr)";\r
-const CString kStringStereoCLfe = "Stereo (C LFE)";\r
-const CString kStringStereoTF = "Stereo (Tfl Tfr)";\r
-const CString kStringStereoTS = "Stereo (Tsl Tsr)";\r
-const CString kStringStereoTR = "Stereo (Trl Trr)";\r
-const CString kStringStereoBF = "Stereo (Bfl Bfr)";\r
-\r
-const CString kString30Cine = "LRC";\r
-const CString kString30Music = "LRS";\r
-const CString kString31Cine = "LRC+LFE";\r
-const CString kString31Music = "LRS+LFE";\r
-const CString kString40Cine = "LRCS";\r
-const CString kString40Music = "Quadro";\r
-const CString kString41Cine = "LRCS+LFE";\r
-const CString kString41Music = "Quadro+LFE";\r
-const CString kString50 = "5.0";\r
-const CString kString51 = "5.1";\r
-const CString kString60Cine = "6.0 Cine";\r
-const CString kString60Music = "6.0 Music";\r
-const CString kString61Cine = "6.1 Cine";\r
-const CString kString61Music = "6.1 Music";\r
-const CString kString70Cine = "7.0 Cine (SDDS)";\r
-const CString kString70Music = "7.0 Music (Dolby)";\r
-const CString kString71Cine = "7.1 Cine (SDDS)";\r
-const CString kString71Music = "7.1 Music (Dolby)";\r
-const CString kString71CineTopCenter = "7.1 Cine Top Center";\r
-const CString kString71CineCenterHigh = "7.1 Cine Center High";\r
-const CString kString71CineFrontHigh = "7.1 Cine Front High";\r
-const CString kString71CineSideHigh = "7.1 Cine Side High";\r
-const CString kString71CineFullRear = "7.1 Cine Full Rear";\r
-const CString kString71Proximity = "7.1 Proximity";\r
-const CString kString80Cine = "8.0 Cine";\r
-const CString kString80Music = "8.0 Music";\r
-const CString kString80Cube = "8.0 Cube";\r
-const CString kString81Cine = "8.1 Cine";\r
-const CString kString81Music = "8.1 Music";\r
-const CString kString102 = "10.2 Experimental";\r
-const CString kString122 = "12.2";\r
-const CString kString50_4 = "5.0.4";\r
-const CString kString51_4 = "5.1.4";\r
-const CString kString91Atmos = "9.1 Dolby Atmos";\r
-const CString kString100 = "10.0 Auro-3D";\r
-const CString kString101 = "10.1 Auro-3D";\r
-const CString kString110 = "11.0 Auro-3D";\r
-const CString kString111 = "11.1 Auro-3D";\r
-const CString kString130 = "13.0 Auro-3D";\r
-const CString kString131 = "13.1 Auro-3D";\r
-const CString kString81MPEG = "8.1 MPEG";\r
-const CString kString70_4 = "7.0.4";\r
-const CString kString71_4 = "7.1.4";\r
-const CString kString140 = "14.0";\r
-const CString kString222 = "22.2";\r
-const CString kStringAmbi1stOrder = "Ambi 1st-Order";\r
-const CString kStringAmbi2cdOrder = "Ambi 2cd-Order";\r
-const CString kStringAmbi3rdOrder = "Ambi 3rd-Order";\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Speaker Arrangement String Representation with Speakers Name.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-const CString kStringMonoS = "M";\r
-const CString kStringStereoS = "L R";\r
-const CString kStringStereoRS = "Ls Rs";\r
-const CString kStringStereoCS = "Lc Rc";\r
-const CString kStringStereoSS = "Sl Sr";\r
-const CString kStringStereoCLfeS= "C LFE";\r
-const CString kStringStereoTFS = "Tfl Tfr";\r
-const CString kStringStereoTSS = "Tsl Tsr";\r
-const CString kStringStereoTRS = "Trl Trr";\r
-const CString kStringStereoBFS = "Bfl Bfr";\r
-const CString kString30CineS = "L R C";\r
-const CString kString30MusicS = "L R S";\r
-const CString kString31CineS = "L R C LFE";\r
-const CString kString31MusicS = "L R LFE S";\r
-const CString kString40CineS = "L R C S";\r
-const CString kString40MusicS = "L R Ls Rs";\r
-const CString kString41CineS = "L R C LFE S";\r
-const CString kString41MusicS = "L R LFE Ls Rs";\r
-const CString kString50S = "L R C Ls Rs";\r
-const CString kString51S = "L R C LFE Ls Rs";\r
-const CString kString60CineS = "L R C Ls Rs Cs";\r
-const CString kString60MusicS = "L R Ls Rs Sl Sr";\r
-const CString kString61CineS = "L R C LFE Ls Rs Cs";\r
-const CString kString61MusicS = "L R LFE Ls Rs Sl Sr";\r
-const CString kString70CineS = "L R C Ls Rs Lc Rc";\r
-const CString kString70MusicS = "L R C Ls Rs Sl Sr";\r
-const CString kString71CineS = "L R C LFE Ls Rs Lc Rc";\r
-const CString kString71MusicS = "L R C LFE Ls Rs Sl Sr";\r
-const CString kString80CineS = "L R C Ls Rs Lc Rc Cs";\r
-const CString kString80MusicS = "L R C Ls Rs Cs Sl Sr";\r
-const CString kString81CineS = "L R C LFE Ls Rs Lc Rc Cs";\r
-const CString kString81MusicS = "L R C LFE Ls Rs Cs Sl Sr";\r
-const CString kString80CubeS = "L R Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString71CineTopCenterS = "L R C LFE Ls Rs Cs Tc";\r
-const CString kString71CineCenterHighS = "L R C LFE Ls Rs Cs Tfc";\r
-const CString kString71CineFrontHighS = "L R C LFE Ls Rs Tfl Tfl";\r
-const CString kString71CineSideHighS = "L R C LFE Ls Rs Tsl Tsl";\r
-const CString kString71CineFullRearS = "L R C LFE Ls Rs Lcs Rcs";\r
-const CString kString71ProximityS = "L R C LFE Ls Rs Pl Pr";\r
-const CString kString50_4S = "L R C Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString51_4S = "L R C LFE Ls Rs Tfl Tfr Trl Trr";\r
-const CString kString91AtmosS = "L R C LFE Ls Rs Sl Sr Tsl Tsr";\r
-const CString kString100S = "L R C Ls Rs Tc Tfl Tfr Trl Trr";\r
-const CString kString101S = "L R C LFE Ls Rs Tc Tfl Tfr Trl Trr";\r
-const CString kString110S = "L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString111S = "L R C LFE Ls Rs Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kStringk70_4S = "L R C Ls Rs Sl Sr Tfl Tfr Trl Trr";\r
-const CString kStringk71_4S = "L R C LFE Ls Rs Sl Sr Tfl Tfr Trl Trr";\r
-const CString kString130S = "L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString131S = "L R C LFE Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr";\r
-const CString kString102S = "L R C LFE Ls Rs Tfl Tfc Tfr Trl Trr LFE2";\r
-const CString kString122S = "L R C LFE Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr LFE2";\r
-const CString kString81MPEGS = "L R LFE Ls Rs Tfl Tfc Tfr Bfc";\r
-const CString kString140S = "L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr";\r
-const CString kString222S = "L R C LFE Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr LFE2 Tsl Tsr Bfl Bfc Bfr";\r
-\r
-const CString kStringAmbi1stOrderS = "0 1 2 3";\r
-const CString kStringAmbi2cdOrderS = "0 1 2 3 4 5 6 7 8";\r
-const CString kStringAmbi3rdOrderS = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns number of channels used in speaker arrangement.\r
-\ingroup speakerArrangements */\r
-/*@{*/\r
-inline int32 getChannelCount (SpeakerArrangement arr)\r
-{\r
- int32 count = 0;\r
- while (arr)\r
- {\r
- if (arr & (SpeakerArrangement)1)\r
- ++count;\r
- arr >>= 1;\r
- }\r
- return count;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the index of a given speaker in a speaker arrangement (-1 if speaker is not part of the arrangement). */\r
-inline int32 getSpeakerIndex (Speaker speaker, SpeakerArrangement arrangement)\r
-{\r
- // check if speaker is present in arrangement\r
- if ((arrangement & speaker) == 0)\r
- return -1;\r
-\r
- int32 result = 0;\r
- Speaker i = 1;\r
- while (i < speaker)\r
- {\r
- if (arrangement & i)\r
- result++;\r
- i <<= 1;\r
- }\r
-\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the speaker for a given index in a speaker arrangement (return 0 when out of range). */\r
-inline Speaker getSpeaker (const SpeakerArrangement& arr, int32 index)\r
-{\r
- SpeakerArrangement arrTmp = arr;\r
-\r
- int32 index2 = -1;\r
- int32 pos = -1;\r
- while (arrTmp)\r
- {\r
- if (arrTmp & 0x1)\r
- index2++;\r
- pos++;\r
- if (index2 == index)\r
- return (Speaker)1 << pos;\r
-\r
- arrTmp = arrTmp >> 1;\r
- }\r
- return 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns true if arrSubSet is a subset speaker of arr (means each speaker of arrSubSet is included in arr). */\r
-inline bool isSubsetOf (const SpeakerArrangement& arrSubSet, const SpeakerArrangement& arr)\r
-{\r
- return (arrSubSet == (arrSubSet & arr));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns true if arrangement is a Auro configuration. */\r
-inline bool isAuro (const SpeakerArrangement& arr)\r
-{\r
- if (arr == k90 || arr == k91 || arr == k100 || arr == k101 || arr == k110 || arr == k111 ||\r
- arr == k130 || arr == k131)\r
- {\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the speaker arrangement associated to a string representation.\r
- Returns kEmpty if no associated arrangement is known.\r
-*/\r
-inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr)\r
-{\r
- if (!strcmp8 (arrStr, kStringMono))\r
- return kMono;\r
- if (!strcmp8 (arrStr, kStringStereo))\r
- return kStereo;\r
- if (!strcmp8 (arrStr, kStringStereoR))\r
- return kStereoSurround;\r
- if (!strcmp8 (arrStr, kStringStereoC))\r
- return kStereoCenter;\r
- if (!strcmp8 (arrStr, kStringStereoSide))\r
- return kStereoSide;\r
- if (!strcmp8 (arrStr, kStringStereoCLfe))\r
- return kStereoCLfe;\r
- if (!strcmp8 (arrStr, kStringStereoTF))\r
- return kStereoTF;\r
- if (!strcmp8 (arrStr, kStringStereoTS))\r
- return kStereoTS;\r
- if (!strcmp8 (arrStr, kStringStereoTR))\r
- return kStereoTR;\r
- if (!strcmp8 (arrStr, kStringStereoBF))\r
- return kStereoBF;\r
- if (!strcmp8 (arrStr, kString30Cine))\r
- return k30Cine;\r
- if (!strcmp8 (arrStr, kString30Music))\r
- return k30Music;\r
- if (!strcmp8 (arrStr, kString31Cine))\r
- return k31Cine;\r
- if (!strcmp8 (arrStr, kString31Music))\r
- return k31Music;\r
- if (!strcmp8 (arrStr, kString40Cine))\r
- return k40Cine;\r
- if (!strcmp8 (arrStr, kString40Music))\r
- return k40Music;\r
- if (!strcmp8 (arrStr, kString41Cine))\r
- return k41Cine;\r
- if (!strcmp8 (arrStr, kString41Music))\r
- return k41Music;\r
- if (!strcmp8 (arrStr, kString50))\r
- return k50;\r
- if (!strcmp8 (arrStr, kString51))\r
- return k51;\r
- if (!strcmp8 (arrStr, kString60Cine))\r
- return k60Cine;\r
- if (!strcmp8 (arrStr, kString60Music))\r
- return k60Music;\r
- if (!strcmp8 (arrStr, kString61Cine))\r
- return k61Cine;\r
- if (!strcmp8 (arrStr, kString61Music))\r
- return k61Music;\r
- if (!strcmp8 (arrStr, kString70Cine))\r
- return k70Cine;\r
- if (!strcmp8 (arrStr, kString70Music))\r
- return k70Music;\r
- if (!strcmp8 (arrStr, kString71Cine))\r
- return k71Cine;\r
- if (!strcmp8 (arrStr, kString71Music))\r
- return k71Music;\r
- if (!strcmp8 (arrStr, kString71Proximity))\r
- return k71Proximity;\r
- if (!strcmp8 (arrStr, kString80Cine))\r
- return k80Cine;\r
- if (!strcmp8 (arrStr, kString80Music))\r
- return k80Music;\r
- if (!strcmp8 (arrStr, kString81Cine))\r
- return k81Cine;\r
- if (!strcmp8 (arrStr, kString81Music))\r
- return k81Music;\r
- if (!strcmp8 (arrStr, kString102))\r
- return k102;\r
- if (!strcmp8 (arrStr, kString122))\r
- return k122;\r
- if (!strcmp8 (arrStr, kString80Cube))\r
- return k80Cube;\r
- if (!strcmp8 (arrStr, kString71CineTopCenter))\r
- return k71CineTopCenter;\r
- if (!strcmp8 (arrStr, kString71CineCenterHigh))\r
- return k71CineCenterHigh;\r
- if (!strcmp8 (arrStr, kString71CineFrontHigh))\r
- return k71CineFrontHigh;\r
- if (!strcmp8 (arrStr, kString71CineSideHigh))\r
- return k71CineSideHigh;\r
- if (!strcmp8 (arrStr, kString71CineFullRear))\r
- return k71CineFullRear;\r
- if (!strcmp8 (arrStr, kString50_4))\r
- return k50_4;\r
- if (!strcmp8 (arrStr, kString51_4))\r
- return k51_4;\r
- if (!strcmp8 (arrStr, kString81MPEG))\r
- return k81MPEG3D;\r
- if (!strcmp8 (arrStr, kString91Atmos))\r
- return k91Atmos;\r
- if (!strcmp8 (arrStr, kString100))\r
- return k100;\r
- if (!strcmp8 (arrStr, kString101))\r
- return k101;\r
- if (!strcmp8 (arrStr, kString110))\r
- return k110;\r
- if (!strcmp8 (arrStr, kString111))\r
- return k111;\r
- if (!strcmp8 (arrStr, kString70_4))\r
- return k70_4;\r
- if (!strcmp8 (arrStr, kString71_4))\r
- return k71_4;\r
- if (!strcmp8 (arrStr, kString130))\r
- return k130;\r
- if (!strcmp8 (arrStr, kString131))\r
- return k131;\r
- if (!strcmp8 (arrStr, kString140))\r
- return k140;\r
- if (!strcmp8 (arrStr, kString222))\r
- return k222;\r
- if (!strcmp8 (arrStr, kStringAmbi1stOrder))\r
- return kAmbi1stOrderACN;\r
- if (!strcmp8 (arrStr, kStringAmbi2cdOrder))\r
- return kAmbi2cdOrderACN;\r
- if (!strcmp8 (arrStr, kStringAmbi3rdOrder))\r
- return kAmbi3rdOrderACN;\r
- return kEmpty;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns the string representation of a given speaker arrangement.\r
- Returns kStringEmpty if arr is unknown.\r
-*/\r
-inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpeakersName)\r
-{\r
- switch (arr)\r
- {\r
- case kMono: return withSpeakersName ? kStringMonoS : kStringMono;\r
- case kStereo: return withSpeakersName ? kStringStereoS : kStringStereo;\r
- case kStereoSurround: return withSpeakersName ? kStringStereoRS : kStringStereoR;\r
- case kStereoCenter: return withSpeakersName ? kStringStereoCS : kStringStereoC;\r
- case kStereoSide: return withSpeakersName ? kStringStereoSS : kStringStereoSide;\r
- case kStereoCLfe: return withSpeakersName ? kStringStereoCLfeS: kStringStereoCLfe;\r
- case kStereoTF: return withSpeakersName ? kStringStereoTFS : kStringStereoTF;\r
- case kStereoTS: return withSpeakersName ? kStringStereoTSS : kStringStereoTS;\r
- case kStereoTR: return withSpeakersName ? kStringStereoTRS : kStringStereoTR;\r
- case kStereoBF: return withSpeakersName ? kStringStereoBFS : kStringStereoBF;\r
- case k30Cine: return withSpeakersName ? kString30CineS : kString30Cine;\r
- case k30Music: return withSpeakersName ? kString30MusicS : kString30Music;\r
- case k31Cine: return withSpeakersName ? kString31CineS : kString31Cine;\r
- case k31Music: return withSpeakersName ? kString31MusicS : kString31Music;\r
- case k40Cine: return withSpeakersName ? kString40CineS : kString40Cine;\r
- case k40Music: return withSpeakersName ? kString40MusicS : kString40Music;\r
- case k41Cine: return withSpeakersName ? kString41CineS : kString41Cine;\r
- case k41Music: return withSpeakersName ? kString41MusicS : kString41Music;\r
- case k50: return withSpeakersName ? kString50S : kString50;\r
- case k51: return withSpeakersName ? kString51S : kString51;\r
- case k60Cine: return withSpeakersName ? kString60CineS : kString60Cine;\r
- case k60Music: return withSpeakersName ? kString60MusicS : kString60Music;\r
- case k61Cine: return withSpeakersName ? kString61CineS : kString61Cine;\r
- case k61Music: return withSpeakersName ? kString61MusicS : kString61Music;\r
- case k70Cine: return withSpeakersName ? kString70CineS : kString70Cine;\r
- case k70Music: return withSpeakersName ? kString70MusicS : kString70Music;\r
- case k71Cine: return withSpeakersName ? kString71CineS : kString71Cine;\r
- case k71Music: return withSpeakersName ? kString71MusicS : kString71Music;\r
- case k71Proximity: return withSpeakersName ? kString71ProximityS : kString71Proximity;\r
- case k80Cine: return withSpeakersName ? kString80CineS : kString80Cine;\r
- case k80Music: return withSpeakersName ? kString80MusicS : kString80Music;\r
- case k81Cine: return withSpeakersName ? kString81CineS : kString81Cine;\r
- case k81Music: return withSpeakersName ? kString81MusicS : kString81Music;\r
- case k81MPEG3D: return withSpeakersName ? kString81MPEGS : kString81MPEG;\r
- case k102: return withSpeakersName ? kString102S : kString102;\r
- case k122: return withSpeakersName ? kString122S : kString122;\r
- case k80Cube: return withSpeakersName ? kString80CubeS : kString80Cube;\r
- case k71CineTopCenter: return withSpeakersName ? kString71CineTopCenterS : kString71CineTopCenter;\r
- case k71CineCenterHigh: return withSpeakersName ? kString71CineCenterHighS : kString71CineCenterHigh;\r
- case k71CineFrontHigh: return withSpeakersName ? kString71CineFrontHighS : kString71CineFrontHigh;\r
- case k71CineSideHigh: return withSpeakersName ? kString71CineSideHighS : kString71CineSideHigh;\r
- case k71CineFullRear: return withSpeakersName ? kString71CineFullRearS : kString71CineFullRear;\r
- case k91Atmos: return withSpeakersName ? kString91AtmosS : kString91Atmos;\r
- case k100: return withSpeakersName ? kString100S : kString100;\r
- case k101: return withSpeakersName ? kString101S : kString101;\r
- case k110: return withSpeakersName ? kString110S : kString110;\r
- case k111: return withSpeakersName ? kString111S : kString111;\r
-\r
- case k50_4: return withSpeakersName ? kString50_4S : kString50_4;\r
- case k51_4: return withSpeakersName ? kString51_4S : kString51_4;\r
- case k70_4: return withSpeakersName ? kStringk70_4S : kString70_4;\r
- case k71_4: return withSpeakersName ? kStringk71_4S : kString71_4;\r
-\r
- case k130: return withSpeakersName ? kString130S : kString130;\r
- case k131: return withSpeakersName ? kString131S : kString131;\r
- case k140: return withSpeakersName ? kString140S : kString140;\r
- case k222: return withSpeakersName ? kString222S : kString222;\r
- break;\r
- }\r
-\r
- if (arr == kAmbi1stOrderACN)\r
- return withSpeakersName ? kStringAmbi1stOrderS : kStringAmbi1stOrder;\r
- if (arr == kAmbi2cdOrderACN)\r
- return withSpeakersName ? kStringAmbi2cdOrderS : kStringAmbi2cdOrder;\r
- if (arr == kAmbi3rdOrderACN)\r
- return withSpeakersName ? kStringAmbi3rdOrderS : kStringAmbi3rdOrder;\r
-\r
- return kStringEmpty;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Returns a CString representation of a given speaker in a given arrangement\r
-*/\r
-inline CString getSpeakerShortName (const SpeakerArrangement& arr, int32 index)\r
-{\r
- SpeakerArrangement arrTmp = arr;\r
-\r
- bool found = false;\r
- int32 index2 = -1;\r
- int32 pos = -1;\r
- while (arrTmp)\r
- {\r
- if (arrTmp & 0x1)\r
- index2++;\r
- pos++;\r
- if (index2 == index)\r
- {\r
- found = true;\r
- break;\r
- }\r
- arrTmp = arrTmp >> 1;\r
- }\r
-\r
- if (!found)\r
- return "";\r
-\r
- Speaker speaker = (Speaker)1 << pos;\r
- if (speaker == kSpeakerL)\r
- return "L";\r
- if (speaker == kSpeakerR)\r
- return "R";\r
- if (speaker == kSpeakerC)\r
- return "C";\r
- if (speaker == kSpeakerLfe)\r
- return "LFE";\r
- if (speaker == kSpeakerLs)\r
- return "Ls";\r
- if (speaker == kSpeakerRs)\r
- return "Rs";\r
- if (speaker == kSpeakerLc)\r
- return "Lc";\r
- if (speaker == kSpeakerRc)\r
- return "Rc";\r
- if (speaker == kSpeakerS)\r
- return "S";\r
- if (speaker == kSpeakerSl)\r
- return "Sl";\r
- if (speaker == kSpeakerSr)\r
- return "Sr";\r
- if (speaker == kSpeakerTc)\r
- return "Tc";\r
- if (speaker == kSpeakerTfl)\r
- return "Tfl";\r
- if (speaker == kSpeakerTfc)\r
- return "Tfc";\r
- if (speaker == kSpeakerTfr)\r
- return "Tfr";\r
- if (speaker == kSpeakerTrl)\r
- return "Trl";\r
- if (speaker == kSpeakerTrc)\r
- return "Trc";\r
- if (speaker == kSpeakerTrr)\r
- return "Trr";\r
- if (speaker == kSpeakerLfe2)\r
- return "LFE2";\r
- if (speaker == kSpeakerM)\r
- return "M";\r
-\r
- if (speaker == kSpeakerACN0)\r
- return "0";\r
- if (speaker == kSpeakerACN1)\r
- return "1";\r
- if (speaker == kSpeakerACN2)\r
- return "2";\r
- if (speaker == kSpeakerACN3)\r
- return "3";\r
- if (speaker == kSpeakerACN4)\r
- return "4";\r
- if (speaker == kSpeakerACN5)\r
- return "5";\r
- if (speaker == kSpeakerACN6)\r
- return "6";\r
- if (speaker == kSpeakerACN7)\r
- return "7";\r
- if (speaker == kSpeakerACN8)\r
- return "8";\r
- if (speaker == kSpeakerACN9)\r
- return "9";\r
- if (speaker == kSpeakerACN10)\r
- return "10";\r
- if (speaker == kSpeakerACN11)\r
- return "11";\r
- if (speaker == kSpeakerACN12)\r
- return "12";\r
- if (speaker == kSpeakerACN13)\r
- return "13";\r
- if (speaker == kSpeakerACN14)\r
- return "14";\r
- if (speaker == kSpeakerACN15)\r
- return "15";\r
-\r
- if (speaker == kSpeakerTsl)\r
- return "Tsl";\r
- if (speaker == kSpeakerTsr)\r
- return "Tsr";\r
- if (speaker == kSpeakerLcs)\r
- return "Lcs";\r
- if (speaker == kSpeakerRcs)\r
- return "Rcs";\r
-\r
- if (speaker == kSpeakerBfl)\r
- return "Bfl";\r
- if (speaker == kSpeakerBfc)\r
- return "Bfc";\r
- if (speaker == kSpeakerBfr)\r
- return "Bfr";\r
- if (speaker == kSpeakerPl)\r
- return "Pl";\r
- if (speaker == kSpeakerPr)\r
- return "Pr";\r
- if (speaker == kSpeakerBsl)\r
- return "Bsl";\r
- if (speaker == kSpeakerBsr)\r
- return "Bsr";\r
- if (speaker == kSpeakerBrl)\r
- return "Brl";\r
- if (speaker == kSpeakerBrc)\r
- return "Brc";\r
- if (speaker == kSpeakerBrr)\r
- return "Brr";\r
-\r
- return "";\r
-}\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace SpeakerArr\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Interfaces\r
-// Filename : pluginterfaces/vst/vsttypes.h\r
-// Created by : Steinberg, 12/2005\r
-// Description : common defines\r
-//\r
-//-----------------------------------------------------------------------------\r
-// This file is part of a Steinberg SDK. It is subject to the license terms\r
-// in the LICENSE file found in the top-level directory of this distribution\r
-// and at www.steinberg.net/sdklicenses.\r
-// No part of the SDK, including this file, may be copied, modified, propagated,\r
-// or distributed except according to the terms contained in the LICENSE file.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/fstrdefs.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-//------------------------------------------------------------------------\r
-#ifndef kVstVersionString\r
-#define kVstVersionString "VST 3.6.9" ///< SDK version for PClassInfo2\r
-#endif\r
-\r
-#define kVstVersionMajor 3\r
-#define kVstVersionMinor 6\r
-#define kVstVersionSub 9\r
-\r
-// this allows to write things like: #if VST_VERSION >= 0x030500 // note that 3.10.0 is 0x030a00\r
-#define VST_VERSION ((kVstVersionMajor << 16) | (kVstVersionMinor << 8) | kVstVersionSub)\r
-\r
-//------------------------------------------------------------------------\r
-// struct alignment definitions\r
-//------------------------------------------------------------------------\r
-#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))\r
- #define VST3_STRUCT struct __attribute__((aligned(4)))\r
-#elif SMTG_OS_WINDOWS\r
- #if SMTG_PLATFORM_64\r
- #define VST3_PACKED_SIZE 8\r
- #else\r
- #define VST3_PACKED_SIZE 4\r
- #endif\r
- #define VST3_STRUCT __declspec(align(VST3_PACKED_SIZE)) struct\r
-#else\r
- #error "unsupported compiler"\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-/** \defgroup vst3typedef VST 3 Data Types\r
-*/\r
-/*@{*/\r
-//------------------------------------------------------------------------\r
-// String Types\r
-//------------------------------------------------------------------------\r
-typedef char16 TChar; ///< UTF-16 character\r
-typedef TChar String128[128]; ///< 128 character UTF-16 string\r
-typedef const char8* CString; ///< C-String\r
-\r
-//------------------------------------------------------------------------\r
-// General\r
-//------------------------------------------------------------------------\r
-typedef int32 MediaType; ///< media type (audio/event)\r
-typedef int32 BusDirection; ///< bus direction (in/out)\r
-typedef int32 BusType; ///< bus type (main/aux)\r
-typedef int32 IoMode; ///< I/O mode (see \ref vst3IoMode)\r
-typedef int32 UnitID; ///< unit identifier\r
-typedef double ParamValue; ///< parameter value type\r
-typedef uint32 ParamID; ///< parameter identifier\r
-typedef int32 ProgramListID; ///< program list identifier\r
-typedef int16 CtrlNumber; ///< MIDI controller number (see \ref ControllerNumbers for allowed values)\r
-\r
-typedef double TQuarterNotes; ///< time expressed in quarter notes\r
-typedef int64 TSamples; ///< time expressed in audio samples\r
-\r
-typedef uint32 ColorSpec; ///< color defining by 4 component ARGB value (Alpha/Red/Green/Blue)\r
-\r
-//------------------------------------------------------------------------\r
-static const ParamID kNoParamId = 0xffffffff; ///< default for uninitialized parameter ID\r
-// static const ParamID kNoParamId = std::numeric_limits<ParamID>::max ();\r
-\r
-//------------------------------------------------------------------------\r
-// Audio Types\r
-//------------------------------------------------------------------------\r
-typedef float Sample32; ///< 32-bit precision audio sample\r
-typedef double Sample64; ///< 64-bit precision audio sample\r
-typedef double SampleRate; ///< sample rate\r
-\r
-//------------------------------------------------------------------------\r
-// Speaker Arrangements Types\r
-//------------------------------------------------------------------------\r
-typedef uint64 SpeakerArrangement; ///< Bitset of speakers\r
-typedef uint64 Speaker; ///< Bit for one speaker\r
-\r
-/*@}*/\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-// \r
-// * Redistributions of source code must retain the above copyright notice, \r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation \r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this \r
-// software without specific prior written permission.\r
-// \r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Common Classes\r
-// Filename : public.sdk/source/common/memorystream.cpp\r
-// Created by : Steinberg, 03/2008\r
-// Description : IBStream Implementation for memory blocks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "memorystream.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include <stdlib.h>\r
-\r
-namespace Steinberg {\r
-\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (MemoryStream, IBStream, IBStream::iid)\r
-static const TSize kMemGrowAmount = 4096;\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::MemoryStream (void* data, TSize length)\r
-: memory ((char*)data)\r
-, memorySize (length)\r
-, size (length)\r
-, cursor (0)\r
-, ownMemory (false)\r
-, allocationError (false)\r
-{\r
- FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::MemoryStream ()\r
-: memory (nullptr)\r
-, memorySize (0)\r
-, size (0)\r
-, cursor (0)\r
-, ownMemory (true)\r
-, allocationError (false)\r
-{\r
- FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-MemoryStream::~MemoryStream ()\r
-{\r
- if (ownMemory && memory)\r
- ::free (memory);\r
-\r
- FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::read (void* data, int32 numBytes, int32* numBytesRead)\r
-{\r
- if (memory == nullptr)\r
- {\r
- if (allocationError)\r
- return kOutOfMemory;\r
- numBytes = 0;\r
- }\r
- else\r
- {\r
- // Does read exceed size ?\r
- if (cursor + numBytes > size)\r
- {\r
- int32 maxBytes = int32 (size - cursor);\r
-\r
- // Has length become zero or negative ?\r
- if (maxBytes <= 0)\r
- {\r
- cursor = size;\r
- numBytes = 0;\r
- }\r
- else\r
- numBytes = maxBytes;\r
- }\r
-\r
- if (numBytes)\r
- {\r
- memcpy (data, &memory[cursor], numBytes);\r
- cursor += numBytes;\r
- }\r
- }\r
-\r
- if (numBytesRead)\r
- *numBytesRead = numBytes;\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
- if (allocationError)\r
- return kOutOfMemory;\r
- if (buffer == nullptr)\r
- return kInvalidArgument;\r
-\r
- // Does write exceed size ?\r
- TSize requiredSize = cursor + numBytes;\r
- if (requiredSize > size)\r
- {\r
- if (requiredSize > memorySize)\r
- setSize (requiredSize);\r
- else\r
- size = requiredSize;\r
- }\r
-\r
- // Copy data\r
- if (memory && cursor >= 0 && numBytes > 0)\r
- {\r
- memcpy (&memory[cursor], buffer, numBytes);\r
- // Update cursor\r
- cursor += numBytes;\r
- }\r
- else\r
- numBytes = 0;\r
-\r
- if (numBytesWritten)\r
- *numBytesWritten = numBytes;\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
- switch (mode)\r
- {\r
- case kIBSeekSet:\r
- cursor = pos;\r
- break;\r
- case kIBSeekCur:\r
- cursor = cursor + pos;\r
- break;\r
- case kIBSeekEnd:\r
- cursor = size + pos;\r
- break;\r
- }\r
-\r
- if (ownMemory == false)\r
- if (cursor > memorySize)\r
- cursor = memorySize;\r
-\r
- if (result)\r
- *result = cursor;\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API MemoryStream::tell (int64* pos)\r
-{\r
- if (!pos)\r
- return kInvalidArgument;\r
-\r
- *pos = cursor;\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-TSize MemoryStream::getSize ()\r
-{\r
- return size;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void MemoryStream::setSize (TSize s)\r
-{\r
- if (s <= 0)\r
- {\r
- if (ownMemory && memory)\r
- free (memory);\r
-\r
- memory = nullptr;\r
- memorySize = 0;\r
- size = 0;\r
- cursor = 0;\r
- return;\r
- }\r
-\r
- TSize newMemorySize = (((Max (memorySize, s) - 1) / kMemGrowAmount) + 1) * kMemGrowAmount;\r
- if (newMemorySize == memorySize)\r
- {\r
- size = s;\r
- return;\r
- }\r
-\r
- if (memory && ownMemory == false)\r
- {\r
- allocationError = true;\r
- return;\r
- }\r
-\r
- ownMemory = true;\r
- char* newMemory = nullptr;\r
-\r
- if (memory)\r
- {\r
- newMemory = (char*)realloc (memory, (size_t)newMemorySize);\r
- if (newMemory == nullptr && newMemorySize > 0)\r
- {\r
- newMemory = (char*)malloc ((size_t)newMemorySize);\r
- if (newMemory)\r
- {\r
- memcpy (newMemory, memory, (size_t)Min (newMemorySize, memorySize));\r
- free (memory);\r
- }\r
- }\r
- }\r
- else\r
- newMemory = (char*)malloc ((size_t)newMemorySize);\r
-\r
- if (newMemory == nullptr)\r
- {\r
- if (newMemorySize > 0)\r
- allocationError = true;\r
-\r
- memory = nullptr;\r
- memorySize = 0;\r
- size = 0;\r
- cursor = 0;\r
- }\r
- else\r
- {\r
- memory = newMemory;\r
- memorySize = newMemorySize;\r
- size = s;\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char* MemoryStream::getData ()\r
-{\r
- return memory;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-char* MemoryStream::detachData ()\r
-{\r
- if (ownMemory)\r
- {\r
- char* result = memory;\r
- memory = nullptr;\r
- memorySize = 0;\r
- size = 0;\r
- cursor = 0;\r
- return result;\r
- }\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool MemoryStream::truncate ()\r
-{\r
- if (ownMemory == false)\r
- return false;\r
-\r
- if (memorySize == size)\r
- return true;\r
-\r
- memorySize = size;\r
-\r
- if (memorySize == 0)\r
- {\r
- if (memory)\r
- {\r
- free (memory);\r
- memory = nullptr;\r
- }\r
- }\r
- else\r
- {\r
- if (memory)\r
- {\r
- char* newMemory = (char*)realloc (memory, (size_t)memorySize);\r
- if (newMemory)\r
- memory = newMemory;\r
- }\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool MemoryStream::truncateToCursor ()\r
-{\r
- size = cursor;\r
- return truncate ();\r
-}\r
-\r
-} // namespace\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Common Classes\r
-// Filename : public.sdk/source/common/memorystream.h\r
-// Created by : Steinberg, 03/2008\r
-// Description : IBStream Implementation for memory blocks\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ibstream.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Memory based Stream for IBStream implementation (using malloc).\r
-\ingroup sdkBase\r
-*/\r
-//------------------------------------------------------------------------\r
-class MemoryStream : public IBStream\r
-{\r
-public:\r
- //------------------------------------------------------------------------\r
- MemoryStream ();\r
- MemoryStream (void* memory, TSize memorySize); ///< reuse a given memory without getting ownership\r
- virtual ~MemoryStream ();\r
-\r
- //---IBStream---------------------------------------\r
- virtual tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead) SMTG_OVERRIDE;\r
- virtual tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten) SMTG_OVERRIDE;\r
- virtual tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result) SMTG_OVERRIDE;\r
- virtual tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
- TSize getSize (); ///< returns the current memory size\r
- void setSize (TSize size); ///< set the memory size, a realloc will occur if memory already used\r
- char* getData (); ///< returns the memory pointer\r
- char* detachData (); ///< returns the memory pointer and give up ownership\r
- bool truncate (); ///< realloc to the current use memory size if needed\r
- bool truncateToCursor (); ///< truncate memory at current cursor position\r
-\r
- //------------------------------------------------------------------------\r
- DECLARE_FUNKNOWN_METHODS\r
-protected:\r
- char* memory; // memory block\r
- TSize memorySize; // size of the memory block\r
- TSize size; // size of the stream\r
- int64 cursor; // stream pointer\r
- bool ownMemory; // stream has allocated memory itself\r
- bool allocationError; // stream invalid\r
-};\r
-\r
-} // namespace\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Common Base Classes\r
-// Filename : public.sdk/source/common/pluginview.cpp\r
-// Created by : Steinberg, 01/2004\r
-// Description : Plug-In View Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginview.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-// CPluginView implementation\r
-//------------------------------------------------------------------------\r
-CPluginView::CPluginView (const ViewRect* _rect)\r
-: rect (0, 0, 0, 0), systemWindow (nullptr), plugFrame (nullptr)\r
-{\r
- if (_rect)\r
- rect = *_rect;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-CPluginView::~CPluginView ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::isPlatformTypeSupported (FIDString /*type*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::attached (void* parent, FIDString /*type*/)\r
-{\r
- systemWindow = parent;\r
-\r
- attachedToParent ();\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::removed ()\r
-{\r
- systemWindow = nullptr;\r
-\r
- removedFromParent ();\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::onSize (ViewRect* newSize)\r
-{\r
- if (newSize)\r
- rect = *newSize;\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API CPluginView::getSize (ViewRect* size)\r
-{\r
- if (size)\r
- {\r
- *size = rect;\r
- return kResultTrue;\r
- }\r
- return kInvalidArgument;\r
-}\r
-\r
-} // end of namespace\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : SDK Core\r
-//\r
-// Category : Common Base Classes\r
-// Filename : public.sdk/source/common/pluginview.h\r
-// Created by : Steinberg, 01/2004\r
-// Description : Plug-In View Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/gui/iplugview.h"\r
-#include "base/source/fobject.h"\r
-\r
-namespace Steinberg {\r
-\r
-//------------------------------------------------------------------------\r
-/** Plug-In view default implementation.\r
-\ingroup sdkBase\r
-Can be used as base class for an IPlugView implementation. */\r
-//------------------------------------------------------------------------\r
-class CPluginView: public FObject,\r
- public IPlugView\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- CPluginView (const ViewRect* rect = nullptr);\r
- virtual ~CPluginView ();\r
-\r
- /** Returns its current frame rectangle. */\r
- const ViewRect& getRect () const { return rect; }\r
-\r
- /** Sets a new frame rectangle. */\r
- void setRect (const ViewRect& r) { rect = r; }\r
-\r
- /** Checks if this view is attached to its parent view. */\r
- bool isAttached () const { return systemWindow != nullptr; }\r
-\r
- /** Calls when this view will be attached to its parent view. */\r
- virtual void attachedToParent () {}\r
-\r
- /** Calls when this view will be removed from its parent view. */\r
- virtual void removedFromParent () {}\r
-\r
- //---from IPlugView-------\r
- tresult PLUGIN_API isPlatformTypeSupported (FIDString type) SMTG_OVERRIDE;\r
- tresult PLUGIN_API attached (void* parent, FIDString type) SMTG_OVERRIDE;\r
- tresult PLUGIN_API removed () SMTG_OVERRIDE;\r
-\r
- tresult PLUGIN_API onWheel (float /*distance*/) SMTG_OVERRIDE { return kResultFalse; }\r
- tresult PLUGIN_API onKeyDown (char16 /*key*/, int16 /*keyMsg*/, int16 /*modifiers*/) SMTG_OVERRIDE { return kResultFalse; }\r
- tresult PLUGIN_API onKeyUp (char16 /*key*/, int16 /*keyMsg*/, int16 /*modifiers*/) SMTG_OVERRIDE { return kResultFalse; }\r
- tresult PLUGIN_API getSize (ViewRect* size) SMTG_OVERRIDE;\r
- tresult PLUGIN_API onSize (ViewRect* newSize) SMTG_OVERRIDE;\r
-\r
- tresult PLUGIN_API onFocus (TBool /*state*/) SMTG_OVERRIDE { return kResultFalse; }\r
- tresult PLUGIN_API setFrame (IPlugFrame* frame) SMTG_OVERRIDE { plugFrame = frame; return kResultTrue; }\r
-\r
- tresult PLUGIN_API canResize () SMTG_OVERRIDE { return kResultFalse; }\r
- tresult PLUGIN_API checkSizeConstraint (ViewRect* /*rect*/) SMTG_OVERRIDE { return kResultFalse; }\r
-\r
- //---Interface------\r
- OBJ_METHODS (CPluginView, FObject)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IPlugView)\r
- END_DEFINE_INTERFACES (FObject)\r
- REFCOUNT_METHODS(FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
- ViewRect rect;\r
- void* systemWindow;\r
- IPlugFrame* plugFrame;\r
-};\r
-\r
-} // namespace\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/hosting/hostclasses.cpp\r
-// Created by : Steinberg, 03/05/2008.\r
-// Description : VST 3 hostclasses, example implementations for IHostApplication, IAttributeList and IMessage\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "hostclasses.h"\r
-\r
-#include <algorithm>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::getName (String128 name)\r
-{\r
- String str ("My VST3 HostApplication");\r
- str.copyTo16 (name, 0, 127);\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::createInstance (TUID cid, TUID _iid, void** obj)\r
-{\r
- FUID classID (FUID::fromTUID (cid));\r
- FUID interfaceID (FUID::fromTUID (_iid));\r
- if (classID == IMessage::iid && interfaceID == IMessage::iid)\r
- {\r
- *obj = new HostMessage;\r
- return kResultTrue;\r
- }\r
- else if (classID == IAttributeList::iid && interfaceID == IAttributeList::iid)\r
- {\r
- *obj = new HostAttributeList;\r
- return kResultTrue;\r
- }\r
- *obj = 0;\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostApplication::queryInterface (const char* _iid, void** obj)\r
-{\r
- QUERY_INTERFACE (_iid, obj, FUnknown::iid, IHostApplication)\r
- QUERY_INTERFACE (_iid, obj, IHostApplication::iid, IHostApplication)\r
- *obj = 0;\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 PLUGIN_API HostApplication::addRef ()\r
-{\r
- return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-uint32 PLUGIN_API HostApplication::release ()\r
-{\r
- return 1;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (HostMessage, IMessage, IMessage::iid)\r
-//-----------------------------------------------------------------------------\r
-HostMessage::HostMessage () : messageId (0), attributeList (0)\r
-{\r
- FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-HostMessage::~HostMessage ()\r
-{\r
- setMessageID (0);\r
- if (attributeList)\r
- attributeList->release ();\r
- FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-const char* PLUGIN_API HostMessage::getMessageID ()\r
-{\r
- return messageId;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void PLUGIN_API HostMessage::setMessageID (const char* mid)\r
-{\r
- if (messageId)\r
- delete[] messageId;\r
- messageId = 0;\r
- if (mid)\r
- {\r
- size_t len = strlen (mid) + 1;\r
- messageId = new char[len];\r
- strcpy (messageId, mid);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-IAttributeList* PLUGIN_API HostMessage::getAttributes ()\r
-{\r
- if (!attributeList)\r
- attributeList = new HostAttributeList;\r
- return attributeList;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-class HostAttribute\r
-{\r
-public:\r
- enum Type\r
- {\r
- kInteger,\r
- kFloat,\r
- kString,\r
- kBinary\r
- };\r
-\r
- HostAttribute (int64 value) : size (0), type (kInteger) { v.intValue = value; }\r
- HostAttribute (double value) : size (0), type (kFloat) { v.floatValue = value; }\r
- HostAttribute (const TChar* value, uint32 size) : size (size), type (kString)\r
- {\r
- v.stringValue = new TChar[size];\r
- memcpy (v.stringValue, value, size * sizeof (TChar));\r
- }\r
- HostAttribute (const void* value, uint32 size) : size (size), type (kBinary)\r
- {\r
- v.binaryValue = new char[size];\r
- memcpy (v.binaryValue, value, size);\r
- }\r
- ~HostAttribute ()\r
- {\r
- if (size)\r
- delete[] v.binaryValue;\r
- }\r
-\r
- int64 intValue () const { return v.intValue; }\r
- double floatValue () const { return v.floatValue; }\r
- const TChar* stringValue (uint32& stringSize)\r
- {\r
- stringSize = size;\r
- return v.stringValue;\r
- }\r
- const void* binaryValue (uint32& binarySize)\r
- {\r
- binarySize = size;\r
- return v.binaryValue;\r
- }\r
-\r
- Type getType () const { return type; }\r
-\r
-protected:\r
- union v\r
- {\r
- int64 intValue;\r
- double floatValue;\r
- TChar* stringValue;\r
- char* binaryValue;\r
- } v;\r
- uint32 size;\r
- Type type;\r
-};\r
-\r
-typedef std::map<String, HostAttribute*>::iterator mapIterator;\r
-\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-//-----------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (HostAttributeList, IAttributeList, IAttributeList::iid)\r
-//-----------------------------------------------------------------------------\r
-HostAttributeList::HostAttributeList ()\r
-{\r
- FUNKNOWN_CTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-HostAttributeList::~HostAttributeList ()\r
-{\r
- std::map<String, HostAttribute*>::reverse_iterator it = list.rbegin ();\r
- while (it != list.rend ())\r
- {\r
- delete it->second;\r
- it++;\r
- }\r
- FUNKNOWN_DTOR\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-void HostAttributeList::removeAttrID (AttrID aid)\r
-{\r
- mapIterator it = list.find (aid);\r
- if (it != list.end ())\r
- {\r
- delete it->second;\r
- list.erase (it);\r
- }\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setInt (AttrID aid, int64 value)\r
-{\r
- removeAttrID (aid);\r
- list[aid] = new HostAttribute (value);\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getInt (AttrID aid, int64& value)\r
-{\r
- mapIterator it = list.find (aid);\r
- if (it != list.end () && it->second)\r
- {\r
- value = it->second->intValue ();\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setFloat (AttrID aid, double value)\r
-{\r
- removeAttrID (aid);\r
- list[aid] = new HostAttribute (value);\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getFloat (AttrID aid, double& value)\r
-{\r
- mapIterator it = list.find (aid);\r
- if (it != list.end () && it->second)\r
- {\r
- value = it->second->floatValue ();\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setString (AttrID aid, const TChar* string)\r
-{\r
- removeAttrID (aid);\r
- list[aid] = new HostAttribute (string, String (const_cast<TChar*> (string)).length ());\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getString (AttrID aid, TChar* string, uint32 size)\r
-{\r
- mapIterator it = list.find (aid);\r
- if (it != list.end () && it->second)\r
- {\r
- uint32 stringSize = 0;\r
- const TChar* _string = it->second->stringValue (stringSize);\r
- memcpy (string, _string, std::min<uint32> (stringSize, size) * sizeof (TChar));\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::setBinary (AttrID aid, const void* data, uint32 size)\r
-{\r
- removeAttrID (aid);\r
- list[aid] = new HostAttribute (data, size);\r
- return kResultTrue;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult PLUGIN_API HostAttributeList::getBinary (AttrID aid, const void*& data, uint32& size)\r
-{\r
- mapIterator it = list.find (aid);\r
- if (it != list.end () && it->second)\r
- {\r
- data = it->second->binaryValue (size);\r
- return kResultTrue;\r
- }\r
- size = 0;\r
- return kResultFalse;\r
-}\r
-}\r
-} // namespace\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/hosting/hostclasses.h\r
-// Created by : Steinberg, 03/05/2008.\r
-// Description : VST 3 hostclasses, example implementations for IHostApplication, IAttributeList and IMessage\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-\r
-#include "base/source/fstring.h"\r
-\r
-#include <map>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IHostApplication.\r
-\ingroup hostingBase\r
-*/\r
-class HostApplication : public IHostApplication\r
-{\r
-public:\r
- HostApplication () { FUNKNOWN_CTOR }\r
- virtual ~HostApplication () { FUNKNOWN_DTOR }\r
-\r
- tresult PLUGIN_API getName (String128 name) SMTG_OVERRIDE;\r
- tresult PLUGIN_API createInstance (TUID cid, TUID _iid, void** obj) SMTG_OVERRIDE;\r
-\r
- DECLARE_FUNKNOWN_METHODS\r
-};\r
-\r
-class HostAttribute;\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IAttributeList.\r
-\ingroup hostingBase\r
-*/\r
-class HostAttributeList : public IAttributeList\r
-{\r
-public:\r
- HostAttributeList ();\r
- virtual ~HostAttributeList ();\r
-\r
- tresult PLUGIN_API setInt (AttrID aid, int64 value) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getInt (AttrID aid, int64& value) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setFloat (AttrID aid, double value) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getFloat (AttrID aid, double& value) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setString (AttrID aid, const TChar* string) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getString (AttrID aid, TChar* string, uint32 size) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setBinary (AttrID aid, const void* data, uint32 size) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getBinary (AttrID aid, const void*& data, uint32& size) SMTG_OVERRIDE;\r
-\r
- DECLARE_FUNKNOWN_METHODS\r
-protected:\r
- void removeAttrID (AttrID aid);\r
- std::map<String, HostAttribute*> list;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Implementation's example of IMessage.\r
-\ingroup hostingBase\r
-*/\r
-class HostMessage : public IMessage\r
-{\r
-public:\r
- HostMessage ();\r
- virtual ~HostMessage ();\r
-\r
- const char* PLUGIN_API getMessageID () SMTG_OVERRIDE;\r
- void PLUGIN_API setMessageID (const char* messageID) SMTG_OVERRIDE;\r
- IAttributeList* PLUGIN_API getAttributes () SMTG_OVERRIDE;\r
-\r
- DECLARE_FUNKNOWN_METHODS\r
-protected:\r
- char* messageId;\r
- HostAttributeList* attributeList;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstbus.cpp\r
-// Created by : Steinberg, 03/2008\r
-// Description : VST Bus Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstbus.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Bus Implementation\r
-//------------------------------------------------------------------------\r
-Bus::Bus (const TChar* _name, BusType _busType, int32 _flags)\r
-: name (_name), busType (_busType), flags (_flags), active (false)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Bus::getInfo (BusInfo& info)\r
-{\r
- name.copyTo16 (info.name, 0, str16BufferSize (info.name) - 1);\r
- info.busType = busType;\r
- info.flags = flags;\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EventBus Implementation\r
-//------------------------------------------------------------------------\r
-EventBus::EventBus (const TChar* name, BusType busType, int32 flags, int32 channelCount)\r
-: Bus (name, busType, flags), channelCount (channelCount)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EventBus::getInfo (BusInfo& info)\r
-{\r
- info.channelCount = channelCount;\r
- return Bus::getInfo (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// AudioBus Implementation\r
-//------------------------------------------------------------------------\r
-AudioBus::AudioBus (const TChar* name, BusType busType, int32 flags, SpeakerArrangement arr)\r
-: Bus (name, busType, flags), speakerArr (arr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool AudioBus::getInfo (BusInfo& info)\r
-{\r
- info.channelCount = SpeakerArr::getChannelCount (speakerArr);\r
- return Bus::getInfo (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// BusList Implementation\r
-//------------------------------------------------------------------------\r
-BusList::BusList (MediaType type, BusDirection dir) : type (type), direction (dir)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstbus.h\r
-// Created by : Steinberg, 03/2008\r
-// Description : VST Bus Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "base/source/fstring.h"\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-#include "pluginterfaces/vst/ivstaudioprocessor.h"\r
-\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Basic Bus object.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class Bus: public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Constructor. */\r
- Bus (const TChar* name, BusType busType, int32 flags);\r
-\r
- /** Returns true if the bus is active. */\r
- TBool isActive () const { return active; }\r
-\r
- /** Activates the bus. */\r
- void setActive (TBool state) { active = state; }\r
-\r
- /** Sets a new name for this bus. */\r
- void setName (String newName) { name = newName; }\r
-\r
- /** Sets a new busType for this bus. */\r
- void setBusType (BusType newBusType) { busType = newBusType; }\r
-\r
- /** Sets a new flags for this bus. */\r
- void setFlags (uint32 newFlags) { flags = newFlags; }\r
-\r
- /** Gets the BusInfo of this bus. */\r
- virtual bool getInfo (BusInfo&);\r
-\r
- OBJ_METHODS (Vst::Bus, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
- String name; ///< name\r
- BusType busType; ///< kMain or kAux, see \ref BusTypes\r
- int32 flags; ///< flags, see \ref BusFlags\r
- TBool active; ///< activation state\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of an Event Bus.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class EventBus: public Bus\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Constructor of an EventBus. */\r
- EventBus (const TChar* name, BusType busType, int32 flags, int32 channelCount);\r
-\r
- //---from Bus-------\r
- /** Gets the BusInfo associated to this Event bus. */\r
- bool getInfo (BusInfo& info) SMTG_OVERRIDE;\r
-\r
- OBJ_METHODS (Vst::EventBus, Vst::Bus);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- int32 channelCount;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of an Audio Bus.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class AudioBus: public Bus\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- AudioBus (const TChar* name, BusType busType, int32 flags, SpeakerArrangement arr);\r
-\r
- /** Gets the speaker arrangement defining this Audio bus. */\r
- SpeakerArrangement getArrangement () const { return speakerArr; }\r
-\r
- /** Sets the speaker arrangement defining this Audio bus. */\r
- void setArrangement (const SpeakerArrangement& arr) { speakerArr = arr; }\r
-\r
- //---from Bus---------------------\r
- /** Gets the BusInfo associated to this Audio bus. */\r
- bool getInfo (BusInfo& info) SMTG_OVERRIDE;\r
-\r
- OBJ_METHODS (Vst::AudioBus, Vst::Bus)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- SpeakerArrangement speakerArr;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** List of Buses.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class BusList: public FObject, public std::vector<IPtr<Vst::Bus> >\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Constructor. */\r
- BusList (MediaType type, BusDirection dir);\r
-\r
- /** Returns the BusList Type. See \ref MediaType */\r
- MediaType getType () const { return type; }\r
-\r
- /** Returns the BusList direction. See \ref BusDirection */\r
- BusDirection getDirection () const { return direction; }\r
-\r
- OBJ_METHODS (Vst::BusList, FObject);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- MediaType type;\r
- BusDirection direction;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstcomponent.cpp\r
-// Created by : Steinberg, 04/2005\r
-// Description : Basic VST Plug-in Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstcomponent.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Component Implementation\r
-//------------------------------------------------------------------------\r
-Component::Component ()\r
-: audioInputs (kAudio, kInput)\r
-, audioOutputs (kAudio, kOutput)\r
-, eventInputs (kEvent, kInput)\r
-, eventOutputs (kEvent, kOutput)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::initialize (FUnknown* context)\r
-{\r
- return ComponentBase::initialize (context);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::terminate ()\r
-{\r
- // remove all buses\r
- removeAllBusses ();\r
-\r
- return ComponentBase::terminate ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-BusList* Component::getBusList (MediaType type, BusDirection dir)\r
-{\r
- if (type == kAudio)\r
- return dir == kInput ? &audioInputs : &audioOutputs;\r
- else if (type == kEvent)\r
- return dir == kInput ? &eventInputs : &eventOutputs;\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeAudioBusses ()\r
-{\r
- audioInputs.clear ();\r
- audioOutputs.clear ();\r
-\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeEventBusses ()\r
-{\r
- eventInputs.clear ();\r
- eventOutputs.clear ();\r
-\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::removeAllBusses ()\r
-{\r
- removeAudioBusses ();\r
- removeEventBusses ();\r
-\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getControllerClassId (TUID classID)\r
-{\r
- if (controllerClass.isValid ())\r
- {\r
- controllerClass.toTUID (classID);\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setIoMode (IoMode /*mode*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API Component::getBusCount (MediaType type, BusDirection dir)\r
-{\r
- BusList* busList = getBusList (type, dir);\r
- return busList ? static_cast<int32> (busList->size ()) : 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getBusInfo (MediaType type, BusDirection dir, int32 index,\r
- BusInfo& info)\r
-{\r
- if (index < 0)\r
- return kInvalidArgument;\r
- BusList* busList = getBusList (type, dir);\r
- if (busList == nullptr)\r
- return kInvalidArgument;\r
- if (index >= static_cast<int32> (busList->size ()))\r
- return kInvalidArgument;\r
-\r
- Bus* bus = busList->at (index);\r
- info.mediaType = type;\r
- info.direction = dir;\r
- if (bus->getInfo (info))\r
- return kResultTrue;\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getRoutingInfo (RoutingInfo& /*inInfo*/, RoutingInfo& /*outInfo*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::activateBus (MediaType type, BusDirection dir, int32 index,\r
- TBool state)\r
-{\r
- if (index < 0)\r
- return kInvalidArgument;\r
- BusList* busList = getBusList (type, dir);\r
- if (busList == nullptr)\r
- return kInvalidArgument;\r
- if (index >= static_cast<int32> (busList->size ()))\r
- return kInvalidArgument;\r
-\r
- Bus* bus = busList->at (index);\r
- bus->setActive (state);\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setActive (TBool /*state*/)\r
-{\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::setState (IBStream* /*state*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API Component::getState (IBStream* /*state*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult Component::renameBus (MediaType type, BusDirection dir, int32 index,\r
- const String128 newName)\r
-{\r
- if (index < 0)\r
- return kInvalidArgument;\r
- BusList* busList = getBusList (type, dir);\r
- if (busList == nullptr)\r
- return kInvalidArgument;\r
- if (index >= static_cast<int32> (busList->size ()))\r
- return kInvalidArgument;\r
-\r
- Bus* bus = busList->at (index);\r
- bus->setName (newName);\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// Helpers Implementation\r
-//------------------------------------------------------------------------\r
-tresult getSpeakerChannelIndex (SpeakerArrangement arrangement, uint64 speaker, int32& channel)\r
-{\r
- channel = SpeakerArr::getSpeakerIndex (speaker, arrangement);\r
- return channel < 0 ? kResultFalse : kResultTrue;\r
-}\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstcomponent.h\r
-// Created by : Steinberg, 04/2005\r
-// Description : Basic VST Plug-in Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "public.sdk/source/vst/vstcomponentbase.h"\r
-#include "public.sdk/source/vst/vstbus.h"\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Default implementation for a VST 3 Component.\r
-\ingroup vstClasses\r
-Can be used as base class for a VST 3 component implementation. */\r
-//------------------------------------------------------------------------\r
-class Component : public ComponentBase, public IComponent\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- /** Constructor */\r
- Component ();\r
-\r
- //---Internal Methods-------\r
- /** Sets the controller Class ID associated to its component. */\r
- void setControllerClass (const FUID& cid) { controllerClass = cid; }\r
-\r
- /** Removes all Audio Buses. */\r
- tresult removeAudioBusses ();\r
-\r
- /** Removes all Event Buses. */\r
- tresult removeEventBusses ();\r
-\r
- /** Renames a specific bus. Do not forget to inform the host about this (see \ref\r
- * IComponentHandler::restartComponent (kIoTitlesChanged)). */\r
- tresult renameBus (MediaType type, BusDirection dir, int32 index, const String128 newName);\r
-\r
- //---from IComponent--------\r
- tresult PLUGIN_API getControllerClassId (TUID classID) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setIoMode (IoMode mode) SMTG_OVERRIDE;\r
- int32 PLUGIN_API getBusCount (MediaType type, BusDirection dir) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getBusInfo (MediaType type, BusDirection dir, int32 index, BusInfo& info) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getRoutingInfo (RoutingInfo& inInfo, RoutingInfo& outInfo) SMTG_OVERRIDE;\r
- tresult PLUGIN_API activateBus (MediaType type, BusDirection dir, int32 index, TBool state) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setActive (TBool state) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setState (IBStream* state) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getState (IBStream* state) SMTG_OVERRIDE;\r
-\r
- //---from ComponentBase------\r
- tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
- tresult PLUGIN_API terminate () SMTG_OVERRIDE;\r
-\r
- //---Interface---------\r
- OBJ_METHODS (Component, ComponentBase)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IComponent)\r
- END_DEFINE_INTERFACES (ComponentBase)\r
- REFCOUNT_METHODS (ComponentBase)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- FUID controllerClass;\r
- BusList audioInputs;\r
- BusList audioOutputs;\r
- BusList eventInputs;\r
- BusList eventOutputs;\r
-\r
- BusList* getBusList (MediaType type, BusDirection dir);\r
- tresult removeAllBusses ();\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// some Helper functions....\r
-//------------------------------------------------------------------------\r
-\r
-/** Gets the channel index of a given speaker in a arrangement, returns kResultFalse if speaker not\r
- * part of the arrangement else returns kResultTrue. */\r
-tresult getSpeakerChannelIndex (SpeakerArrangement arrangement, uint64 speaker, int32& channel);\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstcomponentbase.cpp\r
-// Created by : Steinberg, 05/2005\r
-// Description : Base class for VST Component and Edit Controller\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstcomponentbase.h"\r
-#include "base/source/fstring.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// ComponentBase Implementation\r
-//------------------------------------------------------------------------\r
-ComponentBase::ComponentBase () : hostContext (nullptr), peerConnection (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ComponentBase::~ComponentBase ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::initialize (FUnknown* context)\r
-{\r
- // check if already initialized\r
- if (hostContext)\r
- return kResultFalse;\r
-\r
- hostContext = context;\r
- if (hostContext)\r
- hostContext->addRef ();\r
-\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::terminate ()\r
-{\r
- // release host interfaces\r
- if (hostContext)\r
- {\r
- hostContext->release ();\r
- hostContext = nullptr;\r
- }\r
-\r
- // in case host did not disconnect us,\r
- // release peer now\r
- if (peerConnection)\r
- {\r
- peerConnection->disconnect (this);\r
- peerConnection->release ();\r
- peerConnection = nullptr;\r
- }\r
-\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::connect (IConnectionPoint* other)\r
-{\r
- if (!other)\r
- return kInvalidArgument;\r
-\r
- // check if already connected\r
- if (peerConnection)\r
- return kResultFalse;\r
-\r
- peerConnection = other;\r
- peerConnection->addRef ();\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::disconnect (IConnectionPoint* other)\r
-{\r
- if (peerConnection && other == peerConnection)\r
- {\r
- peerConnection->release ();\r
- peerConnection = nullptr;\r
- return kResultOk;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ComponentBase::notify (IMessage* message)\r
-{\r
- if (!message)\r
- return kInvalidArgument;\r
-\r
- if (!strcmp (message->getMessageID (), "TextMessage"))\r
- {\r
- TChar string[256] = {0};\r
- if (message->getAttributes ()->getString ("Text", string,\r
- sizeof (string) / sizeof (char16)) == kResultOk)\r
- {\r
- String tmp (string);\r
- tmp.toMultiByte (kCP_Utf8);\r
- return receiveText (tmp.text8 ());\r
- }\r
- }\r
-\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-IMessage* ComponentBase::allocateMessage ()\r
-{\r
- FUnknownPtr<IHostApplication> hostApp (hostContext);\r
- if (hostApp)\r
- return Vst::allocateMessage (hostApp);\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::sendMessage (IMessage* message)\r
-{\r
- if (message != nullptr && getPeer () != nullptr)\r
- return getPeer ()->notify (message);\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::sendTextMessage (const char8* text)\r
-{\r
- IMessage* message = allocateMessage ();\r
- if (!message)\r
- return kResultFalse;\r
-\r
- FReleaser msgReleaser (message);\r
- message->setMessageID ("TextMessage");\r
- String tmp (text, kCP_Utf8);\r
- if (tmp.length () >= 256)\r
- tmp.remove (255);\r
- message->getAttributes ()->setString ("Text", tmp.text16 ());\r
- return sendMessage (message);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ComponentBase::receiveText (const char8* /*text*/)\r
-{\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstcomponentbase.h\r
-// Created by : Steinberg, 05/2005\r
-// Description : Base class for Component and Edit Controller\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/base/ipluginbase.h"\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-#include "base/source/fobject.h"\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Base class for VST 3 Component and Edit Controller.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class ComponentBase: public FObject,\r
- public IPluginBase,\r
- public IConnectionPoint\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- ComponentBase ();\r
- virtual ~ComponentBase ();\r
-\r
- //--- Internal Methods------\r
- /** Returns the hostContext (set by the host during initialize call). */\r
- FUnknown* getHostContext () { return hostContext; }\r
-\r
- /** Returns the peer for the messaging communication (you can only use IConnectionPoint::notify\r
- * for communicate between peers, do not try to cast peerConnection. */\r
- IConnectionPoint* getPeer () { return peerConnection; }\r
-\r
- /** Allocates a message instance (don't forget to release it). */\r
- IMessage* allocateMessage ();\r
-\r
- /** Sends the given message to the peer. */\r
- tresult sendMessage (IMessage* message);\r
-\r
- /** Sends a simple text message to the peer (max 255 characters). Text is interpreted as UTF-8.\r
- */\r
- tresult sendTextMessage (const char8* text);\r
-\r
- /** Receives a simple text message from the peer (max 255 characters). Text is UTF-8 encoded. */\r
- virtual tresult receiveText (const char8* text);\r
-\r
- //---from IPluginBase------\r
- tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
- tresult PLUGIN_API terminate () SMTG_OVERRIDE;\r
-\r
- //---from IConnectionPoint-----------\r
- tresult PLUGIN_API connect (IConnectionPoint* other) SMTG_OVERRIDE;\r
- tresult PLUGIN_API disconnect (IConnectionPoint* other) SMTG_OVERRIDE;\r
- tresult PLUGIN_API notify (IMessage* message) SMTG_OVERRIDE;\r
-\r
- //---Interface------\r
- OBJ_METHODS (ComponentBase, FObject)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IPluginBase)\r
- DEF_INTERFACE (IConnectionPoint)\r
- END_DEFINE_INTERFACES (FObject)\r
- REFCOUNT_METHODS (FObject)\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- FUnknown* hostContext;\r
- IConnectionPoint* peerConnection;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vsteditcontroller.cpp\r
-// Created by : Steinberg, 04/2005\r
-// Description : VST Edit Controller Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "public.sdk/source/vst/vsteditcontroller.h"\r
-#include "base/source/updatehandler.h"\r
-#include "pluginterfaces/base/ustring.h"\r
-\r
-#include <stdio.h>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-KnobMode EditController::hostKnobMode = kCircularMode;\r
-\r
-//------------------------------------------------------------------------\r
-// EditController Implementation\r
-//------------------------------------------------------------------------\r
-EditController::EditController () : componentHandler (nullptr), componentHandler2 (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::initialize (FUnknown* context)\r
-{\r
- return ComponentBase::initialize (context);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::terminate ()\r
-{\r
- parameters.removeAll ();\r
-\r
- if (componentHandler)\r
- {\r
- componentHandler->release ();\r
- componentHandler = nullptr;\r
- }\r
-\r
- if (componentHandler2)\r
- {\r
- componentHandler2->release ();\r
- componentHandler2 = nullptr;\r
- }\r
-\r
- return ComponentBase::terminate ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setComponentState (IBStream* /*state*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setState (IBStream* /*state*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getState (IBStream* /*state*/)\r
-{\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API EditController::getParameterCount ()\r
-{\r
- return parameters.getParameterCount ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParameterInfo (int32 paramIndex, ParameterInfo& info)\r
-{\r
- Parameter* parameter = parameters.getParameterByIndex (paramIndex);\r
- if (parameter)\r
- {\r
- info = parameter->getInfo ();\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParamStringByValue (ParamID tag, ParamValue valueNormalized,\r
- String128 string)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- parameter->toString (valueNormalized, string);\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::getParamValueByString (ParamID tag, TChar* string,\r
- ParamValue& valueNormalized)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- if (parameter->fromString (string, valueNormalized))\r
- {\r
- return kResultTrue;\r
- }\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::normalizedParamToPlain (ParamID tag,\r
- ParamValue valueNormalized)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- return parameter->toPlain (valueNormalized);\r
- }\r
- return valueNormalized;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::plainParamToNormalized (ParamID tag, ParamValue plainValue)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- return parameter->toNormalized (plainValue);\r
- }\r
- return plainValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue PLUGIN_API EditController::getParamNormalized (ParamID tag)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- return parameter->getNormalized ();\r
- }\r
- return 0.;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setParamNormalized (ParamID tag, ParamValue value)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- parameter->setNormalized (value);\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditController::setComponentHandler (IComponentHandler* newHandler)\r
-{\r
- if (componentHandler == newHandler)\r
- {\r
- return kResultTrue;\r
- }\r
-\r
- if (componentHandler)\r
- {\r
- componentHandler->release ();\r
- }\r
-\r
- componentHandler = newHandler;\r
- if (componentHandler)\r
- {\r
- componentHandler->addRef ();\r
- }\r
-\r
- // try to get the extended version\r
- if (componentHandler2)\r
- {\r
- componentHandler2->release ();\r
- componentHandler2 = nullptr;\r
- }\r
-\r
- if (newHandler)\r
- {\r
- newHandler->queryInterface (IComponentHandler2::iid, (void**)&componentHandler2);\r
- }\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::beginEdit (ParamID tag)\r
-{\r
- if (componentHandler)\r
- {\r
- return componentHandler->beginEdit (tag);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::performEdit (ParamID tag, ParamValue valueNormalized)\r
-{\r
- if (componentHandler)\r
- {\r
- return componentHandler->performEdit (tag, valueNormalized);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::endEdit (ParamID tag)\r
-{\r
- if (componentHandler)\r
- {\r
- return componentHandler->endEdit (tag);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::startGroupEdit ()\r
-{\r
- if (componentHandler2)\r
- {\r
- return componentHandler2->startGroupEdit ();\r
- }\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::finishGroupEdit ()\r
-{\r
- if (componentHandler2)\r
- {\r
- return componentHandler2->finishGroupEdit ();\r
- }\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::getParameterInfoByTag (ParamID tag, ParameterInfo& info)\r
-{\r
- Parameter* parameter = getParameterObject (tag);\r
- if (parameter)\r
- {\r
- info = parameter->getInfo ();\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::setDirty (TBool state)\r
-{\r
- if (componentHandler2)\r
- {\r
- return componentHandler2->setDirty (state);\r
- }\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditController::requestOpenEditor (FIDString name)\r
-{\r
- if (componentHandler2)\r
- {\r
- return componentHandler2->requestOpenEditor (name);\r
- }\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EditorView Implementation\r
-//------------------------------------------------------------------------\r
-EditorView::EditorView (EditController* controller, ViewRect* size)\r
-: CPluginView (size), controller (controller)\r
-{\r
- if (controller)\r
- {\r
- controller->addRef ();\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-EditorView::~EditorView ()\r
-{\r
- if (controller)\r
- {\r
- controller->editorDestroyed (this);\r
- controller->release ();\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void EditorView::attachedToParent ()\r
-{\r
- if (controller)\r
- {\r
- controller->editorAttached (this);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void EditorView::removedFromParent ()\r
-{\r
- if (controller)\r
- {\r
- controller->editorRemoved (this);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// EditControllerEx1 implementation\r
-//------------------------------------------------------------------------\r
-EditControllerEx1::EditControllerEx1 () : selectedUnit (kRootUnitId)\r
-{\r
- UpdateHandler::instance ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-EditControllerEx1::~EditControllerEx1 ()\r
-{\r
- for (ProgramListVector::const_iterator it = programLists.begin (), end = programLists.end ();\r
- it != end; ++it)\r
- {\r
- if (*it)\r
- (*it)->removeDependent (this);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EditControllerEx1::addUnit (Unit* unit)\r
-{\r
- units.push_back (IPtr<Unit> (unit, false));\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/)\r
-{\r
- Unit* unit = units.at (unitIndex);\r
- if (unit)\r
- {\r
- info = unit->getInfo ();\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::notifyUnitSelection ()\r
-{\r
- tresult result = kResultFalse;\r
- FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
- if (unitHandler)\r
- result = unitHandler->notifyUnitSelection (selectedUnit);\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool EditControllerEx1::addProgramList (ProgramList* list)\r
-{\r
- programIndexMap[list->getID ()] = programLists.size ();\r
- programLists.push_back (IPtr<ProgramList> (list, false));\r
- list->addDependent (this);\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ProgramList* EditControllerEx1::getProgramList (ProgramListID listId) const\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- return it == programIndexMap.end () ? nullptr : programLists[it->second];\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::notifyProgramListChange (ProgramListID listId, int32 programIndex)\r
-{\r
- tresult result = kResultFalse;\r
- FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
- if (unitHandler)\r
- result = unitHandler->notifyProgramListChange (listId, programIndex);\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 PLUGIN_API EditControllerEx1::getProgramListCount ()\r
-{\r
- return static_cast<int32> (programLists.size ());\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramListInfo (int32 listIndex,\r
- ProgramListInfo& info /*out*/)\r
-{\r
- if (listIndex < 0 || listIndex >= static_cast<int32> (programLists.size ()))\r
- return kResultFalse;\r
- info = programLists[listIndex]->getInfo ();\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramName (ProgramListID listId, int32 programIndex,\r
- String128 name /*out*/)\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- if (it != programIndexMap.end ())\r
- {\r
- return programLists[it->second]->getProgramName (programIndex, name);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult EditControllerEx1::setProgramName (ProgramListID listId, int32 programIndex,\r
- const String128 name /*in*/)\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- if (it != programIndexMap.end ())\r
- {\r
- return programLists[it->second]->setProgramName (programIndex, name);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramInfo (ProgramListID listId, int32 programIndex,\r
- CString attributeId /*in*/,\r
- String128 attributeValue /*out*/)\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- if (it != programIndexMap.end ())\r
- {\r
- return programLists[it->second]->getProgramInfo (programIndex, attributeId, attributeValue);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::hasProgramPitchNames (ProgramListID listId,\r
- int32 programIndex)\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- if (it != programIndexMap.end ())\r
- {\r
- return programLists[it->second]->hasPitchNames (programIndex);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API EditControllerEx1::getProgramPitchName (ProgramListID listId, int32 programIndex,\r
- int16 midiPitch, String128 name /*out*/)\r
-{\r
- ProgramIndexMap::const_iterator it = programIndexMap.find (listId);\r
- if (it != programIndexMap.end ())\r
- {\r
- return programLists[it->second]->getPitchName (programIndex, midiPitch, name);\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void PLUGIN_API EditControllerEx1::update (FUnknown* changedUnknown, int32 /*message*/)\r
-{\r
- ProgramList* programList = FCast<ProgramList> (changedUnknown);\r
- if (programList)\r
- {\r
- FUnknownPtr<IUnitHandler> unitHandler (componentHandler);\r
- if (unitHandler)\r
- unitHandler->notifyProgramListChange (programList->getID (), kAllProgramInvalid);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// Unit implementation\r
-//------------------------------------------------------------------------\r
-Unit::Unit ()\r
-{\r
- memset (&info, 0, sizeof (UnitInfo));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Unit::Unit (const String128 name, UnitID unitId, UnitID parentUnitId, ProgramListID programListId)\r
-{\r
- setName (name);\r
- info.id = unitId;\r
- info.parentUnitId = parentUnitId;\r
- info.programListId = programListId;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Unit::Unit (const UnitInfo& info) : info (info)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Unit::setName (const String128 newName)\r
-{\r
- UString128 (newName).copyTo (info.name, 128);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ProgramList implementation\r
-//------------------------------------------------------------------------\r
-ProgramList::ProgramList (const String128 name, ProgramListID listId, UnitID unitId)\r
-: unitId (unitId), parameter (nullptr)\r
-{\r
- UString128 (name).copyTo (info.name, 128);\r
- info.id = listId;\r
- info.programCount = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ProgramList::ProgramList (const ProgramList& programList)\r
-: info (programList.info)\r
-, unitId (programList.unitId)\r
-, programNames (programList.programNames)\r
-, parameter (nullptr)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-int32 ProgramList::addProgram (const String128 name)\r
-{\r
- ++info.programCount;\r
- programNames.push_back (name);\r
- programInfos.push_back (ProgramInfoVector::value_type ());\r
- return static_cast<int32> (programNames.size ()) - 1;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool ProgramList::setProgramInfo (int32 programIndex, CString attributeId, const String128 value)\r
-{\r
- if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
- {\r
- programInfos.at (programIndex).insert (std::make_pair (attributeId, value));\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::getProgramInfo (int32 programIndex, CString attributeId,\r
- String128 value /*out*/)\r
-{\r
- if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
- {\r
- StringMap::const_iterator it = programInfos[programIndex].find (attributeId);\r
- if (it != programInfos[programIndex].end ())\r
- {\r
- if (!it->second.isEmpty ())\r
- {\r
- it->second.copyTo16 (value, 0, 128);\r
- return kResultTrue;\r
- }\r
- }\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::getProgramName (int32 programIndex, String128 name /*out*/)\r
-{\r
- if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
- {\r
- programNames.at (programIndex).copyTo16 (name, 0, 128);\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult ProgramList::setProgramName (int32 programIndex, const String128 name /*in*/)\r
-{\r
- if (programIndex >= 0 && programIndex < static_cast<int32> (programNames.size ()))\r
- {\r
- programNames.at (programIndex) = name;\r
- if (parameter)\r
- {\r
- static_cast<StringListParameter*> (parameter)->replaceString (programIndex, name);\r
- }\r
- return kResultTrue;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ProgramList::getParameter ()\r
-{\r
- if (parameter == nullptr)\r
- {\r
- StringListParameter* listParameter = new StringListParameter (\r
- info.name, info.id, 0,\r
- ParameterInfo::kCanAutomate | ParameterInfo::kIsList | ParameterInfo::kIsProgramChange,\r
- unitId);\r
- for (StringVector::const_iterator it = programNames.begin (), end = programNames.end ();\r
- it != end; ++it)\r
- {\r
- listParameter->appendString (*it);\r
- }\r
- parameter = listParameter;\r
- }\r
- return parameter;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ProgramListWithPitchNames implementation\r
-//-----------------------------------------------------------------------------\r
-ProgramListWithPitchNames::ProgramListWithPitchNames (const String128 name, ProgramListID listId,\r
- UnitID unitId)\r
-: ProgramList (name, listId, unitId)\r
-{\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-int32 ProgramListWithPitchNames::addProgram (const String128 name)\r
-{\r
- int32 index = ProgramList::addProgram (name);\r
- if (index >= 0)\r
- pitchNames.push_back (PitchNamesVector::value_type ());\r
- return index;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ProgramListWithPitchNames::setPitchName (int32 programIndex, int16 pitch,\r
- const String128 pitchName)\r
-{\r
- if (programIndex < 0 || programIndex >= getCount ())\r
- return false;\r
-\r
- bool nameChanged = true;\r
- std::pair<PitchNameMap::iterator, bool> res =\r
- pitchNames[programIndex].insert (std::make_pair (pitch, pitchName));\r
- if (!res.second)\r
- {\r
- if (res.first->second == pitchName)\r
- nameChanged = false;\r
- else\r
- res.first->second = pitchName;\r
- }\r
-\r
- if (nameChanged)\r
- changed ();\r
- return true;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-bool ProgramListWithPitchNames::removePitchName (int32 programIndex, int16 pitch)\r
-{\r
- bool result = false;\r
- if (programIndex >= 0 && programIndex < getCount ())\r
- {\r
- result = pitchNames.at (programIndex).erase (pitch) != 0;\r
- }\r
- if (result)\r
- changed ();\r
- return result;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult ProgramListWithPitchNames::hasPitchNames (int32 programIndex)\r
-{\r
- if (programIndex >= 0 && programIndex < getCount ())\r
- return pitchNames.at (programIndex).empty () ? kResultFalse : kResultTrue;\r
- return kResultFalse;\r
-}\r
-\r
-//-----------------------------------------------------------------------------\r
-tresult ProgramListWithPitchNames::getPitchName (int32 programIndex, int16 midiPitch,\r
- String128 name /*out*/)\r
-{\r
- if (programIndex >= 0 && programIndex < getCount ())\r
- {\r
- PitchNameMap::const_iterator it = pitchNames[programIndex].find (midiPitch);\r
- if (it != pitchNames[programIndex].end ())\r
- {\r
- it->second.copyTo16 (name, 0, 128);\r
- return kResultTrue;\r
- }\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vsteditcontroller.h\r
-// Created by : Steinberg, 04/2005\r
-// Description : VST Edit Controller Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "public.sdk/source/vst/vstcomponentbase.h"\r
-#include "public.sdk/source/vst/vstparameters.h"\r
-#include "public.sdk/source/common/pluginview.h"\r
-#include "base/source/fstring.h"\r
-\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include <vector>\r
-#include <map>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-class EditorView;\r
-\r
-//------------------------------------------------------------------------\r
-/** Default implementation for a VST 3 edit controller.\r
-\ingroup vstClasses\r
-Can be used as base class for a specific controller implementation */\r
-//------------------------------------------------------------------------\r
-class EditController: public ComponentBase,\r
- public IEditController,\r
- public IEditController2\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- EditController ();\r
-\r
- //---from IEditController-------\r
- tresult PLUGIN_API setComponentState (IBStream* state) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setState (IBStream* state) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getState (IBStream* state) SMTG_OVERRIDE;\r
- int32 PLUGIN_API getParameterCount () SMTG_OVERRIDE;\r
- tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getParamStringByValue (ParamID tag, ParamValue valueNormalized, String128 string) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getParamValueByString (ParamID tag, TChar* string, ParamValue& valueNormalized) SMTG_OVERRIDE;\r
- ParamValue PLUGIN_API normalizedParamToPlain (ParamID tag, ParamValue valueNormalized) SMTG_OVERRIDE;\r
- ParamValue PLUGIN_API plainParamToNormalized (ParamID tag, ParamValue plainValue) SMTG_OVERRIDE;\r
- ParamValue PLUGIN_API getParamNormalized (ParamID tag) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setParamNormalized (ParamID tag, ParamValue value) SMTG_OVERRIDE;\r
- tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) SMTG_OVERRIDE;\r
- IPlugView* PLUGIN_API createView (FIDString /*name*/) SMTG_OVERRIDE {return nullptr;}\r
-\r
- //---from IEditController2-------\r
- tresult PLUGIN_API setKnobMode (KnobMode mode) SMTG_OVERRIDE { hostKnobMode = mode; return kResultTrue; }\r
- tresult PLUGIN_API openHelp (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;}\r
- tresult PLUGIN_API openAboutBox (TBool /*onlyCheck*/) SMTG_OVERRIDE {return kResultFalse;}\r
-\r
- //---from ComponentBase---------\r
- tresult PLUGIN_API initialize (FUnknown* context) SMTG_OVERRIDE;\r
- tresult PLUGIN_API terminate () SMTG_OVERRIDE;\r
-\r
- //---Internal Methods-------\r
- virtual tresult beginEdit (ParamID tag); ///< to be called before a serie of performEdit\r
- virtual tresult performEdit (ParamID tag, ParamValue valueNormalized); ///< will inform the host about the value change\r
- virtual tresult endEdit (ParamID tag); ///< to be called after a serie of performEdit\r
- virtual tresult startGroupEdit (); ///< calls IComponentHandler2::startGroupEdit() if host supports it\r
- virtual tresult finishGroupEdit (); ///< calls IComponentHandler2::finishGroupEdit() if host supports it\r
-\r
- virtual void editorDestroyed (EditorView* /*editor*/) {} ///< called from EditorView if it was destroyed\r
- virtual void editorAttached (EditorView* /*editor*/) {} ///< called from EditorView if it was attached to a parent\r
- virtual void editorRemoved (EditorView* /*editor*/) {} ///< called from EditorView if it was removed from a parent\r
-\r
- static KnobMode getHostKnobMode () { return hostKnobMode; } ///< return host knob mode\r
-\r
- /** Gets for a given tag the parameter object. */\r
- virtual Parameter* getParameterObject (ParamID tag) { return parameters.getParameter (tag); }\r
-\r
- /** Gets for a given tag the parameter information. */\r
- virtual tresult getParameterInfoByTag (ParamID tag, ParameterInfo& info);\r
-\r
- /** Calls IComponentHandler2::setDirty (state) if host supports it. */\r
- virtual tresult setDirty (TBool state);\r
-\r
- /** Calls IComponentHandler2::requestOpenEditor (name) if host supports it. */\r
- virtual tresult requestOpenEditor (FIDString name = ViewType::kEditor);\r
-\r
- //---Accessor Methods-------\r
- IComponentHandler* getComponentHandler () const { return componentHandler; }\r
-\r
- //---Interface---------\r
- OBJ_METHODS (EditController, ComponentBase)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IEditController)\r
- DEF_INTERFACE (IEditController2)\r
- END_DEFINE_INTERFACES (ComponentBase)\r
- REFCOUNT_METHODS (ComponentBase)\r
-//------------------------------------------------------------------------\r
-protected:\r
- IComponentHandler* componentHandler;\r
- IComponentHandler2* componentHandler2;\r
-\r
- ParameterContainer parameters;\r
-\r
- static KnobMode hostKnobMode;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** View related to an edit controller.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class EditorView : public CPluginView\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- EditorView (EditController* controller, ViewRect* size = nullptr);\r
- virtual ~EditorView ();\r
-\r
- /** Gets its controller part. */\r
- EditController* getController () { return controller; }\r
-\r
- //---from CPluginView-------------\r
- void attachedToParent () SMTG_OVERRIDE;\r
- void removedFromParent () SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- EditController* controller;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Unit element.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class Unit : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- Unit (const String128 name, UnitID unitId, UnitID parentUnitId = kRootUnitId,\r
- ProgramListID programListId = kNoProgramListId);\r
- Unit (const UnitInfo& unit);\r
-\r
- /** Returns its info. */\r
- const UnitInfo& getInfo () const { return info; }\r
-\r
- /** Returns its Unit ID. */\r
- UnitID getID () const { return info.id; }\r
-\r
- /** Sets a new Unit ID. */\r
- void setID (UnitID newID) { info.id = newID; }\r
-\r
- /** Returns its Unit Name. */\r
- const TChar* getName () const { return info.name; }\r
-\r
- /** Sets a new Unit Name. */\r
- void setName (const String128 newName);\r
-\r
- /** Returns its ProgramList ID. */\r
- ProgramListID getProgramListID () const { return info.programListId; }\r
-\r
- /** Sets a new ProgramList ID. */\r
- void setProgramListID (ProgramListID newID) { info.programListId = newID; }\r
-\r
- OBJ_METHODS (Unit, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
- Unit ();\r
- UnitInfo info;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** ProgramList element.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class ProgramList : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- ProgramList (const String128 name, ProgramListID listId, UnitID unitId);\r
- ProgramList (const ProgramList& programList);\r
-\r
- const ProgramListInfo& getInfo () const { return info; }\r
- ProgramListID getID () const { return info.id; }\r
- const TChar* getName () const { return info.name; }\r
- int32 getCount () const { return info.programCount; }\r
-\r
- virtual tresult getProgramName (int32 programIndex, String128 name /*out*/);\r
- virtual tresult setProgramName (int32 programIndex, const String128 name /*in*/);\r
- virtual tresult getProgramInfo (int32 programIndex, CString attributeId,\r
- String128 value /*out*/);\r
- virtual tresult hasPitchNames (int32 programIndex)\r
- {\r
- (void)programIndex;\r
- return kResultFalse;\r
- }\r
- virtual tresult getPitchName (int32 programIndex, int16 midiPitch, String128 name /*out*/)\r
- {\r
- (void)programIndex;\r
- (void)midiPitch;\r
- (void)name;\r
- return kResultFalse;\r
- }\r
-\r
- /** Adds a program to the end of the list. returns the index of the program. */\r
- virtual int32 addProgram (const String128 name);\r
-\r
- /** Sets a program attribute value. */\r
- virtual bool setProgramInfo (int32 programIndex, CString attributeId, const String128 value);\r
-\r
- /** Creates and returns the program parameter. */\r
- virtual Parameter* getParameter ();\r
-\r
- OBJ_METHODS (ProgramList, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
- typedef std::map<String, String> StringMap;\r
- typedef std::vector<String> StringVector;\r
- typedef std::vector<StringMap> ProgramInfoVector;\r
- ProgramListInfo info;\r
- UnitID unitId;\r
- StringVector programNames;\r
- ProgramInfoVector programInfos;\r
- Parameter* parameter;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** ProgramListWithPitchNames element.\r
-\ingroup vstClasses */\r
-//-----------------------------------------------------------------------------\r
-class ProgramListWithPitchNames : public ProgramList\r
-{\r
-public:\r
- ProgramListWithPitchNames (const String128 name, ProgramListID listId, UnitID unitId);\r
-\r
- /** Sets a name for the given program index and a given pitch. */\r
- bool setPitchName (int32 programIndex, int16 pitch, const String128 pitchName);\r
-\r
- /** Removes the PitchName entry for the given program index and a given pitch. Returns true if\r
- * it was found and removed. */\r
- bool removePitchName (int32 programIndex, int16 pitch);\r
-\r
- //---from ProgramList---------\r
- int32 addProgram (const String128 name) SMTG_OVERRIDE;\r
- tresult hasPitchNames (int32 programIndex) SMTG_OVERRIDE;\r
- tresult getPitchName (int32 programIndex, int16 midiPitch,\r
- String128 name /*out*/) SMTG_OVERRIDE;\r
-\r
- OBJ_METHODS (ProgramListWithPitchNames, ProgramList)\r
-protected:\r
- typedef std::map<int16, String> PitchNameMap;\r
- typedef std::vector<PitchNameMap> PitchNamesVector;\r
- PitchNamesVector pitchNames;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Advanced implementation (support IUnitInfo) for a VST 3 edit controller.\r
-\ingroup vstClasses\r
-- [extends EditController]\r
-*/\r
-//------------------------------------------------------------------------\r
-class EditControllerEx1 : public EditController, public IUnitInfo\r
-{\r
-public:\r
- EditControllerEx1 ();\r
- virtual ~EditControllerEx1 ();\r
-\r
- /** Adds a given unit. */\r
- bool addUnit (Unit* unit);\r
-\r
- /** Adds a given program list. */\r
- bool addProgramList (ProgramList* list);\r
-\r
- /** Returns the ProgramList associated to a given listId. */\r
- ProgramList* getProgramList (ProgramListID listId) const;\r
-\r
- /** Notifies the host about program list changes. */\r
- tresult notifyProgramListChange (ProgramListID listId, int32 programIndex = kAllProgramInvalid);\r
-\r
- //---from IUnitInfo------------------\r
- int32 PLUGIN_API getUnitCount () SMTG_OVERRIDE { return static_cast<int32> (units.size ()); }\r
- tresult PLUGIN_API getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) SMTG_OVERRIDE;\r
-\r
- int32 PLUGIN_API getProgramListCount () SMTG_OVERRIDE;\r
- tresult PLUGIN_API getProgramListInfo (int32 listIndex,\r
- ProgramListInfo& info /*out*/) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getProgramName (ProgramListID listId, int32 programIndex,\r
- String128 name /*out*/) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getProgramInfo (ProgramListID listId, int32 programIndex,\r
- CString attributeId /*in*/,\r
- String128 attributeValue /*out*/) SMTG_OVERRIDE;\r
-\r
- tresult PLUGIN_API hasProgramPitchNames (ProgramListID listId,\r
- int32 programIndex) SMTG_OVERRIDE;\r
- tresult PLUGIN_API getProgramPitchName (ProgramListID listId, int32 programIndex,\r
- int16 midiPitch, String128 name /*out*/) SMTG_OVERRIDE;\r
-\r
- virtual tresult setProgramName (ProgramListID listId, int32 programIndex,\r
- const String128 name /*in*/);\r
-\r
- // units selection --------------------\r
- UnitID PLUGIN_API getSelectedUnit () SMTG_OVERRIDE { return selectedUnit; }\r
- tresult PLUGIN_API selectUnit (UnitID unitId) SMTG_OVERRIDE\r
- {\r
- selectedUnit = unitId;\r
- return kResultTrue;\r
- }\r
-\r
- tresult PLUGIN_API getUnitByBus (MediaType /*type*/, BusDirection /*dir*/, int32 /*busIndex*/,\r
- int32 /*channel*/, UnitID& /*unitId*/ /*out*/) SMTG_OVERRIDE\r
- {\r
- return kResultFalse;\r
- }\r
- tresult PLUGIN_API setUnitProgramData (int32 /*listOrUnitId*/, int32 /*programIndex*/,\r
- IBStream* /*data*/) SMTG_OVERRIDE\r
- {\r
- return kResultFalse;\r
- }\r
-\r
- /** Notifies the host about the selected Unit. */\r
- virtual tresult notifyUnitSelection ();\r
-\r
- //---from IDependent------------------\r
- void PLUGIN_API update (FUnknown* changedUnknown, int32 message) SMTG_OVERRIDE;\r
-\r
- //---Interface---------\r
- OBJ_METHODS (EditControllerEx1, EditController)\r
- DEFINE_INTERFACES\r
- DEF_INTERFACE (IUnitInfo)\r
- END_DEFINE_INTERFACES (EditController)\r
- REFCOUNT_METHODS (EditController)\r
-\r
-protected:\r
- typedef std::vector<IPtr<ProgramList>> ProgramListVector;\r
- typedef std::map<ProgramListID, ProgramListVector::size_type> ProgramIndexMap;\r
- typedef std::vector<IPtr<Unit>> UnitVector;\r
- UnitVector units;\r
- ProgramListVector programLists;\r
- ProgramIndexMap programIndexMap;\r
- UnitID selectedUnit;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstinitiids.cpp\r
-// Created by : Steinberg, 10/2009\r
-// Description : Interface symbols file\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "pluginterfaces/base/funknown.h"\r
-\r
-#include "pluginterfaces/vst/ivstaudioprocessor.h"\r
-#include "pluginterfaces/vst/ivstautomationstate.h"\r
-#include "pluginterfaces/vst/ivstchannelcontextinfo.h"\r
-#include "pluginterfaces/vst/ivstcontextmenu.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstevents.h"\r
-#include "pluginterfaces/vst/ivsthostapplication.h"\r
-#include "pluginterfaces/vst/ivstinterappaudio.h"\r
-#include "pluginterfaces/vst/ivstmessage.h"\r
-#include "pluginterfaces/vst/ivstparameterchanges.h"\r
-#include "pluginterfaces/vst/ivstplugview.h"\r
-#include "pluginterfaces/vst/ivstprefetchablesupport.h"\r
-#include "pluginterfaces/vst/ivstrepresentation.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//----VST 3.0--------------------------------\r
-DEF_CLASS_IID (IComponent)\r
-DEF_CLASS_IID (IAudioProcessor)\r
-DEF_CLASS_IID (IUnitData)\r
-DEF_CLASS_IID (IProgramListData)\r
-\r
-DEF_CLASS_IID (IEditController)\r
-DEF_CLASS_IID (IUnitInfo)\r
-\r
-DEF_CLASS_IID (IConnectionPoint)\r
-\r
-DEF_CLASS_IID (IComponentHandler)\r
-DEF_CLASS_IID (IUnitHandler)\r
-\r
-DEF_CLASS_IID (IParamValueQueue)\r
-DEF_CLASS_IID (IParameterChanges)\r
-\r
-DEF_CLASS_IID (IEventList)\r
-DEF_CLASS_IID (IMessage)\r
-\r
-DEF_CLASS_IID (IHostApplication)\r
-DEF_CLASS_IID (IAttributeList)\r
-\r
-//----VST 3.0.1--------------------------------\r
-DEF_CLASS_IID (IMidiMapping)\r
-\r
-//----VST 3.0.2--------------------------------\r
-DEF_CLASS_IID (IParameterFinder)\r
-\r
-//----VST 3.1----------------------------------\r
-DEF_CLASS_IID (IComponentHandler2)\r
-DEF_CLASS_IID (IEditController2)\r
-DEF_CLASS_IID (IAudioPresentationLatency)\r
-DEF_CLASS_IID (IVst3ToVst2Wrapper)\r
-DEF_CLASS_IID (IVst3ToAUWrapper)\r
-\r
-//----VST 3.5----------------------------------\r
-DEF_CLASS_IID (INoteExpressionController)\r
-DEF_CLASS_IID (IKeyswitchController)\r
-DEF_CLASS_IID (IContextMenuTarget)\r
-DEF_CLASS_IID (IContextMenu)\r
-DEF_CLASS_IID (IComponentHandler3)\r
-DEF_CLASS_IID (IEditControllerHostEditing)\r
-DEF_CLASS_IID (IXmlRepresentationController)\r
-\r
-//----VST 3.6----------------------------------\r
-DEF_CLASS_IID (IInterAppAudioHost)\r
-DEF_CLASS_IID (IInterAppAudioConnectionNotification)\r
-DEF_CLASS_IID (IInterAppAudioPresetManager)\r
-DEF_CLASS_IID (IStreamAttributes)\r
-\r
-//----VST 3.6.5--------------------------------\r
-DEF_CLASS_IID (ChannelContext::IInfoListener)\r
-DEF_CLASS_IID (IPrefetchableSupport)\r
-DEF_CLASS_IID (IUnitHandler2)\r
-DEF_CLASS_IID (IAutomationState)\r
-\r
-//----VST 3.6.8--------------------------------\r
-DEF_CLASS_IID (IComponentHandlerBusActivation)\r
-DEF_CLASS_IID (IVst3ToAAXWrapper)\r
-}\r
-}\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstparameters.cpp\r
-// Created by : Steinberg, 03/2008\r
-// Description : VST Parameter Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstparameters.h"\r
-#include "pluginterfaces/base/futils.h"\r
-#include "pluginterfaces/base/ustring.h"\r
-#include <cstdlib>\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Parameter Implementation\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter () : valueNormalized (0.), precision (4)\r
-{\r
- info = { 0 };\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter (const ParameterInfo& info)\r
-: info (info), valueNormalized (info.defaultNormalizedValue), precision (4)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::Parameter (const TChar* title, ParamID tag, const TChar* units,\r
- ParamValue defaultValueNormalized, int32 stepCount, int32 flags,\r
- UnitID unitID, const TChar* shortTitle)\r
-: precision (4)\r
-{\r
- info = { 0 };\r
-\r
- UString (info.title, str16BufferSize (String128)).assign (title);\r
- if (units)\r
- UString (info.units, str16BufferSize (String128)).assign (units);\r
- if (shortTitle)\r
- UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
- info.stepCount = stepCount;\r
- info.defaultNormalizedValue = valueNormalized = defaultValueNormalized;\r
- info.flags = flags;\r
- info.id = tag;\r
- info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter::~Parameter ()\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Parameter::setNormalized (ParamValue normValue)\r
-{\r
- if (normValue > 1.0)\r
- {\r
- normValue = 1.0;\r
- }\r
- else if (normValue < 0.)\r
- {\r
- normValue = 0.;\r
- }\r
-\r
- if (normValue != valueNormalized)\r
- {\r
- valueNormalized = normValue;\r
- changed ();\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void Parameter::toString (ParamValue normValue, String128 string) const\r
-{\r
- UString wrapper (string, str16BufferSize (String128));\r
- if (info.stepCount == 1)\r
- {\r
- if (normValue > 0.5)\r
- {\r
- wrapper.assign (STR16 ("On"));\r
- }\r
- else\r
- {\r
- wrapper.assign (STR16 ("Off"));\r
- }\r
- }\r
- else\r
- {\r
- if (!wrapper.printFloat (normValue, precision))\r
- string[0] = 0;\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool Parameter::fromString (const TChar* string, ParamValue& normValue) const\r
-{\r
- UString wrapper (const_cast<TChar*> (string), tstrlen (string));\r
- return wrapper.scanFloat (normValue);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue Parameter::toPlain (ParamValue normValue) const\r
-{\r
- return normValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue Parameter::toNormalized (ParamValue plainValue) const\r
-{\r
- return plainValue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// RangeParameter Implementation\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter () : minPlain (0), maxPlain (1)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter (const ParameterInfo& paramInfo, ParamValue min, ParamValue max)\r
-: Parameter (paramInfo), minPlain (min), maxPlain (max)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-RangeParameter::RangeParameter (const TChar* title, ParamID tag, const TChar* units,\r
- ParamValue minPlain, ParamValue maxPlain,\r
- ParamValue defaultValuePlain, int32 stepCount, int32 flags,\r
- UnitID unitID, const TChar* shortTitle)\r
-: minPlain (minPlain), maxPlain (maxPlain)\r
-{\r
- UString (info.title, str16BufferSize (String128)).assign (title);\r
- if (units)\r
- UString (info.units, str16BufferSize (String128)).assign (units);\r
- if (shortTitle)\r
- UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
- info.stepCount = stepCount;\r
- info.defaultNormalizedValue = valueNormalized = toNormalized (defaultValuePlain);\r
- info.flags = flags;\r
- info.id = tag;\r
- info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void RangeParameter::toString (ParamValue _valueNormalized, String128 string) const\r
-{\r
- if (info.stepCount > 1)\r
- {\r
- UString wrapper (string, str16BufferSize (String128));\r
- int64 plain = static_cast<int64> (toPlain (_valueNormalized));\r
- if (!wrapper.printInt (plain))\r
- string[0] = 0;\r
- }\r
- else\r
- {\r
- Parameter::toString (toPlain (_valueNormalized), string);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool RangeParameter::fromString (const TChar* string, ParamValue& _valueNormalized) const\r
-{\r
- UString wrapper (const_cast<TChar*> (string), tstrlen (string));\r
- if (info.stepCount > 1)\r
- {\r
- int64 plainValue;\r
- if (wrapper.scanInt (plainValue))\r
- {\r
- _valueNormalized = toNormalized ((ParamValue)plainValue);\r
- return true;\r
- }\r
- return false;\r
- }\r
- if (wrapper.scanFloat (_valueNormalized))\r
- {\r
- if (_valueNormalized < getMin ())\r
- _valueNormalized = getMin ();\r
- else if (_valueNormalized > getMax ())\r
- _valueNormalized = getMax ();\r
- _valueNormalized = toNormalized (_valueNormalized);\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue RangeParameter::toPlain (ParamValue _valueNormalized) const\r
-{\r
- if (info.stepCount > 1)\r
- return Min<int32> (info.stepCount, (int32) (_valueNormalized * (info.stepCount + 1))) +\r
- getMin ();\r
- return _valueNormalized * (getMax () - getMin ()) + getMin ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue RangeParameter::toNormalized (ParamValue plainValue) const\r
-{\r
- if (info.stepCount > 1)\r
- return (plainValue - getMin ()) / info.stepCount;\r
- return (plainValue - getMin ()) / (getMax () - getMin ());\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// StringListParameter Implementation\r
-//------------------------------------------------------------------------\r
-StringListParameter::StringListParameter (const ParameterInfo& paramInfo) : Parameter (paramInfo)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-StringListParameter::StringListParameter (const TChar* title, ParamID tag, const TChar* units,\r
- int32 flags, UnitID unitID, const TChar* shortTitle)\r
-{\r
- UString (info.title, str16BufferSize (String128)).assign (title);\r
- if (units)\r
- UString (info.units, str16BufferSize (String128)).assign (units);\r
- if (shortTitle)\r
- UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
- info.stepCount = -1;\r
- info.defaultNormalizedValue = 0;\r
- info.flags = flags;\r
- info.id = tag;\r
- info.unitId = unitID;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-StringListParameter::~StringListParameter ()\r
-{\r
- for (StringVector::iterator it = strings.begin (), end = strings.end (); it != end; ++it)\r
- std::free (*it);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void StringListParameter::appendString (const String128 string)\r
-{\r
- int32 length = strlen16 (string);\r
- TChar* buffer = (TChar*)std::malloc ((length + 1) * sizeof (TChar));\r
- if (!buffer)\r
- return;\r
-\r
- memcpy (buffer, string, length * sizeof (TChar));\r
- buffer[length] = 0;\r
- strings.push_back (buffer);\r
- info.stepCount++;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool StringListParameter::replaceString (int32 index, const String128 string)\r
-{\r
- TChar* str = strings.at (index);\r
- if (!str)\r
- return false;\r
-\r
- int32 length = strlen16 (string);\r
- TChar* buffer = (TChar*)malloc ((length + 1) * sizeof (TChar));\r
- if (!buffer)\r
- return false;\r
-\r
- memcpy (buffer, string, length * sizeof (TChar));\r
- buffer[length] = 0;\r
- strings[index] = buffer;\r
- std::free (str);\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void StringListParameter::toString (ParamValue _valueNormalized, String128 string) const\r
-{\r
- int32 index = (int32)toPlain (_valueNormalized);\r
- const TChar* valueString = strings.at (index);\r
- if (valueString)\r
- {\r
- UString (string, str16BufferSize (String128)).assign (valueString);\r
- }\r
- else\r
- string[0] = 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool StringListParameter::fromString (const TChar* string, ParamValue& _valueNormalized) const\r
-{\r
- int32 index = 0;\r
- for (StringVector::const_iterator it = strings.begin (), end = strings.end (); it != end;\r
- ++it, ++index)\r
- {\r
- if (strcmp16 (*it, string) == 0)\r
- {\r
- _valueNormalized = toNormalized ((ParamValue)index);\r
- return true;\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue StringListParameter::toPlain (ParamValue _valueNormalized) const\r
-{\r
- if (info.stepCount <= 0)\r
- return 0;\r
- return Min<int32> (info.stepCount, (int32) (_valueNormalized * (info.stepCount + 1)));\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParamValue StringListParameter::toNormalized (ParamValue plainValue) const\r
-{\r
- if (info.stepCount <= 0)\r
- return 0;\r
- return plainValue / (ParamValue)info.stepCount;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ParameterContainer Implementation\r
-//------------------------------------------------------------------------\r
-ParameterContainer::ParameterContainer () : params (0)\r
-{\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ParameterContainer::~ParameterContainer ()\r
-{\r
- if (params)\r
- delete params;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-void ParameterContainer::init (int32 initialSize, int32 /*resizeDelta*/)\r
-{\r
- if (!params)\r
- {\r
- params = new ParameterPtrVector;\r
- if (initialSize > 0)\r
- params->reserve (initialSize);\r
- }\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (Parameter* p)\r
-{\r
- if (!params)\r
- init ();\r
- id2index[p->getInfo ().id] = params->size ();\r
- params->push_back (IPtr<Parameter> (p, false));\r
- return p;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (const ParameterInfo& info)\r
-{\r
- if (!params)\r
- init ();\r
- Parameter* p = new Parameter (info);\r
- if (addParameter (p))\r
- return p;\r
- p->release ();\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::getParameter (ParamID tag)\r
-{\r
- if (params)\r
- {\r
- IndexMap::const_iterator it = id2index.find (tag);\r
- if (it != id2index.end ())\r
- return params->at (it->second);\r
- }\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-Parameter* ParameterContainer::addParameter (const TChar* title, const TChar* units,\r
- int32 stepCount, ParamValue defaultNormalizedValue,\r
- int32 flags, int32 tag, UnitID unitID, const TChar* shortTitle)\r
-{\r
- if (!title)\r
- {\r
- return nullptr;\r
- }\r
-\r
- ParameterInfo info = {0};\r
-\r
- UString (info.title, str16BufferSize (String128)).assign (title);\r
- if (units)\r
- UString (info.units, str16BufferSize (String128)).assign (units);\r
- if (shortTitle)\r
- UString (info.shortTitle, str16BufferSize (String128)).assign (shortTitle);\r
-\r
- info.stepCount = stepCount;\r
- info.defaultNormalizedValue = defaultNormalizedValue;\r
- info.flags = flags;\r
- info.id = (tag >= 0) ? tag : getParameterCount ();\r
- info.unitId = unitID;\r
-\r
- return addParameter (info);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstparameters.h\r
-// Created by : Steinberg, 03/2008\r
-// Description : VST Parameter Implementation\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "base/source/fobject.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include <map>\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a Parameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class Parameter : public FObject\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- Parameter ();\r
- Parameter (const ParameterInfo&);\r
- Parameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
- ParamValue defaultValueNormalized = 0., int32 stepCount = 0,\r
- int32 flags = ParameterInfo::kCanAutomate, UnitID unitID = kRootUnitId,\r
- const TChar* shortTitle = nullptr);\r
- virtual ~Parameter ();\r
-\r
- /** Returns its read only info. */\r
- const ParameterInfo& getInfo () const { return info; }\r
-\r
- /** Returns its writable info. */\r
- ParameterInfo& getInfo () { return info; }\r
-\r
- /** Sets its associated UnitId. */\r
- void setUnitID (UnitID id) { info.unitId = id; }\r
- /** Gets its associated UnitId. */\r
- UnitID getUnitID () { return info.unitId; }\r
-\r
- /** Gets its normalized value [0.0, 1.0]. */\r
- ParamValue getNormalized () const { return valueNormalized; }\r
- /** Sets its normalized value [0.0, 1.0]. */\r
- virtual bool setNormalized (ParamValue v);\r
-\r
- /** Converts a normalized value to a string. */\r
- virtual void toString (ParamValue valueNormalized, String128 string) const;\r
- /** Converts a string to a normalized value. */\r
- virtual bool fromString (const TChar* string, ParamValue& valueNormalized) const;\r
-\r
- /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
- virtual ParamValue toPlain (ParamValue valueNormalized) const;\r
- /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
- virtual ParamValue toNormalized (ParamValue plainValue) const;\r
-\r
- /** Gets the current precision (used for string representation of float). */\r
- int32 getPrecision () const { return precision; }\r
- /** Sets the precision for string representation of float value (for example 4.34 with 2 as\r
- * precision). */\r
- void setPrecision (int32 val) { precision = val; }\r
-\r
- OBJ_METHODS (Parameter, FObject)\r
-//------------------------------------------------------------------------\r
-protected:\r
- ParameterInfo info;\r
- ParamValue valueNormalized;\r
- int32 precision;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a RangeParameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class RangeParameter : public Parameter\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- RangeParameter (const ParameterInfo& paramInfo, ParamValue min, ParamValue max);\r
- RangeParameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
- ParamValue minPlain = 0., ParamValue maxPlain = 1.,\r
- ParamValue defaultValuePlain = 0., int32 stepCount = 0,\r
- int32 flags = ParameterInfo::kCanAutomate, UnitID unitID = kRootUnitId,\r
- const TChar* shortTitle = nullptr);\r
-\r
- /** Gets the minimum plain value, same as toPlain (0). */\r
- virtual ParamValue getMin () const { return minPlain; }\r
- /** Sets the minimum plain value. */\r
- virtual void setMin (ParamValue value) { minPlain = value; }\r
- /** Gets the maximum plain value, same as toPlain (1). */\r
- virtual ParamValue getMax () const { return maxPlain; }\r
- /** Sets the maximum plain value. */\r
- virtual void setMax (ParamValue value) { maxPlain = value; }\r
-\r
- /** Converts a normalized value to a string. */\r
- void toString (ParamValue _valueNormalized, String128 string) const SMTG_OVERRIDE;\r
- /** Converts a string to a normalized value. */\r
- bool fromString (const TChar* string, ParamValue& _valueNormalized) const SMTG_OVERRIDE;\r
-\r
- /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
- ParamValue toPlain (ParamValue _valueNormalized) const SMTG_OVERRIDE;\r
- /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
- ParamValue toNormalized (ParamValue plainValue) const SMTG_OVERRIDE;\r
-\r
- OBJ_METHODS (RangeParameter, Parameter)\r
-//------------------------------------------------------------------------\r
-protected:\r
- RangeParameter ();\r
-\r
- ParamValue minPlain;\r
- ParamValue maxPlain;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Description of a StringListParameter.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class StringListParameter : public Parameter\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- StringListParameter (const ParameterInfo& paramInfo);\r
- StringListParameter (const TChar* title, ParamID tag, const TChar* units = nullptr,\r
- int32 flags = ParameterInfo::kCanAutomate | ParameterInfo::kIsList,\r
- UnitID unitID = kRootUnitId, const TChar* shortTitle= nullptr);\r
- virtual ~StringListParameter ();\r
-\r
- /** Appends a string and increases the stepCount. */\r
- virtual void appendString (const String128 string);\r
- /** Replaces the string at index. Index must be between 0 and stepCount+1 */\r
- virtual bool replaceString (int32 index, const String128 string);\r
-\r
- /** Converts a normalized value to a string. */\r
- void toString (ParamValue _valueNormalized, String128 string) const SMTG_OVERRIDE;\r
- /** Converts a string to a normalized value. */\r
- bool fromString (const TChar* string, ParamValue& _valueNormalized) const SMTG_OVERRIDE;\r
-\r
- /** Converts a normalized value to plain value (e.g. 0.5 to 10000.0Hz). */\r
- ParamValue toPlain (ParamValue _valueNormalized) const SMTG_OVERRIDE;\r
- /** Converts a plain value to a normalized value (e.g. 10000 to 0.5). */\r
- ParamValue toNormalized (ParamValue plainValue) const SMTG_OVERRIDE;\r
-\r
- OBJ_METHODS (StringListParameter, Parameter)\r
-//------------------------------------------------------------------------\r
-protected:\r
- typedef std::vector<TChar*> StringVector;\r
- StringVector strings;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Collection of parameters.\r
-\ingroup vstClasses */\r
-//------------------------------------------------------------------------\r
-class ParameterContainer\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- ParameterContainer ();\r
- ~ParameterContainer ();\r
-\r
- /** Init param array. */\r
- void init (int32 initialSize = 10, int32 resizeDelta = 100);\r
-\r
- /** Creates and adds a new parameter from a ParameterInfo. */\r
- Parameter* addParameter (const ParameterInfo& info);\r
-\r
- /** Creates and adds a new parameter with given properties. */\r
- Parameter* addParameter (const TChar* title, const TChar* units = nullptr, int32 stepCount = 0,\r
- ParamValue defaultValueNormalized = 0.,\r
- int32 flags = ParameterInfo::kCanAutomate, int32 tag = -1,\r
- UnitID unitID = kRootUnitId, const TChar* shortTitle = nullptr);\r
-\r
- /** Adds a given parameter. */\r
- Parameter* addParameter (Parameter* p);\r
-\r
- /** Returns the count of parameters. */\r
- int32 getParameterCount () const { return params ? static_cast<int32> (params->size ()) : 0; }\r
-\r
- /** Gets parameter by index. */\r
- Parameter* getParameterByIndex (int32 index) { return params ? params->at (index) : nullptr; }\r
-\r
- /** Removes all parameters. */\r
- void removeAll ()\r
- {\r
- if (params)\r
- params->clear ();\r
- id2index.clear ();\r
- }\r
-\r
- /** Gets parameter by ID. */\r
- Parameter* getParameter (ParamID tag);\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- typedef std::vector<IPtr<Parameter>> ParameterPtrVector;\r
- typedef std::map<ParamID, ParameterPtrVector::size_type> IndexMap;\r
- ParameterPtrVector* params;\r
- IndexMap id2index;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstpresetfile.cpp\r
-// Created by : Steinberg, 03/2006\r
-// Description : VST 3 Preset File Format\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "vstpresetfile.h"\r
-\r
-#include <algorithm>\r
-\r
-\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-// Preset Chunk IDs\r
-//------------------------------------------------------------------------\r
-static const ChunkID commonChunks[kNumPresetChunks] = {\r
- {'V', 'S', 'T', '3'}, // kHeader\r
- {'C', 'o', 'm', 'p'}, // kComponentState\r
- {'C', 'o', 'n', 't'}, // kControllerState\r
- {'P', 'r', 'o', 'g'}, // kProgramData\r
- {'I', 'n', 'f', 'o'}, // kMetaInfo\r
- {'L', 'i', 's', 't'} // kChunkList\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-// Preset Header: header id + version + class id + list offset\r
-static const int32 kFormatVersion = 1;\r
-static const int32 kClassIDSize = 32; // ASCII-encoded FUID\r
-static const int32 kHeaderSize = sizeof (ChunkID) + sizeof (int32) + kClassIDSize + sizeof (TSize);\r
-static const int32 kListOffsetPos = kHeaderSize - sizeof (TSize);\r
-\r
-//------------------------------------------------------------------------\r
-const ChunkID& getChunkID (ChunkType type)\r
-{\r
- return commonChunks[type];\r
-}\r
-\r
-#ifdef verify\r
-#undef verify\r
-#endif\r
-\r
-//------------------------------------------------------------------------\r
-inline bool verify (tresult result)\r
-{\r
- return result == kResultOk || result == kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool copyStream (IBStream* inStream, IBStream* outStream)\r
-{\r
- if (!inStream || !outStream)\r
- return false;\r
-\r
- int8 buffer[8192];\r
- int32 read = 0;\r
- int32 written = 0;\r
- while (inStream->read (buffer, 8192, &read) == kResultTrue && read > 0)\r
- {\r
- if (outStream->write (buffer, read, &written) != kResultTrue)\r
- {\r
- return false;\r
- }\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// PresetFile\r
-//------------------------------------------------------------------------\r
-bool PresetFile::savePreset (IBStream* stream, const FUID& classID, IComponent* component,\r
- IEditController* editController, const char* xmlBuffer, int32 xmlSize)\r
-{\r
- PresetFile pf (stream);\r
- pf.setClassID (classID);\r
- if (!pf.writeHeader ())\r
- return false;\r
-\r
- if (!pf.storeComponentState (component))\r
- return false;\r
-\r
- if (editController && !pf.storeControllerState (editController))\r
- return false;\r
-\r
- if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))\r
- return false;\r
-\r
- return pf.writeChunkList ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::savePreset (IBStream* stream, const FUID& classID, IBStream* componentStream,\r
- IBStream* editStream, const char* xmlBuffer, int32 xmlSize)\r
-{\r
- PresetFile pf (stream);\r
- pf.setClassID (classID);\r
- if (!pf.writeHeader ())\r
- return false;\r
-\r
- if (!pf.storeComponentState (componentStream))\r
- return false;\r
-\r
- if (editStream && !pf.storeControllerState (editStream))\r
- return false;\r
-\r
- if (xmlBuffer && !pf.writeMetaInfo (xmlBuffer, xmlSize))\r
- return false;\r
-\r
- return pf.writeChunkList ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::loadPreset (IBStream* stream, const FUID& classID, IComponent* component,\r
- IEditController* editController, std::vector<FUID>* otherClassIDArray)\r
-{\r
- PresetFile pf (stream);\r
- if (!pf.readChunkList ())\r
- return false;\r
-\r
- if (pf.getClassID () != classID)\r
- {\r
- if (otherClassIDArray)\r
- {\r
- // continue to load only if found in supported ID else abort load\r
- if (std::find (otherClassIDArray->begin (), otherClassIDArray->end (),\r
- pf.getClassID ()) == otherClassIDArray->end ())\r
- return false;\r
- }\r
- else\r
- return false;\r
- }\r
-\r
- if (!pf.restoreComponentState (component))\r
- return false;\r
-\r
- if (editController)\r
- {\r
- // assign component state to controller\r
- if (!pf.restoreComponentState (editController))\r
- return false;\r
-\r
- // restore controller-only state (if present)\r
- if (pf.contains (kControllerState) && !pf.restoreControllerState (editController))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-PresetFile::PresetFile (IBStream* stream) : stream (stream), entryCount (0)\r
-{\r
- memset (entries, 0, sizeof (entries));\r
-\r
- if (stream)\r
- stream->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-PresetFile::~PresetFile ()\r
-{\r
- if (stream)\r
- stream->release ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const PresetFile::Entry* PresetFile::getEntry (ChunkType which) const\r
-{\r
- const ChunkID& id = getChunkID (which);\r
- for (int32 i = 0; i < entryCount; i++)\r
- if (isEqualID (entries[i].id, id))\r
- return &entries[i];\r
- return nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-const PresetFile::Entry* PresetFile::getLastEntry () const\r
-{\r
- return entryCount > 0 ? &entries[entryCount - 1] : nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readID (ChunkID id)\r
-{\r
- int32 numBytesRead = 0;\r
- stream->read (id, sizeof (ChunkID), &numBytesRead);\r
- return numBytesRead == sizeof (ChunkID);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeID (const ChunkID id)\r
-{\r
- int32 numBytesWritten = 0;\r
- stream->write ((void*)id, sizeof (ChunkID), &numBytesWritten);\r
- return numBytesWritten == sizeof (ChunkID);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readEqualID (const ChunkID id)\r
-{\r
- ChunkID temp = {0};\r
- return readID (temp) && isEqualID (temp, id);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readSize (TSize& size)\r
-{\r
- int32 numBytesRead = 0;\r
- stream->read (&size, sizeof (TSize), &numBytesRead);\r
-#if BYTEORDER == kBigEndian\r
- SWAP_64 (size)\r
-#endif\r
- return numBytesRead == sizeof (TSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeSize (TSize size)\r
-{\r
-#if BYTEORDER == kBigEndian\r
- SWAP_64 (size)\r
-#endif\r
- int32 numBytesWritten = 0;\r
- stream->write (&size, sizeof (TSize), &numBytesWritten);\r
- return numBytesWritten == sizeof (TSize);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readInt32 (int32& value)\r
-{\r
- int32 numBytesRead = 0;\r
- stream->read (&value, sizeof (int32), &numBytesRead);\r
-#if BYTEORDER == kBigEndian\r
- SWAP_32 (value)\r
-#endif\r
- return numBytesRead == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeInt32 (int32 value)\r
-{\r
-#if BYTEORDER == kBigEndian\r
- SWAP_32 (value)\r
-#endif\r
- int32 numBytesWritten = 0;\r
- stream->write (&value, sizeof (int32), &numBytesWritten);\r
- return numBytesWritten == sizeof (int32);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekTo (TSize offset)\r
-{\r
- int64 result = -1;\r
- stream->seek (offset, IBStream::kIBSeekSet, &result);\r
- return result == offset;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readChunkList ()\r
-{\r
- seekTo (0);\r
- entryCount = 0;\r
-\r
- char8 classString[kClassIDSize + 1] = {0};\r
-\r
- // Read header\r
- int32 version = 0;\r
- TSize listOffset = 0;\r
- if (!(readEqualID (getChunkID (kHeader)) && readInt32 (version) &&\r
- verify (stream->read (classString, kClassIDSize)) && readSize (listOffset) &&\r
- listOffset > 0 && seekTo (listOffset)))\r
- return false;\r
-\r
- classID.fromString (classString);\r
-\r
- // Read list\r
- int32 count = 0;\r
- if (!readEqualID (getChunkID (kChunkList)))\r
- return false;\r
- if (!readInt32 (count))\r
- return false;\r
-\r
- if (count > kMaxEntries)\r
- count = kMaxEntries;\r
-\r
- for (int32 i = 0; i < count; i++)\r
- {\r
- Entry& e = entries[i];\r
- if (!(readID (e.id) && readSize (e.offset) && readSize (e.size)))\r
- break;\r
-\r
- entryCount++;\r
- }\r
-\r
- return entryCount > 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeHeader ()\r
-{\r
- // header id + version + class id + list offset (unknown yet)\r
-\r
- char8 classString[kClassIDSize + 1] = {0};\r
- classID.toString (classString);\r
-\r
- return seekTo (0) && writeID (getChunkID (kHeader)) && writeInt32 (kFormatVersion) &&\r
- verify (stream->write (classString, kClassIDSize)) && writeSize (0);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeChunkList ()\r
-{\r
- // Update list offset\r
- TSize pos = 0;\r
- stream->tell (&pos);\r
- if (!(seekTo (kListOffsetPos) && writeSize (pos) && seekTo (pos)))\r
- return false;\r
-\r
- // Write list\r
- if (!writeID (getChunkID (kChunkList)))\r
- return false;\r
- if (!writeInt32 (entryCount))\r
- return false;\r
-\r
- for (int32 i = 0; i < entryCount; i++)\r
- {\r
- Entry& e = entries[i];\r
- if (!(writeID (e.id) && writeSize (e.offset) && writeSize (e.size)))\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::beginChunk (Entry& e, ChunkType which)\r
-{\r
- if (entryCount >= kMaxEntries)\r
- return false;\r
-\r
- const ChunkID& id = getChunkID (which);\r
- memcpy (e.id, &id, sizeof (ChunkID));\r
- stream->tell (&e.offset);\r
- e.size = 0;\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::endChunk (Entry& e)\r
-{\r
- if (entryCount >= kMaxEntries)\r
- return false;\r
-\r
- TSize pos = 0;\r
- stream->tell (&pos);\r
- e.size = pos - e.offset;\r
- entries[entryCount++] = e;\r
- return true;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::readMetaInfo (char* xmlBuffer, int32& size)\r
-{\r
- bool result = false;\r
- const Entry* e = getEntry (kMetaInfo);\r
- if (e)\r
- {\r
- if (xmlBuffer)\r
- {\r
- result = seekTo (e->offset) && verify (stream->read (xmlBuffer, size, &size));\r
- }\r
- else\r
- {\r
- size = (int32)e->size;\r
- result = size > 0;\r
- }\r
- }\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeMetaInfo (const char* xmlBuffer, int32 size, bool forceWriting)\r
-{\r
- if (contains (kMetaInfo)) // already exists!\r
- {\r
- if (!forceWriting)\r
- return false;\r
- }\r
- if (!prepareMetaInfoUpdate ())\r
- return false;\r
-\r
- if (size == -1)\r
- size = (int32)strlen (xmlBuffer);\r
-\r
- Entry e = {};\r
- return beginChunk (e, kMetaInfo) && verify (stream->write ((void*)xmlBuffer, size)) &&\r
- endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::prepareMetaInfoUpdate ()\r
-{\r
- TSize writePos = 0;\r
- const Entry* e = getEntry (kMetaInfo);\r
- if (e)\r
- {\r
- // meta info must be the last entry!\r
- if (e != getLastEntry ())\r
- return false;\r
-\r
- writePos = e->offset;\r
- entryCount--;\r
- }\r
- else\r
- {\r
- // entries must be sorted ascending by offset!\r
- e = getLastEntry ();\r
- writePos = e ? e->offset + e->size : kHeaderSize;\r
- }\r
-\r
- return seekTo (writePos);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::writeChunk (const void* data, int32 size, ChunkType which)\r
-{\r
- if (contains (which)) // already exists!\r
- return false;\r
-\r
- Entry e = {};\r
- return beginChunk (e, which) && verify (stream->write ((void*)data, size)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekToComponentState ()\r
-{\r
- const Entry* e = getEntry (kComponentState);\r
- return e && seekTo (e->offset);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeComponentState (IComponent* component)\r
-{\r
- if (contains (kComponentState)) // already exists!\r
- return false;\r
-\r
- Entry e = {};\r
- return beginChunk (e, kComponentState) && verify (component->getState (stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeComponentState (IBStream* componentStream)\r
-{\r
- if (contains (kComponentState)) // already exists!\r
- return false;\r
-\r
- Entry e = {};\r
- return beginChunk (e, kComponentState) && copyStream (componentStream, stream) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreComponentState (IComponent* component)\r
-{\r
- const Entry* e = getEntry (kComponentState);\r
- if (e)\r
- {\r
- ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
- FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
- return verify (component->setState (readOnlyBStream));\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreComponentState (IEditController* editController)\r
-{\r
- const Entry* e = getEntry (kComponentState);\r
- if (e)\r
- {\r
- ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
- FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
- return verify (editController->setComponentState (readOnlyBStream));\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::seekToControllerState ()\r
-{\r
- const Entry* e = getEntry (kControllerState);\r
- return e && seekTo (e->offset);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeControllerState (IEditController* editController)\r
-{\r
- if (contains (kControllerState)) // already exists!\r
- return false;\r
-\r
- Entry e = {};\r
- return beginChunk (e, kControllerState) && verify (editController->getState (stream)) &&\r
- endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeControllerState (IBStream* editStream)\r
-{\r
- if (contains (kControllerState)) // already exists!\r
- return false;\r
-\r
- Entry e = {};\r
- return beginChunk (e, kControllerState) && copyStream (editStream, stream) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreControllerState (IEditController* editController)\r
-{\r
- const Entry* e = getEntry (kControllerState);\r
- if (e)\r
- {\r
- ReadOnlyBStream* readOnlyBStream = new ReadOnlyBStream (stream, e->offset, e->size);\r
- FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
- return verify (editController->setState (readOnlyBStream));\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IBStream* inStream, ProgramListID listID)\r
-{\r
- if (contains (kProgramData)) // already exists!\r
- return false;\r
-\r
- writeHeader ();\r
-\r
- Entry e = {};\r
- if (beginChunk (e, kProgramData))\r
- {\r
- if (writeInt32 (listID))\r
- {\r
- if (!copyStream (inStream, stream))\r
- return false;\r
-\r
- return endChunk (e);\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IProgramListData* programListData, ProgramListID listID,\r
- int32 programIndex)\r
-{\r
- if (contains (kProgramData)) // already exists!\r
- return false;\r
-\r
- writeHeader ();\r
-\r
- Entry e = {};\r
- return beginChunk (e, kProgramData) && writeInt32 (listID) &&\r
- verify (programListData->getProgramData (listID, programIndex, stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IProgramListData* programListData,\r
- ProgramListID* programListID, int32 programIndex)\r
-{\r
- const Entry* e = getEntry (kProgramData);\r
- ProgramListID savedProgramListID = -1;\r
- if (e && seekTo (e->offset))\r
- {\r
- if (readInt32 (savedProgramListID))\r
- {\r
- if (programListID && *programListID != savedProgramListID)\r
- return false;\r
-\r
- int32 alreadyRead = sizeof (int32);\r
- ReadOnlyBStream* readOnlyBStream =\r
- new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
- FReleaser readOnlyBStreamReleaser (readOnlyBStream);\r
- return programListData && verify (programListData->setProgramData (\r
- savedProgramListID, programIndex, readOnlyBStream));\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::storeProgramData (IUnitData* unitData, UnitID unitID)\r
-{\r
- if (contains (kProgramData)) // already exists!\r
- return false;\r
-\r
- writeHeader ();\r
-\r
- Entry e = {};\r
- return beginChunk (e, kProgramData) && writeInt32 (unitID) &&\r
- verify (unitData->getUnitData (unitID, stream)) && endChunk (e);\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IUnitData* unitData, UnitID* unitId)\r
-{\r
- const Entry* e = getEntry (kProgramData);\r
- UnitID savedUnitID = -1;\r
- if (e && seekTo (e->offset))\r
- {\r
- if (readInt32 (savedUnitID))\r
- {\r
- if (unitId && *unitId != savedUnitID)\r
- return false;\r
-\r
- int32 alreadyRead = sizeof (int32);\r
- ReadOnlyBStream* readOnlyBStream =\r
- new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
- FReleaser readOnlyStreamReleaser (readOnlyBStream);\r
- return (unitData && verify (unitData->setUnitData (savedUnitID, readOnlyBStream)));\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::restoreProgramData (IUnitInfo* unitInfo, int32 unitProgramListID,\r
- int32 programIndex)\r
-{\r
- const Entry* e = getEntry (kProgramData);\r
- int32 savedProgramListID = -1;\r
- if (e && seekTo (e->offset))\r
- {\r
- if (readInt32 (savedProgramListID))\r
- {\r
- if (unitProgramListID != savedProgramListID)\r
- return false;\r
-\r
- int32 alreadyRead = sizeof (int32);\r
- ReadOnlyBStream* readOnlyBStream =\r
- new ReadOnlyBStream (stream, e->offset + alreadyRead, e->size - alreadyRead);\r
- FReleaser readOnlyStreamReleaser (readOnlyBStream);\r
- return (unitInfo && unitInfo->setUnitProgramData (unitProgramListID, programIndex,\r
- readOnlyBStream));\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-bool PresetFile::getUnitProgramListID (int32& unitProgramListID)\r
-{\r
- const Entry* e = getEntry (kProgramData);\r
- if (e && seekTo (e->offset))\r
- {\r
- if (readInt32 (unitProgramListID))\r
- {\r
- return true;\r
- }\r
- }\r
- return false;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// FileStream implementation\r
-//------------------------------------------------------------------------\r
-IBStream* FileStream::open (const char* filename, const char* mode)\r
-{\r
- FILE* file = fopen (filename, mode);\r
- return file ? new FileStream (file) : nullptr;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-FileStream::FileStream (FILE* file)\r
-: file (file) {FUNKNOWN_CTOR}\r
-\r
-//------------------------------------------------------------------------\r
-FileStream::~FileStream ()\r
-{\r
- fclose (file);\r
- FUNKNOWN_DTOR\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (FileStream, IBStream, IBStream::iid)\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
- size_t result = fread (buffer, 1, numBytes, file);\r
- if (numBytesRead)\r
- *numBytesRead = (int32)result;\r
- return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
- size_t result = fwrite (buffer, 1, numBytes, file);\r
- if (numBytesWritten)\r
- *numBytesWritten = (int32)result;\r
- return static_cast<int32> (result) == numBytes ? kResultOk : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
- if (fseek (file, (int32)pos, mode) == 0)\r
- {\r
- if (result)\r
- *result = ftell (file);\r
- return kResultOk;\r
- }\r
- return kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API FileStream::tell (int64* pos)\r
-{\r
- if (pos)\r
- *pos = ftell (file);\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// ReadOnlyBStream implementation\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_REFCOUNT (ReadOnlyBStream)\r
-\r
-//------------------------------------------------------------------------\r
-ReadOnlyBStream::ReadOnlyBStream (IBStream* sourceStream, TSize sourceOffset, TSize sectionSize)\r
-: sourceStream (sourceStream)\r
-, sourceOffset (sourceOffset)\r
-, sectionSize (sectionSize)\r
-, seekPosition (0)\r
-{\r
- FUNKNOWN_CTOR\r
- if (sourceStream)\r
- sourceStream->addRef ();\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-ReadOnlyBStream::~ReadOnlyBStream ()\r
-{\r
- if (sourceStream)\r
- sourceStream->release ();\r
-\r
- FUNKNOWN_DTOR\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::queryInterface (const TUID _iid, void** obj)\r
-{\r
- return sourceStream ? sourceStream->queryInterface (_iid, obj) : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
- if (numBytesRead)\r
- *numBytesRead = 0;\r
-\r
- if (!sourceStream)\r
- return kNotInitialized;\r
-\r
- int32 maxBytesToRead = (int32) (sectionSize - seekPosition);\r
- if (numBytes > maxBytesToRead)\r
- numBytes = maxBytesToRead;\r
- if (numBytes <= 0)\r
- return kResultOk;\r
-\r
- tresult result = sourceStream->seek (sourceOffset + seekPosition, kIBSeekSet);\r
- if (result != kResultOk)\r
- return result;\r
-\r
- int32 numRead = 0;\r
- result = sourceStream->read (buffer, numBytes, &numRead);\r
-\r
- if (numRead > 0)\r
- seekPosition += numRead;\r
- if (numBytesRead)\r
- *numBytesRead = numRead;\r
-\r
- return result;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::write (void* /*buffer*/, int32 /*numBytes*/,\r
- int32* numBytesWritten)\r
-{\r
- if (numBytesWritten)\r
- *numBytesWritten = 0;\r
-\r
- return kNotImplemented;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
- switch (mode)\r
- {\r
- case kIBSeekSet: seekPosition = pos; break;\r
-\r
- case kIBSeekCur: seekPosition += pos; break;\r
-\r
- case kIBSeekEnd: seekPosition = sectionSize + pos; break;\r
- }\r
-\r
- if (seekPosition < 0)\r
- seekPosition = 0;\r
- if (seekPosition > sectionSize)\r
- seekPosition = sectionSize;\r
-\r
- if (result)\r
- *result = seekPosition;\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API ReadOnlyBStream::tell (int64* pos)\r
-{\r
- if (pos)\r
- *pos = seekPosition;\r
- return kResultOk;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-// BufferStream implementation\r
-//------------------------------------------------------------------------\r
-IMPLEMENT_FUNKNOWN_METHODS (BufferStream, IBStream, IBStream::iid)\r
-\r
-//------------------------------------------------------------------------\r
-BufferStream::BufferStream () {FUNKNOWN_CTOR}\r
-\r
-//------------------------------------------------------------------------\r
-BufferStream::~BufferStream () {FUNKNOWN_DTOR}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::read (void* buffer, int32 numBytes, int32* numBytesRead)\r
-{\r
- uint32 size = mBuffer.get (buffer, numBytes);\r
- if (numBytesRead)\r
- *numBytesRead = size;\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::write (void* buffer, int32 numBytes, int32* numBytesWritten)\r
-{\r
- bool res = mBuffer.put (buffer, numBytes);\r
- if (numBytesWritten)\r
- *numBytesWritten = res ? numBytes : 0;\r
-\r
- return res ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::seek (int64 pos, int32 mode, int64* result)\r
-{\r
- bool res = false;\r
- switch (mode)\r
- {\r
- //--- -----------------\r
- case IBStream::kIBSeekSet:\r
- {\r
- int64 tmp = pos;\r
- if (tmp < 0)\r
- tmp = 0;\r
- res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
- }\r
- break;\r
-\r
- //--- -----------------\r
- case IBStream::kIBSeekCur:\r
- {\r
- int64 tmp = mBuffer.getFillSize () + pos;\r
- if (tmp < 0)\r
- tmp = 0;\r
- res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
- }\r
- break;\r
-\r
- //--- -----------------\r
- case IBStream::kIBSeekEnd:\r
- {\r
- int64 tmp = mBuffer.getSize () - pos;\r
- if (tmp < 0)\r
- tmp = 0;\r
- res = mBuffer.setFillSize (static_cast<uint32> (tmp));\r
- }\r
- break;\r
- }\r
- if (res && result)\r
- *result = mBuffer.getFillSize ();\r
-\r
- return res ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-tresult PLUGIN_API BufferStream::tell (int64* pos)\r
-{\r
- if (pos)\r
- *pos = mBuffer.getFillSize ();\r
- return pos ? kResultTrue : kResultFalse;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
+++ /dev/null
-//-----------------------------------------------------------------------------\r
-// Project : VST SDK\r
-//\r
-// Category : Helpers\r
-// Filename : public.sdk/source/vst/vstpresetfile.h\r
-// Created by : Steinberg, 03/2006\r
-// Description : VST 3 Preset File Format\r
-//\r
-//-----------------------------------------------------------------------------\r
-// LICENSE\r
-// (c) 2018, Steinberg Media Technologies GmbH, All Rights Reserved\r
-//-----------------------------------------------------------------------------\r
-// Redistribution and use in source and binary forms, with or without modification,\r
-// are permitted provided that the following conditions are met:\r
-//\r
-// * Redistributions of source code must retain the above copyright notice,\r
-// this list of conditions and the following disclaimer.\r
-// * Redistributions in binary form must reproduce the above copyright notice,\r
-// this list of conditions and the following disclaimer in the documentation\r
-// and/or other materials provided with the distribution.\r
-// * Neither the name of the Steinberg Media Technologies nor the names of its\r
-// contributors may be used to endorse or promote products derived from this\r
-// software without specific prior written permission.\r
-//\r
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
-// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
-// OF THE POSSIBILITY OF SUCH DAMAGE.\r
-//-----------------------------------------------------------------------------\r
-\r
-#pragma once\r
-\r
-#include "pluginterfaces/vst/ivstcomponent.h"\r
-#include "pluginterfaces/vst/ivsteditcontroller.h"\r
-#include "pluginterfaces/vst/ivstunits.h"\r
-\r
-#include "pluginterfaces/base/ibstream.h"\r
-#include "base/source/fbuffer.h"\r
-\r
-#include <cstdio>\r
-#include <vector>\r
-\r
-//------------------------------------------------------------------------\r
-/*\r
- VST 3 Preset File Format Definition\r
- ===================================\r
-\r
-0 +---------------------------+\r
- | HEADER |\r
- | header id ('VST3') | 4 Bytes\r
- | version | 4 Bytes (int32)\r
- | ASCII-encoded class id | 32 Bytes\r
- +--| offset to chunk list | 8 Bytes (int64)\r
- | +---------------------------+\r
- | | DATA AREA |<-+\r
- | | data of chunks 1..n | |\r
- | ... ... |\r
- | | | |\r
- +->+---------------------------+ |\r
- | CHUNK LIST | |\r
- | list id ('List') | | 4 Bytes\r
- | entry count | | 4 Bytes (int32)\r
- +---------------------------+ |\r
- | 1..n | |\r
- | +----------------------+ | |\r
- | | chunk id | | | 4 Bytes\r
- | | offset to chunk data |----+ 8 Bytes (int64)\r
- | | size of chunk data | | 8 Bytes (int64)\r
- | +----------------------+ |\r
-EOF +---------------------------+\r
-*/\r
-\r
-//------------------------------------------------------------------------\r
-namespace Steinberg {\r
-namespace Vst {\r
-\r
-//------------------------------------------------------------------------\r
-typedef char ChunkID[4];\r
-\r
-//------------------------------------------------------------------------\r
-enum ChunkType\r
-{\r
- kHeader,\r
- kComponentState,\r
- kControllerState,\r
- kProgramData,\r
- kMetaInfo,\r
- kChunkList,\r
- kNumPresetChunks\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-extern const ChunkID& getChunkID (ChunkType type);\r
-\r
-//------------------------------------------------------------------------\r
-inline bool isEqualID (const ChunkID id1, const ChunkID id2)\r
-{\r
- return memcmp (id1, id2, sizeof (ChunkID)) == 0;\r
-}\r
-\r
-//------------------------------------------------------------------------\r
-/** Handler for a VST 3 Preset File.\r
-\ingroup vstClasses\r
-\see \ref presetformat */\r
-//------------------------------------------------------------------------\r
-class PresetFile\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- PresetFile (IBStream* stream); ///< Constructor of Preset file based on a stream\r
- virtual ~PresetFile ();\r
-\r
- /** Internal structure used for chunk handling */\r
- struct Entry\r
- {\r
- ChunkID id;\r
- TSize offset;\r
- TSize size;\r
- };\r
-\r
- IBStream* getStream () { return stream; } ///< Returns the associated stream.\r
-\r
- const FUID& getClassID () const { return classID; } ///< Returns the associated classID (component ID: Processor part (not the controller!)).\r
- void setClassID (const FUID& uid) { classID = uid; }///< Sets the associated classID (component ID: Processor part (not the controller!)).\r
-\r
- const Entry* getEntry (ChunkType which) const; ///< Returns an entry for a given chunk type.\r
- const Entry* getLastEntry () const; ///< Returns the last available entry.\r
- int32 getEntryCount () const { return entryCount; } ///< Returns the number of total entries in the current stream.\r
- const Entry& at (int32 index) const { return entries[index]; } ///< Returns the entry at a given position.\r
- bool contains (ChunkType which) const { return getEntry (which) != nullptr; } ///< Checks if a given chunk type exist in the stream.\r
-\r
- bool readChunkList (); ///< Reads and build the chunk list (including the header chunk).\r
- bool writeHeader (); ///< Writes into the stream the main header.\r
- bool writeChunkList (); ///< Writes into the stream the chunk list (should be at the end).\r
-\r
- /** Reads the meta XML info and its size, the size could be retrieved by passing zero as xmlBuffer. */\r
- bool readMetaInfo (char* xmlBuffer, int32& size);\r
-\r
- /** Writes the meta XML info, -1 means null-terminated, forceWriting to true will force to rewrite the XML Info when the chunk already exists. */\r
- bool writeMetaInfo (const char* xmlBuffer, int32 size = -1, bool forceWriting = false);\r
- bool prepareMetaInfoUpdate (); ///< checks if meta info chunk is the last one and jump to correct position.\r
-\r
- /** Writes a given data of a given size as "which" chunk type. */\r
- bool writeChunk (const void* data, int32 size, ChunkType which = kComponentState);\r
-\r
- //-------------------------------------------------------------\r
- // for storing and restoring the whole Plug-in state (component and controller states)\r
- bool seekToComponentState (); ///< Seeks to the begin of the Component State.\r
- bool storeComponentState (IComponent* component); ///< Stores the component state (only one time).\r
- bool storeComponentState (IBStream* componentStream); ///< Stores the component state from stream (only one time).\r
- bool restoreComponentState (IComponent* component); ///< Restores the component state.\r
-\r
- bool seekToControllerState (); ///< Seeks to the begin of the Controller State.\r
- bool storeControllerState (IEditController* editController);///< Stores the controller state (only one time).\r
- bool storeControllerState (IBStream* editStream); ///< Stores the controller state from stream (only one time).\r
- bool restoreControllerState (IEditController* editController);///< Restores the controller state.\r
-\r
- bool restoreComponentState (IEditController* editController);///< Restores the component state and apply it to the controller.\r
-\r
- //--- ----------------------------------------------------------\r
- /** Store program data or unit data from stream (including the header chunk).\r
- \param listID could be ProgramListID or UnitID. */\r
- bool storeProgramData (IBStream* inStream, ProgramListID listID);\r
-\r
- //---when Plug-in uses IProgramListData-----------------------\r
- /** Stores a IProgramListData with a given identifier and index (including the header chunk). */\r
- bool storeProgramData (IProgramListData* programListData, ProgramListID programListID,\r
- int32 programIndex);\r
- /** Restores a IProgramListData with a given identifier and index. */\r
- bool restoreProgramData (IProgramListData* programListData, ProgramListID* programListID = nullptr,\r
- int32 programIndex = 0);\r
-\r
- //---when Plug-in uses IUnitData------------------------------\r
- /** Stores a IUnitData with a given unitID (including the header chunk). */\r
- bool storeProgramData (IUnitData* unitData, UnitID unitID);\r
- /** Restores a IUnitData with a given unitID (optional). */\r
- bool restoreProgramData (IUnitData* unitData, UnitID* unitID = nullptr);\r
-\r
- //--- ----------------------------------------------------------\r
- /** for keeping the Controller part in sync concerning preset data stream, unitProgramListID\r
- * could be ProgramListID or UnitID. */\r
- bool restoreProgramData (IUnitInfo* unitInfo, int32 unitProgramListID, int32 programIndex = -1);\r
-\r
- /** Gets the unitProgramListID saved in the kProgramData chunk (if available). */\r
- bool getUnitProgramListID (int32& unitProgramListID);\r
-\r
- //--- ---------------------------------------------------------------------\r
- /** Shortcut helper to create preset from component/controller state. classID is the FUID of the\r
- * component (processor) part. */\r
- static bool savePreset (IBStream* stream, const FUID& classID, IComponent* component,\r
- IEditController* editController = nullptr,\r
- const char* xmlBuffer = nullptr, int32 xmlSize = -1);\r
- static bool savePreset (IBStream* stream, const FUID& classID, IBStream* componentStream,\r
- IBStream* editStream = nullptr, const char* xmlBuffer = nullptr,\r
- int32 xmlSize = -1);\r
-\r
- /** Shortcut helper to load preset with component/controller state. classID is the FUID of the\r
- * component (processor) part. */\r
- static bool loadPreset (IBStream* stream, const FUID& classID, IComponent* component,\r
- IEditController* editController = nullptr,\r
- std::vector<FUID>* otherClassIDArray = nullptr);\r
-//------------------------------------------------------------------------\r
-protected:\r
- bool readID (ChunkID id);\r
- bool writeID (const ChunkID id);\r
- bool readEqualID (const ChunkID id);\r
- bool readSize (TSize& size);\r
- bool writeSize (TSize size);\r
- bool readInt32 (int32& value);\r
- bool writeInt32 (int32 value);\r
- bool seekTo (TSize offset);\r
- bool beginChunk (Entry& e, ChunkType which);\r
- bool endChunk (Entry& e);\r
-\r
- IBStream* stream;\r
- FUID classID; ///< classID is the FUID of the component (processor) part\r
- enum { kMaxEntries = 128 };\r
- Entry entries[kMaxEntries];\r
- int32 entryCount;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream implementation for a file using stdio. */\r
-//------------------------------------------------------------------------\r
-class FileStream: public IBStream\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- static IBStream* open (const char* filename, const char* mode); ///< open a stream using stdio function\r
-\r
- //---from FUnknown------------------\r
- DECLARE_FUNKNOWN_METHODS\r
-\r
- //---from IBStream------------------\r
- tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- FileStream (FILE* file);\r
- virtual ~FileStream ();\r
-\r
- FILE* file;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream representing a Read-Only subsection of its source stream. */\r
-//------------------------------------------------------------------------\r
-class ReadOnlyBStream: public IBStream\r
-{\r
-public:\r
-//------------------------------------------------------------------------\r
- ReadOnlyBStream (IBStream* sourceStream, TSize sourceOffset, TSize sectionSize);\r
- virtual ~ReadOnlyBStream ();\r
-\r
- //---from FUnknown------------------\r
- DECLARE_FUNKNOWN_METHODS\r
-\r
- //---from IBStream------------------\r
- tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-//------------------------------------------------------------------------\r
-protected:\r
- IBStream* sourceStream;\r
- TSize sourceOffset;\r
- TSize sectionSize;\r
- TSize seekPosition;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-/** Stream implementation for a memory buffer. */\r
-//------------------------------------------------------------------------\r
-class BufferStream : public IBStream\r
-{\r
-public:\r
- BufferStream ();\r
- virtual ~BufferStream ();\r
-\r
- //---from FUnknown------------------\r
- DECLARE_FUNKNOWN_METHODS\r
-\r
- //---from IBStream------------------\r
- tresult PLUGIN_API read (void* buffer, int32 numBytes, int32* numBytesRead = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API write (void* buffer, int32 numBytes, int32* numBytesWritten = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API seek (int64 pos, int32 mode, int64* result = nullptr) SMTG_OVERRIDE;\r
- tresult PLUGIN_API tell (int64* pos) SMTG_OVERRIDE;\r
-\r
-protected:\r
- Buffer mBuffer;\r
-};\r
-\r
-//------------------------------------------------------------------------\r
-} // namespace Vst\r
-} // namespace Steinberg\r
private:\r
//==============================================================================\r
void createPluginInstance (const PluginDescription&,\r
- double initialSampleRate, int initialBufferSize,\r
- void* userData, PluginCreationCallback) override;\r
+ double initialSampleRate,\r
+ int initialBufferSize,\r
+ void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
\r
bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
\r
\r
if (auto* au = pluginInstance.audioUnit)\r
{\r
- AudioUnitGetParameter (au, paramID, kAudioUnitScope_Global, 0, &value);\r
+ AudioUnitGetParameter (au,\r
+ paramID,\r
+ kAudioUnitScope_Global,\r
+ 0,\r
+ &value);\r
+\r
value = normaliseParamValue (value);\r
}\r
\r
\r
if (auto* au = pluginInstance.audioUnit)\r
{\r
- AudioUnitSetParameter (au, paramID, kAudioUnitScope_Global,\r
- 0, scaleParamValue (newValue), 0);\r
+ AudioUnitSetParameter (au,\r
+ paramID,\r
+ kAudioUnitScope_Global,\r
+ 0,\r
+ scaleParamValue (newValue),\r
+ 0);\r
\r
sendParameterChangeEvent();\r
}\r
\r
UInt32 propertySize = sizeof (stringValue);\r
\r
- auto err = AudioUnitGetProperty (au,\r
- kAudioUnitProperty_ParameterStringFromValue,\r
- kAudioUnitScope_Global,\r
- 0,\r
- &stringValue,\r
- &propertySize);\r
+ OSStatus err = AudioUnitGetProperty (au,\r
+ kAudioUnitProperty_ParameterStringFromValue,\r
+ kAudioUnitScope_Global,\r
+ 0,\r
+ &stringValue,\r
+ &propertySize);\r
\r
if (! err && stringValue.outString != nullptr)\r
return String::fromCFString (stringValue.outString).substring (0, maximumLength);\r
\r
UInt32 propertySize = sizeof (valueString);\r
\r
- auto err = AudioUnitGetProperty (au,\r
- kAudioUnitProperty_ParameterValueFromString,\r
- kAudioUnitScope_Global,\r
- 0,\r
- &valueString,\r
- &propertySize);\r
+ OSStatus err = AudioUnitGetProperty (au,\r
+ kAudioUnitProperty_ParameterValueFromString,\r
+ kAudioUnitScope_Global,\r
+ 0,\r
+ &valueString,\r
+ &propertySize);\r
\r
if (! err)\r
return normaliseParamValue (valueString.outValue);\r
return Parameter::getValueForText (text);\r
}\r
\r
- bool isAutomatable() const override { return automatable; }\r
- bool isDiscrete() const override { return discrete; }\r
- bool isBoolean() const override { return isSwitch; }\r
- int getNumSteps() const override { return numSteps; }\r
+ bool isAutomatable() const override\r
+ {\r
+ return automatable;\r
+ }\r
+\r
+ bool isDiscrete() const override\r
+ {\r
+ return discrete;\r
+ }\r
+\r
+ bool isBoolean() const override\r
+ {\r
+ return isSwitch;\r
+ }\r
+\r
+ int getNumSteps() const override\r
+ {\r
+ return numSteps;\r
+ }\r
\r
StringArray getAllValueStrings() const override\r
{\r
AudioUnitPluginInstance (AudioComponentInstance au)\r
: AudioPluginInstance (getBusesProperties (au)),\r
auComponent (AudioComponentInstanceGetComponent (au)),\r
+ wantsMidiMessages (false),\r
+ producesMidiMessages (false),\r
+ wasPlaying (false),\r
+ prepared (false),\r
+ isAUv3 (false),\r
+ currentBuffer (nullptr),\r
audioUnit (au),\r
#if JUCE_MAC\r
eventListenerRef (0),\r
if (getElementCount (scope) != n && isBusCountWritable (isInput))\r
{\r
OSStatus err;\r
- auto newCount = static_cast<UInt32> (n);\r
+ UInt32 newCount = static_cast<UInt32> (n);\r
layoutHasChanged = true;\r
\r
err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount));\r
{\r
AudioStreamBasicDescription stream;\r
UInt32 dataSize = sizeof (stream);\r
- auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);\r
-\r
+ OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);\r
if (err != noErr || dataSize < sizeof (stream))\r
return false;\r
\r
UInt32 dataSize = minDataSize;\r
\r
AudioChannelLayoutTag actualTag = kAudioChannelLayoutTag_Unknown;\r
- auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);\r
+ OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);\r
bool supportsLayouts = (err == noErr && dataSize >= minDataSize);\r
\r
if (supportsLayouts)\r
\r
void refreshParameterList() override\r
{\r
- managedParameters.clear (false);\r
+ managedParameters.clear();\r
paramIDToIndex.clear();\r
- AudioProcessorParameterGroup parameterGroups ({}, {}, {});\r
\r
if (audioUnit != nullptr)\r
{\r
AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global,\r
0, ids, ¶mListSize);\r
\r
- std::map<UInt32, AudioProcessorParameterGroup*> groupIDMap;\r
-\r
for (size_t i = 0; i < numParams; ++i)\r
{\r
AudioUnitParameterInfo info;\r
break;\r
}\r
\r
- auto* parameter = new AUInstanceParameter (*this,\r
- ids[i],\r
- paramName,\r
- info.minValue,\r
- info.maxValue,\r
- info.defaultValue,\r
- (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
- isDiscrete,\r
- isDiscrete ? (int) (info.maxValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
- isBoolean,\r
- label,\r
- (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0);\r
- addParameterInternal (parameter);\r
-\r
- if (info.flags & kAudioUnitParameterFlag_HasClump)\r
- {\r
- auto groupInfo = groupIDMap.find (info.clumpID);\r
-\r
- if (groupInfo == groupIDMap.end())\r
- {\r
- auto getClumpName = [this, info]\r
- {\r
- AudioUnitParameterNameInfo clumpNameInfo;\r
- UInt32 sz = sizeof (clumpNameInfo);\r
- zerostruct (clumpNameInfo);\r
- clumpNameInfo.inID = info.clumpID;\r
- clumpNameInfo.inDesiredLength = (SInt32) 256;\r
-\r
- if (AudioUnitGetProperty (audioUnit,\r
- kAudioUnitProperty_ParameterClumpName,\r
- kAudioUnitScope_Global,\r
- 0,\r
- &clumpNameInfo,\r
- &sz) == noErr)\r
- return String::fromCFString (clumpNameInfo.outName);\r
-\r
- return String (info.clumpID);\r
- };\r
-\r
- auto group = std::make_unique<AudioProcessorParameterGroup> (String (info.clumpID),\r
- getClumpName(), String());\r
- group->addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
- groupIDMap[info.clumpID] = group.get();\r
- parameterGroups.addChild (std::move (group));\r
- }\r
- else\r
- {\r
- groupInfo->second->addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
- }\r
- }\r
- else\r
- {\r
- parameterGroups.addChild (std::unique_ptr<AudioProcessorParameter> (parameter));\r
- }\r
+ addParameter (new AUInstanceParameter (*this,\r
+ ids[i],\r
+ paramName,\r
+ info.minValue,\r
+ info.maxValue,\r
+ info.defaultValue,\r
+ (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0,\r
+ isDiscrete,\r
+ isDiscrete ? (int) (info.maxValue + 1.0f) : AudioProcessor::getDefaultNumParameterSteps(),\r
+ isBoolean,\r
+ label,\r
+ (info.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0));\r
}\r
}\r
}\r
}\r
\r
- parameterTree.swapWith (parameterGroups);\r
-\r
UInt32 propertySize = 0;\r
Boolean writable = false;\r
\r
String pluginName, manufacturer, version;\r
String fileOrIdentifier;\r
CriticalSection lock;\r
-\r
- bool wantsMidiMessages = false, producesMidiMessages = false,\r
- wasPlaying = false, prepared = false,\r
- isAUv3 = false, isMidiEffectPlugin = false;\r
+ bool wantsMidiMessages, producesMidiMessages, wasPlaying, prepared, isAUv3, isMidiEffectPlugin, lastBypassValue = false;\r
\r
struct AUBuffer\r
{\r
if (AudioUnitGetProperty (parent.audioUnit, kAudioUnitProperty_BypassEffect,\r
kAudioUnitScope_Global, 0, &value, &dataSize) == noErr\r
&& dataSize == sizeof (UInt32))\r
- return value != 0;\r
+ return (value != 0);\r
}\r
\r
return false;\r
\r
OwnedArray<AUBuffer> outputBufferList;\r
AudioTimeStamp timeStamp;\r
- AudioBuffer<float>* currentBuffer = nullptr;\r
+ AudioBuffer<float>* currentBuffer;\r
Array<Array<AudioChannelSet>> supportedInLayouts, supportedOutLayouts;\r
\r
int numChannelInfos;\r
{\r
if (pktlist != nullptr && pktlist->numPackets)\r
{\r
- auto time = Time::getMillisecondCounterHiRes() * 0.001;\r
+ const double time = Time::getMillisecondCounterHiRes() * 0.001;\r
const MIDIPacket* packet = &pktlist->packet[0];\r
\r
for (UInt32 i = 0; i < pktlist->numPackets; ++i)\r
\r
OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const\r
{\r
- if (auto* ph = getPlayHead())\r
- {\r
- AudioPlayHead::CurrentPositionInfo result;\r
+ AudioPlayHead* const ph = getPlayHead();\r
+ AudioPlayHead::CurrentPositionInfo result;\r
\r
- if (ph->getCurrentPosition (result))\r
- {\r
- setIfNotNull (outCurrentBeat, result.ppqPosition);\r
- setIfNotNull (outCurrentTempo, result.bpm);\r
- return noErr;\r
- }\r
+ if (ph != nullptr && ph->getCurrentPosition (result))\r
+ {\r
+ setIfNotNull (outCurrentBeat, result.ppqPosition);\r
+ setIfNotNull (outCurrentTempo, result.bpm);\r
+ }\r
+ else\r
+ {\r
+ setIfNotNull (outCurrentBeat, 0);\r
+ setIfNotNull (outCurrentTempo, 120.0);\r
}\r
\r
- setIfNotNull (outCurrentBeat, 0);\r
- setIfNotNull (outCurrentTempo, 120.0);\r
return noErr;\r
}\r
\r
OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator,\r
UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const\r
{\r
- if (auto* ph = getPlayHead())\r
+ if (AudioPlayHead* const ph = getPlayHead())\r
{\r
AudioPlayHead::CurrentPositionInfo result;\r
\r
Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling,\r
Float64* outCycleStartBeat, Float64* outCycleEndBeat)\r
{\r
- if (auto* ph = getPlayHead())\r
+ if (AudioPlayHead* const ph = getPlayHead())\r
{\r
AudioPlayHead::CurrentPositionInfo result;\r
\r
UInt32 inNumberFrames, AudioBufferList* ioData)\r
{\r
return static_cast<AudioUnitPluginInstance*> (hostRef)\r
- ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);\r
+ ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);\r
}\r
\r
static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/,\r
#endif\r
\r
UInt64 currentTime = mach_absolute_time();\r
- static mach_timebase_info_data_t sTimebaseInfo = { 0, 0 };\r
+ static mach_timebase_info_data_t sTimebaseInfo = {0, 0};\r
\r
if (sTimebaseInfo.denom == 0)\r
mach_timebase_info (&sTimebaseInfo);\r
\r
- auto bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;\r
- auto bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom)\r
- / static_cast<double> (sTimebaseInfo.numer))));\r
+ double bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;\r
+ UInt64 bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom) / static_cast<double> (sTimebaseInfo.numer))));\r
currentTime += bufferTicks;\r
\r
return currentTime;\r
{\r
UInt32 countSize;\r
Boolean writable;\r
+ OSStatus err;\r
AudioUnitScope scope = (isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);\r
\r
- auto err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);\r
+ err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);\r
\r
return (err == noErr && writable != 0 && countSize == sizeof (UInt32));\r
}\r
UInt32 count;\r
UInt32 countSize = sizeof (count);\r
\r
- auto err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);\r
+ OSStatus err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);\r
jassert (err == noErr);\r
ignoreUnused (err);\r
\r
{\r
const bool isInput = (dir == 0);\r
const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;\r
- auto n = getElementCount (scope);\r
+ const int n = getElementCount (scope);\r
\r
for (int busIdx = 0; busIdx < n; ++busIdx)\r
{\r
public:\r
AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded)\r
: AudioProcessorEditor (&p),\r
- plugin (p)\r
+ plugin (p), waitingForViewCallback (false)\r
{\r
addAndMakeVisible (wrapper);\r
\r
ObjCBlock<ViewControllerCallbackBlock> viewControllerCallback;\r
#endif\r
\r
- bool waitingForViewCallback = false;\r
+ bool waitingForViewCallback;\r
\r
- bool createView (bool createGenericViewIfNeeded)\r
+ bool createView (const bool createGenericViewIfNeeded)\r
{\r
JUCE_IOS_MAC_VIEW* pluginView = nil;\r
UInt32 dataSize = 0;\r
}\r
\r
void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,\r
- double rate, int blockSize,\r
- void* userData, PluginCreationCallback callback)\r
+ double rate,\r
+ int blockSize,\r
+ void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&))\r
{\r
using namespace AudioUnitFormatHelpers;\r
\r
#endif\r
\r
AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer,\r
- void* inUserData, PluginCreationCallback inOriginalCallback)\r
- : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),\r
- passUserData (inUserData), originalCallback (inOriginalCallback)\r
+ void* inUserData, void (*inOriginalCallback) (void*, AudioPluginInstance*, const String&))\r
+ : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),\r
+ passUserData (inUserData), originalCallback (inOriginalCallback)\r
{\r
#if JUCE_SUPPORTS_AUv3\r
block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion);\r
double sampleRate;\r
int framesPerBuffer;\r
void* passUserData;\r
- PluginCreationCallback originalCallback;\r
+ void (*originalCallback) (void*, AudioPluginInstance*, const String&);\r
\r
#if JUCE_SUPPORTS_AUv3\r
ObjCBlock<AUCompletionCallbackBlock> block;\r
#endif\r
};\r
\r
- auto callbackBlock = new AUAsyncInitializationCallback (rate, blockSize, userData, callback);\r
+ AUAsyncInitializationCallback* callbackBlock\r
+ = new AUAsyncInitializationCallback (rate, blockSize, userData, callback);\r
\r
#if JUCE_SUPPORTS_AUv3\r
//==============================================================================\r
#endif // JUCE_SUPPORTS_AUv3\r
\r
AudioComponentInstance audioUnit;\r
- auto err = AudioComponentInstanceNew(auComponent, &audioUnit);\r
+ OSStatus err = AudioComponentInstanceNew(auComponent, &audioUnit);\r
callbackBlock->completion (err != noErr ? nullptr : audioUnit, err);\r
}\r
else\r
bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)\r
{\r
AudioComponentDescription desc;\r
- String name, version, manufacturer;\r
\r
+ String name, version, manufacturer;\r
if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer))\r
return AudioComponentFindNext (nullptr, &desc) != nullptr;\r
\r
- auto f = File::createFileWithoutCheckingPath (fileOrIdentifier);\r
+ const File f (File::createFileWithoutCheckingPath (fileOrIdentifier));\r
\r
return (f.hasFileExtension (".component") || f.hasFileExtension (".appex"))\r
&& f.isDirectory();\r
\r
inputs.clear();\r
outputs.clear();\r
- managedParameters.clear (false);\r
- AudioProcessorParameterGroup group ({}, {}, {});\r
- parameterTree.swapWith (group);\r
+ managedParameters.clear();\r
\r
for (unsigned int i = 0; i < plugin->PortCount; ++i)\r
{\r
if (useLog && low > 0 && high > 0)\r
return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha);\r
\r
- return low + (high - low) * alpha;\r
+ return low + (high - low) * alpha;\r
}\r
\r
static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value)\r
}\r
}\r
\r
-void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc,\r
- double sampleRate, int blockSize,\r
- void* userData, PluginCreationCallback callback)\r
+void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc, double sampleRate, int blockSize,\r
+ void* userData, void (*callback) (void*, AudioPluginInstance*, const String&))\r
{\r
std::unique_ptr<LADSPAPluginInstance> result;\r
\r
private:\r
//==============================================================================\r
void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
- int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+ int initialBufferSize, void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
\r
bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
\r
\r
static inline Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set, AudioChannelSet::ChannelType type) noexcept\r
{\r
+ using namespace Steinberg::Vst;\r
+\r
switch (type)\r
{\r
- case AudioChannelSet::left: return Steinberg::Vst::kSpeakerL;\r
- case AudioChannelSet::right: return Steinberg::Vst::kSpeakerR;\r
- case AudioChannelSet::centre: return (set == AudioChannelSet::mono() ? Steinberg::Vst::kSpeakerM : Steinberg::Vst::kSpeakerC);\r
-\r
- case AudioChannelSet::LFE: return Steinberg::Vst::kSpeakerLfe;\r
- case AudioChannelSet::leftSurround: return Steinberg::Vst::kSpeakerLs;\r
- case AudioChannelSet::rightSurround: return Steinberg::Vst::kSpeakerRs;\r
- case AudioChannelSet::leftCentre: return Steinberg::Vst::kSpeakerLc;\r
- case AudioChannelSet::rightCentre: return Steinberg::Vst::kSpeakerRc;\r
- case AudioChannelSet::centreSurround: return Steinberg::Vst::kSpeakerCs;\r
+ case AudioChannelSet::left: return kSpeakerL;\r
+ case AudioChannelSet::right: return kSpeakerR;\r
+ case AudioChannelSet::centre: return (set == AudioChannelSet::mono() ? kSpeakerM : kSpeakerC);\r
+\r
+ case AudioChannelSet::LFE: return kSpeakerLfe;\r
+ case AudioChannelSet::leftSurround: return kSpeakerLs;\r
+ case AudioChannelSet::rightSurround: return kSpeakerRs;\r
+ case AudioChannelSet::leftCentre: return kSpeakerLc;\r
+ case AudioChannelSet::rightCentre: return kSpeakerRc;\r
+ case AudioChannelSet::centreSurround: return kSpeakerCs;\r
case AudioChannelSet::leftSurroundSide: return (1ull << 26); /* kSpeakerLcs */\r
case AudioChannelSet::rightSurroundSide: return (1ull << 27); /* kSpeakerRcs */\r
case AudioChannelSet::topMiddle: return (1ull << 11); /* kSpeakerTm */\r
- case AudioChannelSet::topFrontLeft: return Steinberg::Vst::kSpeakerTfl;\r
- case AudioChannelSet::topFrontCentre: return Steinberg::Vst::kSpeakerTfc;\r
- case AudioChannelSet::topFrontRight: return Steinberg::Vst::kSpeakerTfr;\r
- case AudioChannelSet::topRearLeft: return Steinberg::Vst::kSpeakerTrl;\r
- case AudioChannelSet::topRearCentre: return Steinberg::Vst::kSpeakerTrc;\r
- case AudioChannelSet::topRearRight: return Steinberg::Vst::kSpeakerTrr;\r
- case AudioChannelSet::LFE2: return Steinberg::Vst::kSpeakerLfe2;\r
- case AudioChannelSet::leftSurroundRear: return Steinberg::Vst::kSpeakerSl;\r
- case AudioChannelSet::rightSurroundRear: return Steinberg::Vst::kSpeakerSr;\r
- case AudioChannelSet::wideLeft: return Steinberg::Vst::kSpeakerPl;\r
- case AudioChannelSet::wideRight: return Steinberg::Vst::kSpeakerPr;\r
+ case AudioChannelSet::topFrontLeft: return kSpeakerTfl;\r
+ case AudioChannelSet::topFrontCentre: return kSpeakerTfc;\r
+ case AudioChannelSet::topFrontRight: return kSpeakerTfr;\r
+ case AudioChannelSet::topRearLeft: return kSpeakerTrl;\r
+ case AudioChannelSet::topRearCentre: return kSpeakerTrc;\r
+ case AudioChannelSet::topRearRight: return kSpeakerTrr;\r
+ case AudioChannelSet::LFE2: return kSpeakerLfe2;\r
+ case AudioChannelSet::leftSurroundRear: return kSpeakerSl;\r
+ case AudioChannelSet::rightSurroundRear: return kSpeakerSr;\r
+ case AudioChannelSet::wideLeft: return kSpeakerPl;\r
+ case AudioChannelSet::wideRight: return kSpeakerPr;\r
case AudioChannelSet::ambisonicACN0: return (1ull << 20); /* kSpeakerACN0 */\r
case AudioChannelSet::ambisonicACN1: return (1ull << 21); /* kSpeakerACN1 */\r
case AudioChannelSet::ambisonicACN2: return (1ull << 22); /* kSpeakerACN2 */\r
case AudioChannelSet::topSideLeft: return (1ull << 24); /* kSpeakerTsl */\r
case AudioChannelSet::topSideRight: return (1ull << 25); /* kSpeakerTsr */\r
\r
- case AudioChannelSet::discreteChannel0: return Steinberg::Vst::kSpeakerM;\r
+ case AudioChannelSet::discreteChannel0: return kSpeakerM;\r
default:\r
break;\r
}\r
\r
static inline AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::SpeakerArrangement arr, Steinberg::Vst::Speaker type) noexcept\r
{\r
+ using namespace Steinberg::Vst;\r
+\r
switch (type)\r
{\r
- case Steinberg::Vst::kSpeakerL: return AudioChannelSet::left;\r
- case Steinberg::Vst::kSpeakerR: return AudioChannelSet::right;\r
- case Steinberg::Vst::kSpeakerC: return AudioChannelSet::centre;\r
- case Steinberg::Vst::kSpeakerLfe: return AudioChannelSet::LFE;\r
- case Steinberg::Vst::kSpeakerLs: return AudioChannelSet::leftSurround;\r
- case Steinberg::Vst::kSpeakerRs: return AudioChannelSet::rightSurround;\r
- case Steinberg::Vst::kSpeakerLc: return AudioChannelSet::leftCentre;\r
- case Steinberg::Vst::kSpeakerRc: return AudioChannelSet::rightCentre;\r
- case Steinberg::Vst::kSpeakerCs: return AudioChannelSet::centreSurround;\r
- case Steinberg::Vst::kSpeakerSl: return AudioChannelSet::leftSurroundRear;\r
- case Steinberg::Vst::kSpeakerSr: return AudioChannelSet::rightSurroundRear;\r
+ case kSpeakerL: return AudioChannelSet::left;\r
+ case kSpeakerR: return AudioChannelSet::right;\r
+ case kSpeakerC: return AudioChannelSet::centre;\r
+ case kSpeakerLfe: return AudioChannelSet::LFE;\r
+ case kSpeakerLs: return AudioChannelSet::leftSurround;\r
+ case kSpeakerRs: return AudioChannelSet::rightSurround;\r
+ case kSpeakerLc: return AudioChannelSet::leftCentre;\r
+ case kSpeakerRc: return AudioChannelSet::rightCentre;\r
+ case kSpeakerCs: return AudioChannelSet::centreSurround;\r
+ case kSpeakerSl: return AudioChannelSet::leftSurroundRear;\r
+ case kSpeakerSr: return AudioChannelSet::rightSurroundRear;\r
case (1ull << 11): return AudioChannelSet::topMiddle; /* kSpeakerTm */\r
- case Steinberg::Vst::kSpeakerTfl: return AudioChannelSet::topFrontLeft;\r
- case Steinberg::Vst::kSpeakerTfc: return AudioChannelSet::topFrontCentre;\r
- case Steinberg::Vst::kSpeakerTfr: return AudioChannelSet::topFrontRight;\r
- case Steinberg::Vst::kSpeakerTrl: return AudioChannelSet::topRearLeft;\r
- case Steinberg::Vst::kSpeakerTrc: return AudioChannelSet::topRearCentre;\r
- case Steinberg::Vst::kSpeakerTrr: return AudioChannelSet::topRearRight;\r
- case Steinberg::Vst::kSpeakerLfe2: return AudioChannelSet::LFE2;\r
- case (1ull << 19): return ((arr & Steinberg::Vst::kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre);\r
- case (1ull << 20): return AudioChannelSet::ambisonicACN0; /* kSpeakerACN0 */\r
- case (1ull << 21): return AudioChannelSet::ambisonicACN1; /* kSpeakerACN1 */\r
- case (1ull << 22): return AudioChannelSet::ambisonicACN2; /* kSpeakerACN2 */\r
- case (1ull << 23): return AudioChannelSet::ambisonicACN3; /* kSpeakerACN3 */\r
- case (1ull << 38): return AudioChannelSet::ambisonicACN4; /* kSpeakerACN4 */\r
- case (1ull << 39): return AudioChannelSet::ambisonicACN5; /* kSpeakerACN5 */\r
- case (1ull << 40): return AudioChannelSet::ambisonicACN6; /* kSpeakerACN6 */\r
- case (1ull << 41): return AudioChannelSet::ambisonicACN7; /* kSpeakerACN7 */\r
- case (1ull << 42): return AudioChannelSet::ambisonicACN8; /* kSpeakerACN8 */\r
- case (1ull << 43): return AudioChannelSet::ambisonicACN9; /* kSpeakerACN9 */\r
- case (1ull << 44): return AudioChannelSet::ambisonicACN10; /* kSpeakerACN10 */\r
- case (1ull << 45): return AudioChannelSet::ambisonicACN11; /* kSpeakerACN11 */\r
- case (1ull << 46): return AudioChannelSet::ambisonicACN12; /* kSpeakerACN12 */\r
- case (1ull << 47): return AudioChannelSet::ambisonicACN13; /* kSpeakerACN13 */\r
- case (1ull << 48): return AudioChannelSet::ambisonicACN14; /* kSpeakerACN14 */\r
- case (1ull << 49): return AudioChannelSet::ambisonicACN15; /* kSpeakerACN15 */\r
- case (1ull << 24): return AudioChannelSet::topSideLeft; /* kSpeakerTsl */\r
- case (1ull << 25): return AudioChannelSet::topSideRight; /* kSpeakerTsr */\r
- case (1ull << 26): return AudioChannelSet::leftSurroundSide; /* kSpeakerLcs */\r
- case (1ull << 27): return AudioChannelSet::rightSurroundSide; /* kSpeakerRcs */\r
- case (1ull << 28): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 3); /* kSpeakerBfl */\r
- case (1ull << 29): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 4); /* kSpeakerBfc */\r
- case (1ull << 30): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 5); /* kSpeakerBfr */\r
- case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::wideLeft;\r
- case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::wideRight;\r
+ case kSpeakerTfl: return AudioChannelSet::topFrontLeft;\r
+ case kSpeakerTfc: return AudioChannelSet::topFrontCentre;\r
+ case kSpeakerTfr: return AudioChannelSet::topFrontRight;\r
+ case kSpeakerTrl: return AudioChannelSet::topRearLeft;\r
+ case kSpeakerTrc: return AudioChannelSet::topRearCentre;\r
+ case kSpeakerTrr: return AudioChannelSet::topRearRight;\r
+ case kSpeakerLfe2: return AudioChannelSet::LFE2;\r
+ case (1ull << 19): return ((arr & kSpeakerC) != 0 ? AudioChannelSet::discreteChannel0 : AudioChannelSet::centre);\r
+ case (1ull << 20): return AudioChannelSet::ambisonicACN0; /* kSpeakerACN0 */\r
+ case (1ull << 21): return AudioChannelSet::ambisonicACN1; /* kSpeakerACN1 */\r
+ case (1ull << 22): return AudioChannelSet::ambisonicACN2; /* kSpeakerACN2 */\r
+ case (1ull << 23): return AudioChannelSet::ambisonicACN3; /* kSpeakerACN3 */\r
+ case (1ull << 38): return AudioChannelSet::ambisonicACN4; /* kSpeakerACN4 */\r
+ case (1ull << 39): return AudioChannelSet::ambisonicACN5; /* kSpeakerACN5 */\r
+ case (1ull << 40): return AudioChannelSet::ambisonicACN6; /* kSpeakerACN6 */\r
+ case (1ull << 41): return AudioChannelSet::ambisonicACN7; /* kSpeakerACN7 */\r
+ case (1ull << 42): return AudioChannelSet::ambisonicACN8; /* kSpeakerACN8 */\r
+ case (1ull << 43): return AudioChannelSet::ambisonicACN9; /* kSpeakerACN9 */\r
+ case (1ull << 44): return AudioChannelSet::ambisonicACN10; /* kSpeakerACN10 */\r
+ case (1ull << 45): return AudioChannelSet::ambisonicACN11; /* kSpeakerACN11 */\r
+ case (1ull << 46): return AudioChannelSet::ambisonicACN12; /* kSpeakerACN12 */\r
+ case (1ull << 47): return AudioChannelSet::ambisonicACN13; /* kSpeakerACN13 */\r
+ case (1ull << 48): return AudioChannelSet::ambisonicACN14; /* kSpeakerACN14 */\r
+ case (1ull << 49): return AudioChannelSet::ambisonicACN15; /* kSpeakerACN15 */\r
+ case (1ull << 24): return AudioChannelSet::topSideLeft; /* kSpeakerTsl */\r
+ case (1ull << 25): return AudioChannelSet::topSideRight; /* kSpeakerTsr */\r
+ case (1ull << 26): return AudioChannelSet::leftSurroundSide; /* kSpeakerLcs */\r
+ case (1ull << 27): return AudioChannelSet::rightSurroundSide; /* kSpeakerRcs */\r
+ case (1ull << 28): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 3); /* kSpeakerBfl */\r
+ case (1ull << 29): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 4); /* kSpeakerBfc */\r
+ case (1ull << 30): return static_cast<AudioChannelSet::ChannelType> ((int)AudioChannelSet::discreteChannel0 + 5); /* kSpeakerBfr */\r
+ case kSpeakerPl: return AudioChannelSet::wideLeft;\r
+ case kSpeakerPr: return AudioChannelSet::wideRight;\r
default: break;\r
}\r
\r
}\r
}\r
\r
- static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer,\r
- Steinberg::Vst::IParameterChanges* parameterChanges = nullptr,\r
- Steinberg::Vst::IMidiMapping* midiMapping = nullptr)\r
+ static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer)\r
{\r
MidiBuffer::Iterator iterator (midiBuffer);\r
- const uint8* midiEventData = nullptr;\r
- int midiEventSize = 0;\r
+ MidiMessage msg;\r
int midiEventPosition = 0;\r
\r
enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once\r
int numEvents = 0;\r
\r
- while (iterator.getNextEvent (midiEventData, midiEventSize, midiEventPosition))\r
+ while (iterator.getNextEvent (msg, midiEventPosition))\r
{\r
if (++numEvents > maxNumEvents)\r
break;\r
\r
- MidiMessage msg (midiEventData, midiEventSize);\r
-\r
- if (midiMapping != nullptr && parameterChanges != nullptr)\r
- {\r
- Vst3MidiControlEvent controlEvent;\r
-\r
- if (toVst3ControlEvent (msg, controlEvent))\r
- {\r
- Steinberg::Vst::ParamID controlParamID;\r
-\r
- if (midiMapping->getMidiControllerAssignment (0, createSafeChannel (msg.getChannel()),\r
- controlEvent.controllerNumber,\r
- controlParamID) == Steinberg::kResultOk)\r
- {\r
- Steinberg::int32 ignore;\r
-\r
- if (auto* queue = parameterChanges->addParameterData (controlParamID, ignore))\r
- queue->addPoint (midiEventPosition, controlEvent.paramValue, ignore);\r
- }\r
-\r
- continue;\r
- }\r
- }\r
-\r
Steinberg::Vst::Event e = { 0 };\r
\r
if (msg.isNoteOn())\r
else if (msg.isSysEx())\r
{\r
e.type = Steinberg::Vst::Event::kDataEvent;\r
- e.data.bytes = midiEventData + 1;\r
+ e.data.bytes = msg.getSysExData();\r
e.data.size = (uint32) msg.getSysExDataSize();\r
e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx;\r
}\r
- else if (msg.isChannelPressure())\r
+ else if (msg.isAftertouch())\r
{\r
e.type = Steinberg::Vst::Event::kPolyPressureEvent;\r
e.polyPressure.channel = createSafeChannel (msg.getChannel());\r
e.polyPressure.pitch = createSafeNote (msg.getNoteNumber());\r
- e.polyPressure.pressure = normaliseMidiValue (msg.getChannelPressureValue());\r
+ e.polyPressure.pressure = normaliseMidiValue (msg.getAfterTouchValue());\r
}\r
else\r
{\r
static float normaliseMidiValue (int value) noexcept { return jlimit (0.0f, 1.0f, (float) value / 127.0f); }\r
static int denormaliseToMidiValue (float value) noexcept { return roundToInt (jlimit (0.0f, 127.0f, value * 127.0f)); }\r
\r
- //==============================================================================\r
- struct Vst3MidiControlEvent\r
- {\r
- Steinberg::Vst::CtrlNumber controllerNumber;\r
- Steinberg::Vst::ParamValue paramValue;\r
- };\r
-\r
- static bool toVst3ControlEvent (const MidiMessage& msg, Vst3MidiControlEvent& result)\r
- {\r
- result.controllerNumber = -1;\r
-\r
- if (msg.isController()) result = { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0};\r
- else if (msg.isPitchWheel()) result = { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0};\r
- else if (msg.isAftertouch()) result = { Steinberg::Vst::kAfterTouch, msg.getAfterTouchValue() / 127.0};\r
-\r
- return (result.controllerNumber != -1);\r
- }\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList)\r
};\r
\r
#pragma clang diagnostic ignored "-Wdeprecated-declarations"\r
#pragma clang diagnostic ignored "-Wextra-semi"\r
#pragma clang diagnostic ignored "-Wmissing-braces"\r
- #if __has_warning("-Wpragma-pack")\r
- #pragma clang diagnostic ignored "-Wpragma-pack"\r
- #endif\r
#if __has_warning("-Wcomma")\r
#pragma clang diagnostic ignored "-Wcomma"\r
#endif\r
using namespace Steinberg;\r
\r
//==============================================================================\r
+struct VST3Classes\r
+{\r
+\r
#ifndef JUCE_VST3_DEBUGGING\r
#define JUCE_VST3_DEBUGGING 0\r
#endif\r
warnOnFailure (component->activateBus (mediaType, direction, i, state));\r
}\r
\r
+//==============================================================================\r
+/** Assigns a complete AudioBuffer's channels to an AudioBusBuffers' */\r
+static void associateWholeBufferTo (Vst::AudioBusBuffers& vstBuffers, AudioBuffer<float>& buffer) noexcept\r
+{\r
+ vstBuffers.channelBuffers32 = buffer.getArrayOfWritePointers();\r
+ vstBuffers.numChannels = buffer.getNumChannels();\r
+ vstBuffers.silenceFlags = 0;\r
+}\r
+\r
//==============================================================================\r
static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate)\r
{\r
}\r
\r
//==============================================================================\r
-class VST3PluginInstance;\r
+struct VST3PluginInstance;\r
\r
struct VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0\r
public Vst::IComponentHandler2, // From VST V3.1.0 (a very well named class, of course!)\r
}\r
\r
//==============================================================================\r
- tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override;\r
- tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override;\r
- tresult PLUGIN_API endEdit (Vst::ParamID paramID) override;\r
+ tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override\r
+ {\r
+ if (plugin != nullptr)\r
+ {\r
+ auto index = getIndexOfParamID (paramID);\r
+\r
+ if (index < 0)\r
+ return kResultFalse;\r
+\r
+ if (auto* param = plugin->getParameters()[index])\r
+ param->beginChangeGesture();\r
+ else\r
+ jassertfalse; // Invalid parameter index!\r
+ }\r
+\r
+ return kResultTrue;\r
+ }\r
\r
- tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override;\r
+ tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override\r
+ {\r
+ if (plugin != nullptr)\r
+ {\r
+ auto index = getIndexOfParamID (paramID);\r
+\r
+ if (index < 0)\r
+ return kResultFalse;\r
+\r
+ if (auto* param = plugin->getParameters()[index])\r
+ param->sendValueChangedMessageToListeners ((float) valueNormalized);\r
+ else\r
+ jassertfalse; // Invalid parameter index!\r
+\r
+ {\r
+ Steinberg::int32 eventIndex;\r
+ plugin->inputParameterChanges->addParameterData (paramID, eventIndex)->addPoint (0, valueNormalized, eventIndex);\r
+ }\r
+\r
+ // did the plug-in already update the parameter internally\r
+ if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalized)\r
+ return plugin->editController->setParamNormalized (paramID, valueNormalized);\r
+ }\r
+\r
+ return kResultTrue;\r
+ }\r
+\r
+ tresult PLUGIN_API endEdit (Vst::ParamID paramID) override\r
+ {\r
+ if (plugin != nullptr)\r
+ {\r
+ auto index = getIndexOfParamID (paramID);\r
+\r
+ if (index < 0)\r
+ return kResultFalse;\r
+\r
+ if (auto* param = plugin->getParameters()[index])\r
+ param->endChangeGesture();\r
+ else\r
+ jassertfalse; // Invalid parameter index!\r
+ }\r
+\r
+ return kResultTrue;\r
+ }\r
+\r
+ tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override\r
+ {\r
+ if (plugin != nullptr)\r
+ {\r
+ if (hasFlag (flags, Vst::kReloadComponent))\r
+ plugin->reset();\r
+\r
+ if (hasFlag (flags, Vst::kIoChanged))\r
+ {\r
+ auto sampleRate = plugin->getSampleRate();\r
+ auto blockSize = plugin->getBlockSize();\r
+\r
+ plugin->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0,\r
+ blockSize > 0 ? blockSize : 1024);\r
+ }\r
+\r
+ if (hasFlag (flags, Vst::kLatencyChanged))\r
+ if (plugin->processor != nullptr)\r
+ plugin->setLatencySamples (jmax (0, (int) plugin->processor->getLatencySamples()));\r
+\r
+ plugin->updateHostDisplay();\r
+ return kResultTrue;\r
+ }\r
+\r
+ jassertfalse;\r
+ return kResultFalse;\r
+ }\r
\r
//==============================================================================\r
tresult PLUGIN_API setDirty (TBool) override\r
return kResultFalse;\r
}\r
\r
- tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override;\r
+ tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override\r
+ {\r
+ Array<const Item*> subItemStack;\r
+ OwnedArray<PopupMenu> menuStack;\r
+ PopupMenu* topLevelMenu = menuStack.add (new PopupMenu());\r
+\r
+ for (int i = 0; i < items.size(); ++i)\r
+ {\r
+ auto& item = items.getReference (i).item;\r
+ auto* menuToUse = menuStack.getLast();\r
+\r
+ if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled))\r
+ {\r
+ subItemStack.add (&item);\r
+ menuStack.add (new PopupMenu());\r
+ }\r
+ else if (hasFlag (item.flags, Item::kIsGroupEnd))\r
+ {\r
+ if (auto* subItem = subItemStack.getLast())\r
+ {\r
+ if (auto* m = menuStack [menuStack.size() - 2])\r
+ m->addSubMenu (toString (subItem->name), *menuToUse,\r
+ ! hasFlag (subItem->flags, Item::kIsDisabled),\r
+ nullptr,\r
+ hasFlag (subItem->flags, Item::kIsChecked));\r
+\r
+ menuStack.removeLast (1);\r
+ subItemStack.removeLast (1);\r
+ }\r
+ }\r
+ else if (hasFlag (item.flags, Item::kIsSeparator))\r
+ {\r
+ menuToUse->addSeparator();\r
+ }\r
+ else\r
+ {\r
+ menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement,\r
+ toString (item.name),\r
+ ! hasFlag (item.flags, Item::kIsDisabled),\r
+ hasFlag (item.flags, Item::kIsChecked));\r
+ }\r
+ }\r
+\r
+ PopupMenu::Options options;\r
+\r
+ if (auto* ed = owner.getActiveEditor())\r
+ options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1));\r
+\r
+ #if JUCE_MODAL_LOOPS_PERMITTED\r
+ // Unfortunately, Steinberg's docs explicitly say this should be modal..\r
+ handleResult (topLevelMenu->showMenu (options));\r
+ #else\r
+ topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr<ContextMenu> (this)));\r
+ #endif\r
+\r
+ return kResultOk;\r
+ }\r
\r
#if ! JUCE_MODAL_LOOPS_PERMITTED\r
static void menuFinished (int modalResult, ComSmartPtr<ContextMenu> menu) { menu->handleResult (modalResult); }\r
return kResultFalse;\r
}\r
\r
- tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override;\r
+ tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override\r
+ {\r
+ if (plugin != nullptr)\r
+ plugin->syncProgramNames();\r
+\r
+ return kResultTrue;\r
+ }\r
\r
//==============================================================================\r
tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override\r
using ParamMapType = std::map<Vst::ParamID, int>;\r
ParamMapType paramToIndexMap;\r
\r
- int getIndexOfParamID (Vst::ParamID paramID);\r
+ int getIndexOfParamID (Vst::ParamID paramID)\r
+ {\r
+ if (plugin == nullptr || plugin->editController == nullptr)\r
+ return -1;\r
+\r
+ auto result = getMappedParamID (paramID);\r
+\r
+ if (result < 0)\r
+ {\r
+ auto numParams = plugin->editController->getParameterCount();\r
+\r
+ for (int i = 0; i < numParams; ++i)\r
+ {\r
+ Vst::ParameterInfo paramInfo;\r
+ plugin->editController->getParameterInfo (i, paramInfo);\r
+ paramToIndexMap[paramInfo.id] = i;\r
+ }\r
+\r
+ result = getMappedParamID (paramID);\r
+ }\r
+\r
+ return result;\r
+ }\r
\r
int getMappedParamID (Vst::ParamID paramID)\r
{\r
\r
if (CFBundleLoadExecutableAndReturnError (bundleRef, &error))\r
{\r
- using BundleEntryProc = bool (*)(CFBundleRef);\r
+ typedef bool (*BundleEntryProc)(CFBundleRef);\r
\r
if (auto proc = (BundleEntryProc) getFunction ("bundleEntry"))\r
{\r
//==============================================================================\r
struct VST3PluginWindow : public AudioProcessorEditor,\r
public ComponentMovementWatcher,\r
- #if ! JUCE_MAC\r
- public ComponentPeer::ScaleFactorListener,\r
- public Timer,\r
- #endif\r
public IPlugFrame\r
{\r
VST3PluginWindow (AudioProcessor* owner, IPlugView* pluginView)\r
setVisible (true);\r
\r
warnOnFailure (view->setFrame (this));\r
-\r
- #if JUCE_MAC\r
resizeToFit();\r
- #endif\r
-\r
- Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
- view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
-\r
- if (scaleInterface != nullptr)\r
- {\r
- pluginRespondsToDPIChanges = true;\r
- scaleInterface->release();\r
- }\r
}\r
\r
~VST3PluginWindow()\r
#endif\r
\r
view = nullptr;\r
-\r
- #if ! JUCE_MAC\r
- for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
- if (auto* p = ComponentPeer::getPeer (i))\r
- p->removeScaleFactorListener (this);\r
- #endif\r
}\r
\r
JUCE_DECLARE_VST3_COM_REF_METHODS\r
bool keyPressed (const KeyPress& /*key*/) override { return true; }\r
\r
//==============================================================================\r
- void componentPeerChanged() override\r
- {\r
- #if ! JUCE_MAC\r
- if (auto* topPeer = getTopLevelComponent()->getPeer())\r
- topPeer->addScaleFactorListener (this);\r
- #endif\r
- }\r
-\r
void componentMovedOrResized (bool, bool wasResized) override\r
{\r
if (recursiveResize)\r
if (topComp->getPeer() != nullptr)\r
{\r
#if JUCE_WINDOWS\r
- auto pos = (topComp->getLocalPoint (this, Point<int>()) * nativeScaleFactor).roundToInt();\r
+ auto pos = topComp->getLocalPoint (this, Point<int>());\r
#endif\r
\r
recursiveResize = true;\r
\r
if (wasResized && view->canResize() == kResultTrue)\r
{\r
- rect.right = (Steinberg::int32) roundToInt (getWidth() * nativeScaleFactor);\r
- rect.bottom = (Steinberg::int32) roundToInt (getHeight() * nativeScaleFactor);\r
-\r
+ rect.right = (Steinberg::int32) getWidth();\r
+ rect.bottom = (Steinberg::int32) getHeight();\r
view->checkSizeConstraint (&rect);\r
\r
- auto w = roundToInt (rect.getWidth() / nativeScaleFactor);\r
- auto h = roundToInt (rect.getHeight() / nativeScaleFactor);\r
+ auto w = (int) rect.getWidth();\r
+ auto h = (int) rect.getHeight();\r
setSize (w, h);\r
\r
#if JUCE_WINDOWS\r
SetWindowPos (pluginHandle, 0,\r
- pos.x, pos.y, rect.getWidth(), rect.getHeight(),\r
+ pos.x, pos.y, w, h,\r
isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW);\r
#elif JUCE_MAC\r
embeddedComponent.setBounds (getLocalBounds());\r
}\r
}\r
\r
+ void componentPeerChanged() override {}\r
+\r
void componentVisibilityChanged() override\r
{\r
attachPluginWindow();\r
-\r
- #if ! JUCE_MAC\r
- if (auto* topPeer = getTopLevelComponent()->getPeer())\r
- nativeScaleFactorChanged ((float) topPeer->getPlatformScaleFactor());\r
- #endif\r
-\r
- if (! hasDoneInitialResize)\r
- resizeToFit();\r
-\r
componentMovedOrResized (true, true);\r
}\r
\r
- #if ! JUCE_MAC\r
- void nativeScaleFactorChanged (double newScaleFactor) override\r
- {\r
- if (pluginHandle == nullptr || approximatelyEqual ((float) newScaleFactor, nativeScaleFactor))\r
- return;\r
-\r
- nativeScaleFactor = (float) newScaleFactor;\r
-\r
- if (pluginRespondsToDPIChanges)\r
- {\r
- Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
- view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
-\r
- if (scaleInterface != nullptr)\r
- {\r
- scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor);\r
- scaleInterface->release();\r
- }\r
- }\r
- else\r
- {\r
- // If the plug-in doesn't respond to scale factor changes then we need to scale our window, but\r
- // we can't do it immediately as it may cause a recursive resize loop so fire up a timer\r
- startTimerHz (4);\r
- }\r
- }\r
-\r
- bool willCauseRecursiveResize (int w, int h)\r
- {\r
- auto newScreenBounds = Rectangle<int> (w, h).withPosition (getScreenPosition());\r
-\r
- return Desktop::getInstance().getDisplays().findDisplayForRect (newScreenBounds).scale != nativeScaleFactor;\r
- }\r
-\r
- void timerCallback() override\r
- {\r
- ViewRect rect;\r
- warnOnFailure (view->getSize (&rect));\r
-\r
- auto w = roundToInt ((rect.right - rect.left) / nativeScaleFactor);\r
- auto h = roundToInt ((rect.bottom - rect.top) / nativeScaleFactor);\r
-\r
- if (willCauseRecursiveResize (w, h))\r
- return;\r
-\r
- // window can be resized safely now\r
- stopTimer();\r
- setSize (w, h);\r
- }\r
- #endif\r
-\r
void resizeToFit()\r
{\r
ViewRect rect;\r
warnOnFailure (view->getSize (&rect));\r
- resizeWithRect (*this, rect, nativeScaleFactor);\r
-\r
- hasDoneInitialResize = true;\r
+ resizeWithRect (*this, rect);\r
}\r
\r
tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override\r
&& newSize != nullptr\r
&& incomingView == view)\r
{\r
- resizeWithRect (embeddedComponent, *newSize, nativeScaleFactor);\r
+ resizeWithRect (embeddedComponent, *newSize);\r
setSize (embeddedComponent.getWidth(), embeddedComponent.getHeight());\r
return kResultTrue;\r
}\r
return kInvalidArgument;\r
}\r
\r
+ void setScaleFactor (float newScale) override\r
+ {\r
+ Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr;\r
+ view->queryInterface (Steinberg::IPlugViewContentScaleSupport::iid, (void**) &scaleInterface);\r
+\r
+ if (scaleInterface != nullptr)\r
+ {\r
+ scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) newScale);\r
+ scaleInterface->release();\r
+ resizeToFit();\r
+ }\r
+ }\r
+\r
private:\r
//==============================================================================\r
Atomic<int> refCount { 1 };\r
HandleFormat pluginHandle = {};\r
bool recursiveResize = false;\r
\r
- float nativeScaleFactor = 1.0f;\r
- bool hasDoneInitialResize = false;\r
- bool pluginRespondsToDPIChanges = false;\r
-\r
//==============================================================================\r
- static void resizeWithRect (Component& comp, const ViewRect& rect, float scaleFactor)\r
+ static void resizeWithRect (Component& comp, const ViewRect& rect)\r
{\r
- comp.setBounds (roundToInt (rect.left / scaleFactor),\r
- roundToInt (rect.top / scaleFactor),\r
- jmax (10, std::abs (roundToInt (rect.getWidth() / scaleFactor))),\r
- jmax (10, std::abs (roundToInt (rect.getHeight() / scaleFactor))));\r
+ comp.setBounds ((int) rect.left, (int) rect.top,\r
+ jmax (10, std::abs ((int) rect.getWidth())),\r
+ jmax (10, std::abs ((int) rect.getHeight())));\r
}\r
\r
void attachPluginWindow()\r
// On Windows it's highly advisable to create your plugins using the message thread,\r
// because many plugins need a chance to create HWNDs that will get their messages\r
// delivered by the main message thread, and that's not possible from a background thread.\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
#endif\r
\r
factory = ComSmartPtr<IPluginFactory> (module->getPluginFactory());\r
};\r
\r
//==============================================================================\r
-class VST3PluginInstance : public AudioPluginInstance\r
+struct VST3PluginInstance : public AudioPluginInstance\r
{\r
-public:\r
struct VST3Parameter final : public Parameter\r
{\r
VST3Parameter (VST3PluginInstance& parent,\r
};\r
\r
VST3PluginInstance (VST3ComponentHolder* componentHolder)\r
- : AudioPluginInstance (getBusProperties (componentHolder->component)),\r
- holder (componentHolder),\r
- inputParameterChanges (new ParamValueQueueList()),\r
- outputParameterChanges (new ParamValueQueueList()),\r
+ : AudioPluginInstance (getBusProperties (componentHolder->component)),\r
+ holder (componentHolder),\r
+ inputParameterChanges (new ParamValueQueueList()),\r
+ outputParameterChanges (new ParamValueQueueList()),\r
midiInputs (new MidiEventList()),\r
midiOutputs (new MidiEventList())\r
{\r
componentHandler2 = nullptr;\r
componentHandler = nullptr;\r
processor = nullptr;\r
- midiMapping = nullptr;\r
editController2 = nullptr;\r
editController = nullptr;\r
}\r
// On Windows it's highly advisable to create your plugins using the message thread,\r
// because many plugins need a chance to create HWNDs that will get their messages\r
// delivered by the main message thread, and that's not possible from a background thread.\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
#endif\r
\r
if (! holder->initialise())\r
editController->setComponentHandler (holder->host);\r
grabInformationObjects();\r
interconnectComponentAndController();\r
- addParameters();\r
+\r
+ for (int i = 0; i < editController->getParameterCount(); ++i)\r
+ {\r
+ auto paramInfo = getParameterInfoForIndex (i);\r
+ VST3Parameter* p = new VST3Parameter (*this,\r
+ paramInfo.id,\r
+ (paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);\r
+ addParameter (p);\r
+\r
+ if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)\r
+ bypassParam = p;\r
+ }\r
+\r
synchroniseStates();\r
syncProgramNames();\r
setupIO();\r
auto sampleRate = getSampleRate();\r
\r
if (sampleRate > 0.0)\r
- {\r
- auto tailSamples = processor->getTailSamples();\r
-\r
- if (tailSamples == Vst::kInfiniteTail)\r
- return std::numeric_limits<double>::infinity();\r
-\r
return jlimit (0, 0x7fffffff, (int) processor->getTailSamples()) / sampleRate;\r
- }\r
}\r
\r
return 0.0;\r
// Rudimentary interfaces:\r
ComSmartPtr<Vst::IEditController> editController;\r
ComSmartPtr<Vst::IEditController2> editController2;\r
- ComSmartPtr<Vst::IMidiMapping> midiMapping;\r
ComSmartPtr<Vst::IAudioProcessor> processor;\r
ComSmartPtr<Vst::IComponentHandler> componentHandler;\r
ComSmartPtr<Vst::IComponentHandler2> componentHandler2;\r
}\r
}\r
\r
- void addParameters()\r
- {\r
- AudioProcessorParameterGroup parameterGroups ({}, {}, {});\r
-\r
- // We're going to add parameter groups to the tree recursively in the same order as the\r
- // first parameters contained within them.\r
- std::map<Vst::UnitID, Vst::UnitInfo> infoMap;\r
- std::map<Vst::UnitID, AudioProcessorParameterGroup*> groupMap;\r
- groupMap[Vst::kRootUnitId] = ¶meterGroups;\r
-\r
- if (unitInfo != nullptr)\r
- {\r
- const auto numUnits = unitInfo->getUnitCount();\r
-\r
- for (int i = 1; i < numUnits; ++i)\r
- {\r
- Vst::UnitInfo ui = { 0 };\r
- unitInfo->getUnitInfo (i, ui);\r
- infoMap[ui.id] = std::move (ui);\r
- }\r
- }\r
-\r
- for (int i = 0; i < editController->getParameterCount(); ++i)\r
- {\r
- auto paramInfo = getParameterInfoForIndex (i);\r
- auto* param = new VST3Parameter (*this,\r
- paramInfo.id,\r
- (paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);\r
- addParameterInternal (param);\r
-\r
- if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)\r
- bypassParam = param;\r
-\r
- std::function<AudioProcessorParameterGroup*(Vst::UnitID)> findOrCreateGroup;\r
-\r
- findOrCreateGroup = [&groupMap, &infoMap, &findOrCreateGroup](Vst::UnitID groupID)\r
- {\r
- auto existingGroup = groupMap.find (groupID);\r
-\r
- if (existingGroup != groupMap.end())\r
- return existingGroup->second;\r
-\r
- auto groupInfo = infoMap.find (groupID);\r
-\r
- if (groupInfo == infoMap.end())\r
- return groupMap[Vst::kRootUnitId];\r
-\r
- auto* group = new AudioProcessorParameterGroup (String (groupInfo->first),\r
- toString (groupInfo->second.name),\r
- {});\r
- groupMap[groupInfo->first] = group;\r
-\r
- auto* parentGroup = findOrCreateGroup (groupInfo->second.parentUnitId);\r
- parentGroup->addChild (std::unique_ptr<AudioProcessorParameterGroup> (group));\r
-\r
- return group;\r
- };\r
-\r
- auto* group = findOrCreateGroup (paramInfo.unitId);\r
- group->addChild (std::unique_ptr<AudioProcessorParameter> (param));\r
- }\r
-\r
- parameterTree.swapWith (parameterGroups);\r
- }\r
-\r
void synchroniseStates()\r
{\r
Steinberg::MemoryStream stream;\r
programListData.loadFrom (holder->component);\r
unitData.loadFrom (holder->component);\r
editController2.loadFrom (holder->component);\r
- midiMapping.loadFrom (holder->component);\r
componentHandler.loadFrom (holder->component);\r
componentHandler2.loadFrom (holder->component);\r
trackInfoListener.loadFrom (holder->component);\r
if (programListData == nullptr) programListData.loadFrom (editController);\r
if (unitData == nullptr) unitData.loadFrom (editController);\r
if (editController2 == nullptr) editController2.loadFrom (editController);\r
- if (midiMapping == nullptr) midiMapping.loadFrom (editController);\r
if (componentHandler == nullptr) componentHandler.loadFrom (editController);\r
if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController);\r
if (trackInfoListener == nullptr) trackInfoListener.loadFrom (editController);\r
if (component->getBusInfo (Vst::kAudio, dir, (Steinberg::int32) i, info) != kResultOk)\r
continue;\r
\r
- AudioChannelSet layout = (info.channelCount == 0 ? AudioChannelSet::disabled()\r
- : AudioChannelSet::discreteChannels (info.channelCount));\r
+ if (info.channelCount == 0)\r
+ continue;\r
+\r
+ AudioChannelSet layout = AudioChannelSet::discreteChannels (info.channelCount);\r
\r
Vst::SpeakerArrangement arr;\r
if (processor != nullptr && processor->getBusArrangement (dir, i, arr) == kResultOk)\r
midiInputs->clear();\r
midiOutputs->clear();\r
\r
- MidiEventList::toEventList (*midiInputs, midiBuffer,\r
- destination.inputParameterChanges,\r
- midiMapping);\r
+ MidiEventList::toEventList (*midiInputs, midiBuffer);\r
\r
destination.inputEvents = midiInputs;\r
destination.outputEvents = midiOutputs;\r
#pragma warning (pop)\r
#endif\r
\r
+};\r
+\r
//==============================================================================\r
-AudioPluginInstance* VST3ComponentHolder::createPluginInstance()\r
+AudioPluginInstance* VST3Classes::VST3ComponentHolder::createPluginInstance()\r
{\r
if (! initialise())\r
return nullptr;\r
return plugin;\r
}\r
\r
-//==============================================================================\r
-tresult VST3HostContext::beginEdit (Vst::ParamID paramID)\r
-{\r
- if (plugin != nullptr)\r
- {\r
- auto index = getIndexOfParamID (paramID);\r
-\r
- if (index < 0)\r
- return kResultFalse;\r
-\r
- if (auto* param = plugin->getParameters()[index])\r
- param->beginChangeGesture();\r
- else\r
- jassertfalse; // Invalid parameter index!\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized)\r
-{\r
- if (plugin != nullptr)\r
- {\r
- auto index = getIndexOfParamID (paramID);\r
-\r
- if (index < 0)\r
- return kResultFalse;\r
-\r
- if (auto* param = plugin->getParameters()[index])\r
- param->sendValueChangedMessageToListeners ((float) valueNormalized);\r
- else\r
- jassertfalse; // Invalid parameter index!\r
-\r
- {\r
- Steinberg::int32 eventIndex;\r
- plugin->inputParameterChanges->addParameterData (paramID, eventIndex)->addPoint (0, valueNormalized, eventIndex);\r
- }\r
-\r
- // did the plug-in already update the parameter internally\r
- if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalized)\r
- return plugin->editController->setParamNormalized (paramID, valueNormalized);\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::endEdit (Vst::ParamID paramID)\r
-{\r
- if (plugin != nullptr)\r
- {\r
- auto index = getIndexOfParamID (paramID);\r
-\r
- if (index < 0)\r
- return kResultFalse;\r
-\r
- if (auto* param = plugin->getParameters()[index])\r
- param->endChangeGesture();\r
- else\r
- jassertfalse; // Invalid parameter index!\r
- }\r
-\r
- return kResultTrue;\r
-}\r
-\r
-tresult VST3HostContext::restartComponent (Steinberg::int32 flags)\r
-{\r
- if (plugin != nullptr)\r
- {\r
- if (hasFlag (flags, Vst::kReloadComponent))\r
- plugin->reset();\r
-\r
- if (hasFlag (flags, Vst::kIoChanged))\r
- {\r
- auto sampleRate = plugin->getSampleRate();\r
- auto blockSize = plugin->getBlockSize();\r
-\r
- plugin->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0,\r
- blockSize > 0 ? blockSize : 1024);\r
- }\r
-\r
- if (hasFlag (flags, Vst::kLatencyChanged))\r
- if (plugin->processor != nullptr)\r
- plugin->setLatencySamples (jmax (0, (int) plugin->processor->getLatencySamples()));\r
-\r
- plugin->updateHostDisplay();\r
- return kResultTrue;\r
- }\r
-\r
- jassertfalse;\r
- return kResultFalse;\r
-}\r
-\r
-//==============================================================================\r
-tresult VST3HostContext::ContextMenu::popup (Steinberg::UCoord x, Steinberg::UCoord y)\r
-{\r
- Array<const Item*> subItemStack;\r
- OwnedArray<PopupMenu> menuStack;\r
- PopupMenu* topLevelMenu = menuStack.add (new PopupMenu());\r
-\r
- for (int i = 0; i < items.size(); ++i)\r
- {\r
- auto& item = items.getReference (i).item;\r
- auto* menuToUse = menuStack.getLast();\r
-\r
- if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled))\r
- {\r
- subItemStack.add (&item);\r
- menuStack.add (new PopupMenu());\r
- }\r
- else if (hasFlag (item.flags, Item::kIsGroupEnd))\r
- {\r
- if (auto* subItem = subItemStack.getLast())\r
- {\r
- if (auto* m = menuStack [menuStack.size() - 2])\r
- m->addSubMenu (toString (subItem->name), *menuToUse,\r
- ! hasFlag (subItem->flags, Item::kIsDisabled),\r
- nullptr,\r
- hasFlag (subItem->flags, Item::kIsChecked));\r
-\r
- menuStack.removeLast (1);\r
- subItemStack.removeLast (1);\r
- }\r
- }\r
- else if (hasFlag (item.flags, Item::kIsSeparator))\r
- {\r
- menuToUse->addSeparator();\r
- }\r
- else\r
- {\r
- menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement,\r
- toString (item.name),\r
- ! hasFlag (item.flags, Item::kIsDisabled),\r
- hasFlag (item.flags, Item::kIsChecked));\r
- }\r
- }\r
-\r
- PopupMenu::Options options;\r
-\r
- if (auto* ed = owner.getActiveEditor())\r
- options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1));\r
-\r
- #if JUCE_MODAL_LOOPS_PERMITTED\r
- // Unfortunately, Steinberg's docs explicitly say this should be modal..\r
- handleResult (topLevelMenu->showMenu (options));\r
- #else\r
- topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr<ContextMenu> (this)));\r
- #endif\r
-\r
- return kResultOk;\r
-}\r
-\r
-//==============================================================================\r
-tresult VST3HostContext::notifyProgramListChange (Vst::ProgramListID, Steinberg::int32)\r
-{\r
- if (plugin != nullptr)\r
- plugin->syncProgramNames();\r
-\r
- return kResultTrue;\r
-}\r
-\r
-//==============================================================================\r
-int VST3HostContext::getIndexOfParamID (Vst::ParamID paramID)\r
-{\r
- if (plugin == nullptr || plugin->editController == nullptr)\r
- return -1;\r
-\r
- auto result = getMappedParamID (paramID);\r
-\r
- if (result < 0)\r
- {\r
- auto numParams = plugin->editController->getParameterCount();\r
-\r
- for (int i = 0; i < numParams; ++i)\r
- {\r
- Vst::ParameterInfo paramInfo;\r
- plugin->editController->getParameterInfo (i, paramInfo);\r
- paramToIndexMap[paramInfo.id] = i;\r
- }\r
-\r
- result = getMappedParamID (paramID);\r
- }\r
-\r
- return result;\r
-}\r
\r
//==============================================================================\r
VST3PluginFormat::VST3PluginFormat() {}\r
\r
bool VST3PluginFormat::setStateFromVSTPresetFile (AudioPluginInstance* api, const MemoryBlock& rawData)\r
{\r
- if (auto vst3 = dynamic_cast<VST3PluginInstance*> (api))\r
+ if (auto vst3 = dynamic_cast<VST3Classes::VST3PluginInstance*> (api))\r
return vst3->setStateFromPresetFile (rawData);\r
\r
return false;\r
void VST3PluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& results, const String& fileOrIdentifier)\r
{\r
if (fileMightContainThisPluginType (fileOrIdentifier))\r
- VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier);\r
+ VST3Classes::VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier);\r
}\r
\r
-void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int,\r
- void* userData, PluginCreationCallback callback)\r
+void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int, void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&))\r
{\r
- std::unique_ptr<VST3PluginInstance> result;\r
+ std::unique_ptr<VST3Classes::VST3PluginInstance> result;\r
\r
if (fileMightContainThisPluginType (description.fileOrIdentifier))\r
{\r
auto previousWorkingDirectory = File::getCurrentWorkingDirectory();\r
file.getParentDirectory().setAsCurrentWorkingDirectory();\r
\r
- if (const VST3ModuleHandle::Ptr module = VST3ModuleHandle::findOrCreateModule (file, description))\r
+ if (const VST3Classes::VST3ModuleHandle::Ptr module = VST3Classes::VST3ModuleHandle::findOrCreateModule (file, description))\r
{\r
- std::unique_ptr<VST3ComponentHolder> holder (new VST3ComponentHolder (module));\r
+ std::unique_ptr<VST3Classes::VST3ComponentHolder> holder (new VST3Classes::VST3ComponentHolder (module));\r
\r
if (holder->initialise())\r
{\r
- result.reset (new VST3PluginInstance (holder.release()));\r
+ result.reset (new VST3Classes::VST3PluginInstance (holder.release()));\r
\r
if (! result->initialise())\r
result.reset();\r
\r
private:\r
void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
- int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+ int initialBufferSize, void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
\r
bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
\r
namespace juce\r
{\r
\r
-//==============================================================================\r
-#if JUCE_BIG_ENDIAN\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
-#else\r
- #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
-#endif\r
-\r
//==============================================================================\r
/** Structure for VST speaker mappings\r
\r
\r
static AudioChannelSet vstArrangementTypeToChannelSet (int32 arr, int fallbackNumChannels)\r
{\r
- if (arr == Vst2::kSpeakerArrEmpty) return AudioChannelSet::disabled();\r
- else if (arr == Vst2::kSpeakerArrMono) return AudioChannelSet::mono();\r
- else if (arr == Vst2::kSpeakerArrStereo) return AudioChannelSet::stereo();\r
- else if (arr == Vst2::kSpeakerArr30Cine) return AudioChannelSet::createLCR();\r
- else if (arr == Vst2::kSpeakerArr30Music) return AudioChannelSet::createLRS();\r
- else if (arr == Vst2::kSpeakerArr40Cine) return AudioChannelSet::createLCRS();\r
- else if (arr == Vst2::kSpeakerArr50) return AudioChannelSet::create5point0();\r
- else if (arr == Vst2::kSpeakerArr51) return AudioChannelSet::create5point1();\r
- else if (arr == Vst2::kSpeakerArr60Cine) return AudioChannelSet::create6point0();\r
- else if (arr == Vst2::kSpeakerArr61Cine) return AudioChannelSet::create6point1();\r
- else if (arr == Vst2::kSpeakerArr60Music) return AudioChannelSet::create6point0Music();\r
- else if (arr == Vst2::kSpeakerArr61Music) return AudioChannelSet::create6point1Music();\r
- else if (arr == Vst2::kSpeakerArr70Music) return AudioChannelSet::create7point0();\r
- else if (arr == Vst2::kSpeakerArr70Cine) return AudioChannelSet::create7point0SDDS();\r
- else if (arr == Vst2::kSpeakerArr71Music) return AudioChannelSet::create7point1();\r
- else if (arr == Vst2::kSpeakerArr71Cine) return AudioChannelSet::create7point1SDDS();\r
- else if (arr == Vst2::kSpeakerArr40Music) return AudioChannelSet::quadraphonic();\r
-\r
- for (const Mapping* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+ if (arr == vstSpeakerConfigTypeEmpty) return AudioChannelSet::disabled();\r
+ else if (arr == vstSpeakerConfigTypeMono) return AudioChannelSet::mono();\r
+ else if (arr == vstSpeakerConfigTypeLR) return AudioChannelSet::stereo();\r
+ else if (arr == vstSpeakerConfigTypeLRC) return AudioChannelSet::createLCR();\r
+ else if (arr == vstSpeakerConfigTypeLRS) return AudioChannelSet::createLRS();\r
+ else if (arr == vstSpeakerConfigTypeLRCS) return AudioChannelSet::createLCRS();\r
+ else if (arr == vstSpeakerConfigTypeLRCLsRs) return AudioChannelSet::create5point0();\r
+ else if (arr == vstSpeakerConfigTypeLRCLfeLsRs) return AudioChannelSet::create5point1();\r
+ else if (arr == vstSpeakerConfigTypeLRCLsRsCs) return AudioChannelSet::create6point0();\r
+ else if (arr == vstSpeakerConfigTypeLRCLfeLsRsCs) return AudioChannelSet::create6point1();\r
+ else if (arr == vstSpeakerConfigTypeLRLsRsSlSr) return AudioChannelSet::create6point0Music();\r
+ else if (arr == vstSpeakerConfigTypeLRLfeLsRsSlSr) return AudioChannelSet::create6point1Music();\r
+ else if (arr == vstSpeakerConfigTypeLRCLsRsSlSr) return AudioChannelSet::create7point0();\r
+ else if (arr == vstSpeakerConfigTypeLRCLsRsLcRc) return AudioChannelSet::create7point0SDDS();\r
+ else if (arr == vstSpeakerConfigTypeLRCLfeLsRsSlSr) return AudioChannelSet::create7point1();\r
+ else if (arr == vstSpeakerConfigTypeLRCLfeLsRsLcRc) return AudioChannelSet::create7point1SDDS();\r
+ else if (arr == vstSpeakerConfigTypeLRLsRs) return AudioChannelSet::quadraphonic();\r
+\r
+ for (const Mapping* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
{\r
if (m->vst2 == arr)\r
{\r
return AudioChannelSet::discreteChannels (fallbackNumChannels);\r
}\r
\r
- static AudioChannelSet vstArrangementTypeToChannelSet (const Vst2::VstSpeakerArrangement& arr)\r
+ static AudioChannelSet vstArrangementTypeToChannelSet (const VstSpeakerConfiguration& arr)\r
{\r
- return vstArrangementTypeToChannelSet (arr.type, arr.numChannels);\r
+ return vstArrangementTypeToChannelSet (arr.type, arr.numberOfChannels);\r
}\r
\r
static int32 channelSetToVstArrangementType (AudioChannelSet channels)\r
{\r
- if (channels == AudioChannelSet::disabled()) return Vst2::kSpeakerArrEmpty;\r
- else if (channels == AudioChannelSet::mono()) return Vst2::kSpeakerArrMono;\r
- else if (channels == AudioChannelSet::stereo()) return Vst2::kSpeakerArrStereo;\r
- else if (channels == AudioChannelSet::createLCR()) return Vst2::kSpeakerArr30Cine;\r
- else if (channels == AudioChannelSet::createLRS()) return Vst2::kSpeakerArr30Music;\r
- else if (channels == AudioChannelSet::createLCRS()) return Vst2::kSpeakerArr40Cine;\r
- else if (channels == AudioChannelSet::create5point0()) return Vst2::kSpeakerArr50;\r
- else if (channels == AudioChannelSet::create5point1()) return Vst2::kSpeakerArr51;\r
- else if (channels == AudioChannelSet::create6point0()) return Vst2::kSpeakerArr60Cine;\r
- else if (channels == AudioChannelSet::create6point1()) return Vst2::kSpeakerArr61Cine;\r
- else if (channels == AudioChannelSet::create6point0Music()) return Vst2::kSpeakerArr60Music;\r
- else if (channels == AudioChannelSet::create6point1Music()) return Vst2::kSpeakerArr61Music;\r
- else if (channels == AudioChannelSet::create7point0()) return Vst2::kSpeakerArr70Music;\r
- else if (channels == AudioChannelSet::create7point0SDDS()) return Vst2::kSpeakerArr70Cine;\r
- else if (channels == AudioChannelSet::create7point1()) return Vst2::kSpeakerArr71Music;\r
- else if (channels == AudioChannelSet::create7point1SDDS()) return Vst2::kSpeakerArr71Cine;\r
- else if (channels == AudioChannelSet::quadraphonic()) return Vst2::kSpeakerArr40Music;\r
+ if (channels == AudioChannelSet::disabled()) return vstSpeakerConfigTypeEmpty;\r
+ else if (channels == AudioChannelSet::mono()) return vstSpeakerConfigTypeMono;\r
+ else if (channels == AudioChannelSet::stereo()) return vstSpeakerConfigTypeLR;\r
+ else if (channels == AudioChannelSet::createLCR()) return vstSpeakerConfigTypeLRC;\r
+ else if (channels == AudioChannelSet::createLRS()) return vstSpeakerConfigTypeLRS;\r
+ else if (channels == AudioChannelSet::createLCRS()) return vstSpeakerConfigTypeLRCS;\r
+ else if (channels == AudioChannelSet::create5point0()) return vstSpeakerConfigTypeLRCLsRs;\r
+ else if (channels == AudioChannelSet::create5point1()) return vstSpeakerConfigTypeLRCLfeLsRs;\r
+ else if (channels == AudioChannelSet::create6point0()) return vstSpeakerConfigTypeLRCLsRsCs;\r
+ else if (channels == AudioChannelSet::create6point1()) return vstSpeakerConfigTypeLRCLfeLsRsCs;\r
+ else if (channels == AudioChannelSet::create6point0Music()) return vstSpeakerConfigTypeLRLsRsSlSr;\r
+ else if (channels == AudioChannelSet::create6point1Music()) return vstSpeakerConfigTypeLRLfeLsRsSlSr;\r
+ else if (channels == AudioChannelSet::create7point0()) return vstSpeakerConfigTypeLRCLsRsSlSr;\r
+ else if (channels == AudioChannelSet::create7point0SDDS()) return vstSpeakerConfigTypeLRCLsRsLcRc;\r
+ else if (channels == AudioChannelSet::create7point1()) return vstSpeakerConfigTypeLRCLfeLsRsSlSr;\r
+ else if (channels == AudioChannelSet::create7point1SDDS()) return vstSpeakerConfigTypeLRCLfeLsRsLcRc;\r
+ else if (channels == AudioChannelSet::quadraphonic()) return vstSpeakerConfigTypeLRLsRs;\r
\r
Array<AudioChannelSet::ChannelType> chans (channels.getChannelTypes());\r
\r
if (channels == AudioChannelSet::disabled())\r
- return Vst2::kSpeakerArrEmpty;\r
+ return vstSpeakerConfigTypeEmpty;\r
\r
- for (const Mapping* m = getMappings(); m->vst2 != Vst2::kSpeakerArrEmpty; ++m)\r
+ for (const Mapping* m = getMappings(); m->vst2 != vstSpeakerConfigTypeEmpty; ++m)\r
if (m->matches (chans))\r
return m->vst2;\r
\r
- return Vst2::kSpeakerArrUserDefined;\r
+ return vstSpeakerConfigTypeUser;\r
}\r
\r
/** Class to hold a speaker configuration */\r
{\r
public:\r
VstSpeakerConfigurationHolder() { clear(); }\r
- VstSpeakerConfigurationHolder (const Vst2::VstSpeakerArrangement& vstConfig) { operator= (vstConfig); }\r
+ VstSpeakerConfigurationHolder (const VstSpeakerConfiguration& vstConfig) { operator= (vstConfig); }\r
VstSpeakerConfigurationHolder (const VstSpeakerConfigurationHolder& other) { operator= (other.get()); }\r
- VstSpeakerConfigurationHolder (VstSpeakerConfigurationHolder&& other)\r
- : storage (static_cast<HeapBlock<Vst2::VstSpeakerArrangement>&&> (other.storage)) { other.clear(); }\r
+ VstSpeakerConfigurationHolder (VstSpeakerConfigurationHolder&& other) : storage (static_cast<HeapBlock<VstSpeakerConfiguration>&&> (other.storage)) { other.clear(); }\r
\r
VstSpeakerConfigurationHolder (const AudioChannelSet& channels)\r
{\r
auto numberOfChannels = channels.size();\r
- Vst2::VstSpeakerArrangement& dst = *allocate (numberOfChannels);\r
+ VstSpeakerConfiguration& dst = *allocate (numberOfChannels);\r
\r
dst.type = channelSetToVstArrangementType (channels);\r
- dst.numChannels = numberOfChannels;\r
+ dst.numberOfChannels = numberOfChannels;\r
\r
- for (int i = 0; i < dst.numChannels; ++i)\r
+ for (int i = 0; i < dst.numberOfChannels; ++i)\r
{\r
- Vst2::VstSpeakerProperties& speaker = dst.speakers[i];\r
+ VstIndividualSpeakerInfo& speaker = dst.speakers[i];\r
\r
- zeromem (&speaker, sizeof (Vst2::VstSpeakerProperties));\r
+ zeromem (&speaker, sizeof (VstIndividualSpeakerInfo));\r
speaker.type = getSpeakerType (channels.getTypeOfChannel (i));\r
}\r
}\r
\r
VstSpeakerConfigurationHolder& operator= (const VstSpeakerConfigurationHolder& vstConfig) { return operator=(vstConfig.get()); }\r
- VstSpeakerConfigurationHolder& operator= (const Vst2::VstSpeakerArrangement& vstConfig)\r
+ VstSpeakerConfigurationHolder& operator= (const VstSpeakerConfiguration& vstConfig)\r
{\r
- Vst2::VstSpeakerArrangement& dst = *allocate (vstConfig.numChannels);\r
+ VstSpeakerConfiguration& dst = *allocate (vstConfig.numberOfChannels);\r
\r
dst.type = vstConfig.type;\r
- dst.numChannels = vstConfig.numChannels;\r
+ dst.numberOfChannels = vstConfig.numberOfChannels;\r
\r
- for (int i = 0; i < dst.numChannels; ++i)\r
+ for (int i = 0; i < dst.numberOfChannels; ++i)\r
dst.speakers[i] = vstConfig.speakers[i];\r
\r
return *this;\r
\r
VstSpeakerConfigurationHolder& operator= (VstSpeakerConfigurationHolder && vstConfig)\r
{\r
- storage = static_cast<HeapBlock<Vst2::VstSpeakerArrangement>&&> (vstConfig.storage);\r
+ storage = static_cast<HeapBlock<VstSpeakerConfiguration>&&> (vstConfig.storage);\r
vstConfig.clear();\r
\r
return *this;\r
}\r
\r
- const Vst2::VstSpeakerArrangement& get() const { return *storage.get(); }\r
+ const VstSpeakerConfiguration& get() const { return *storage.get(); }\r
\r
private:\r
JUCE_LEAK_DETECTOR (VstSpeakerConfigurationHolder)\r
\r
- HeapBlock<Vst2::VstSpeakerArrangement> storage;\r
+ HeapBlock<VstSpeakerConfiguration> storage;\r
\r
- Vst2::VstSpeakerArrangement* allocate (int numChannels)\r
+ VstSpeakerConfiguration* allocate (int numChannels)\r
{\r
- auto arrangementSize = sizeof (Vst2::VstSpeakerArrangement)\r
- + sizeof (Vst2::VstSpeakerProperties) * static_cast<size_t> (jmax (8, numChannels) - 8);\r
+ auto arrangementSize = sizeof (VstSpeakerConfiguration)\r
+ + sizeof (VstIndividualSpeakerInfo) * static_cast<size_t> (jmax (8, numChannels) - 8);\r
\r
storage.malloc (1, arrangementSize);\r
return storage.get();\r
\r
void clear()\r
{\r
- Vst2::VstSpeakerArrangement& dst = *allocate (0);\r
+ VstSpeakerConfiguration& dst = *allocate (0);\r
\r
- dst.type = Vst2::kSpeakerArrEmpty;\r
- dst.numChannels = 0;\r
+ dst.type = vstSpeakerConfigTypeEmpty;\r
+ dst.numberOfChannels = 0;\r
}\r
};\r
\r
{\r
static const Mapping mappings[] =\r
{\r
- { Vst2::kSpeakerArrMono, { centre, unknown } },\r
- { Vst2::kSpeakerArrStereo, { left, right, unknown } },\r
- { Vst2::kSpeakerArrStereoSurround, { leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArrStereoCenter, { leftCentre, rightCentre, unknown } },\r
- { Vst2::kSpeakerArrStereoSide, { leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArrStereoCLfe, { centre, LFE, unknown } },\r
- { Vst2::kSpeakerArr30Cine, { left, right, centre, unknown } },\r
- { Vst2::kSpeakerArr30Music, { left, right, surround, unknown } },\r
- { Vst2::kSpeakerArr31Cine, { left, right, centre, LFE, unknown } },\r
- { Vst2::kSpeakerArr31Music, { left, right, LFE, surround, unknown } },\r
- { Vst2::kSpeakerArr40Cine, { left, right, centre, surround, unknown } },\r
- { Vst2::kSpeakerArr40Music, { left, right, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr41Cine, { left, right, centre, LFE, surround, unknown } },\r
- { Vst2::kSpeakerArr41Music, { left, right, LFE, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr50, { left, right, centre, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr51, { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
- { Vst2::kSpeakerArr60Cine, { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
- { Vst2::kSpeakerArr60Music, { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr61Cine, { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
- { Vst2::kSpeakerArr61Music, { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr70Cine, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
- { Vst2::kSpeakerArr70Music, { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr71Cine, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
- { Vst2::kSpeakerArr71Music, { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr80Cine, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
- { Vst2::kSpeakerArr80Music, { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr81Cine, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
- { Vst2::kSpeakerArr81Music, { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
- { Vst2::kSpeakerArr102, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
- { Vst2::kSpeakerArrEmpty, { unknown } }\r
+ { vstSpeakerConfigTypeMono, { centre, unknown } },\r
+ { vstSpeakerConfigTypeLR, { left, right, unknown } },\r
+ { vstSpeakerConfigTypeLsRs, { leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLcRc, { leftCentre, rightCentre, unknown } },\r
+ { vstSpeakerConfigTypeSlSr, { leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeCLfe, { centre, LFE, unknown } },\r
+ { vstSpeakerConfigTypeLRC, { left, right, centre, unknown } },\r
+ { vstSpeakerConfigTypeLRS, { left, right, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfe, { left, right, centre, LFE, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeS, { left, right, LFE, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCS, { left, right, centre, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLsRs, { left, right, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeS, { left, right, centre, LFE, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeLsRs, { left, right, LFE, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRs, { left, right, centre, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRs, { left, right, centre, LFE, leftSurround, rightSurround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsCs, { left, right, centre, leftSurround, rightSurround, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLsRsSlSr, { left, right, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsCs, { left, right, centre, LFE, leftSurround, rightSurround, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRLfeLsRsSlSr, { left, right, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsLcRc, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsSlSr, { left, right, centre, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsLcRc, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsSlSr, { left, right, centre, LFE, leftSurround, rightSurround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsLcRcCs, { left, right, centre, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLsRsCsSlSr, { left, right, centre, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsLcRcCs, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontRight, surround, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsCsSlSr, { left, right, centre, LFE, leftSurround, rightSurround, surround, leftSurroundRear, rightSurroundRear, unknown } },\r
+ { vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2, { left, right, centre, LFE, leftSurround, rightSurround, topFrontLeft, topFrontCentre, topFrontRight, topRearLeft, topRearRight, LFE2, unknown } },\r
+ { vstSpeakerConfigTypeEmpty, { unknown } }\r
};\r
\r
return mappings;\r
{\r
switch (type)\r
{\r
- case AudioChannelSet::left: return Vst2::kSpeakerL;\r
- case AudioChannelSet::right: return Vst2::kSpeakerR;\r
- case AudioChannelSet::centre: return Vst2::kSpeakerC;\r
- case AudioChannelSet::LFE: return Vst2::kSpeakerLfe;\r
- case AudioChannelSet::leftSurround: return Vst2::kSpeakerLs;\r
- case AudioChannelSet::rightSurround: return Vst2::kSpeakerRs;\r
- case AudioChannelSet::leftCentre: return Vst2::kSpeakerLc;\r
- case AudioChannelSet::rightCentre: return Vst2::kSpeakerRc;\r
- case AudioChannelSet::surround: return Vst2::kSpeakerS;\r
- case AudioChannelSet::leftSurroundRear: return Vst2::kSpeakerSl;\r
- case AudioChannelSet::rightSurroundRear: return Vst2::kSpeakerSr;\r
- case AudioChannelSet::topMiddle: return Vst2::kSpeakerTm;\r
- case AudioChannelSet::topFrontLeft: return Vst2::kSpeakerTfl;\r
- case AudioChannelSet::topFrontCentre: return Vst2::kSpeakerTfc;\r
- case AudioChannelSet::topFrontRight: return Vst2::kSpeakerTfr;\r
- case AudioChannelSet::topRearLeft: return Vst2::kSpeakerTrl;\r
- case AudioChannelSet::topRearCentre: return Vst2::kSpeakerTrc;\r
- case AudioChannelSet::topRearRight: return Vst2::kSpeakerTrr;\r
- case AudioChannelSet::LFE2: return Vst2::kSpeakerLfe2;\r
+ case AudioChannelSet::left: return vstIndividualSpeakerTypeLeft;\r
+ case AudioChannelSet::right: return vstIndividualSpeakerTypeRight;\r
+ case AudioChannelSet::centre: return vstIndividualSpeakerTypeCentre;\r
+ case AudioChannelSet::LFE: return vstIndividualSpeakerTypeLFE;\r
+ case AudioChannelSet::leftSurround: return vstIndividualSpeakerTypeLeftSurround;\r
+ case AudioChannelSet::rightSurround: return vstIndividualSpeakerTypeRightSurround;\r
+ case AudioChannelSet::leftCentre: return vstIndividualSpeakerTypeLeftCentre;\r
+ case AudioChannelSet::rightCentre: return vstIndividualSpeakerTypeRightCentre;\r
+ case AudioChannelSet::surround: return vstIndividualSpeakerTypeSurround;\r
+ case AudioChannelSet::leftSurroundRear: return vstIndividualSpeakerTypeLeftRearSurround;\r
+ case AudioChannelSet::rightSurroundRear: return vstIndividualSpeakerTypeRightRearSurround;\r
+ case AudioChannelSet::topMiddle: return vstIndividualSpeakerTypeTopMiddle;\r
+ case AudioChannelSet::topFrontLeft: return vstIndividualSpeakerTypeTopFrontLeft;\r
+ case AudioChannelSet::topFrontCentre: return vstIndividualSpeakerTypeTopFrontCentre;\r
+ case AudioChannelSet::topFrontRight: return vstIndividualSpeakerTypeTopFrontRight;\r
+ case AudioChannelSet::topRearLeft: return vstIndividualSpeakerTypeTopRearLeft;\r
+ case AudioChannelSet::topRearCentre: return vstIndividualSpeakerTypeTopRearCentre;\r
+ case AudioChannelSet::topRearRight: return vstIndividualSpeakerTypeTopRearRight;\r
+ case AudioChannelSet::LFE2: return vstIndividualSpeakerTypeLFE2;\r
default: break;\r
}\r
\r
{\r
switch (type)\r
{\r
- case Vst2::kSpeakerL: return AudioChannelSet::left;\r
- case Vst2::kSpeakerR: return AudioChannelSet::right;\r
- case Vst2::kSpeakerC: return AudioChannelSet::centre;\r
- case Vst2::kSpeakerLfe: return AudioChannelSet::LFE;\r
- case Vst2::kSpeakerLs: return AudioChannelSet::leftSurround;\r
- case Vst2::kSpeakerRs: return AudioChannelSet::rightSurround;\r
- case Vst2::kSpeakerLc: return AudioChannelSet::leftCentre;\r
- case Vst2::kSpeakerRc: return AudioChannelSet::rightCentre;\r
- case Vst2::kSpeakerS: return AudioChannelSet::surround;\r
- case Vst2::kSpeakerSl: return AudioChannelSet::leftSurroundRear;\r
- case Vst2::kSpeakerSr: return AudioChannelSet::rightSurroundRear;\r
- case Vst2::kSpeakerTm: return AudioChannelSet::topMiddle;\r
- case Vst2::kSpeakerTfl: return AudioChannelSet::topFrontLeft;\r
- case Vst2::kSpeakerTfc: return AudioChannelSet::topFrontCentre;\r
- case Vst2::kSpeakerTfr: return AudioChannelSet::topFrontRight;\r
- case Vst2::kSpeakerTrl: return AudioChannelSet::topRearLeft;\r
- case Vst2::kSpeakerTrc: return AudioChannelSet::topRearCentre;\r
- case Vst2::kSpeakerTrr: return AudioChannelSet::topRearRight;\r
- case Vst2::kSpeakerLfe2: return AudioChannelSet::LFE2;\r
+ case vstIndividualSpeakerTypeLeft: return AudioChannelSet::left;\r
+ case vstIndividualSpeakerTypeRight: return AudioChannelSet::right;\r
+ case vstIndividualSpeakerTypeCentre: return AudioChannelSet::centre;\r
+ case vstIndividualSpeakerTypeLFE: return AudioChannelSet::LFE;\r
+ case vstIndividualSpeakerTypeLeftSurround: return AudioChannelSet::leftSurround;\r
+ case vstIndividualSpeakerTypeRightSurround: return AudioChannelSet::rightSurround;\r
+ case vstIndividualSpeakerTypeLeftCentre: return AudioChannelSet::leftCentre;\r
+ case vstIndividualSpeakerTypeRightCentre: return AudioChannelSet::rightCentre;\r
+ case vstIndividualSpeakerTypeSurround: return AudioChannelSet::surround;\r
+ case vstIndividualSpeakerTypeLeftRearSurround: return AudioChannelSet::leftSurroundRear;\r
+ case vstIndividualSpeakerTypeRightRearSurround: return AudioChannelSet::rightSurroundRear;\r
+ case vstIndividualSpeakerTypeTopMiddle: return AudioChannelSet::topMiddle;\r
+ case vstIndividualSpeakerTypeTopFrontLeft: return AudioChannelSet::topFrontLeft;\r
+ case vstIndividualSpeakerTypeTopFrontCentre: return AudioChannelSet::topFrontCentre;\r
+ case vstIndividualSpeakerTypeTopFrontRight: return AudioChannelSet::topFrontRight;\r
+ case vstIndividualSpeakerTypeTopRearLeft: return AudioChannelSet::topRearLeft;\r
+ case vstIndividualSpeakerTypeTopRearCentre: return AudioChannelSet::topRearCentre;\r
+ case vstIndividualSpeakerTypeTopRearRight: return AudioChannelSet::topRearRight;\r
+ case vstIndividualSpeakerTypeLFE2: return AudioChannelSet::LFE2;\r
default: break;\r
}\r
\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2017 - ROLI Ltd.\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+ 27th April 2017).\r
+\r
+ End User License Agreement: www.juce.com/juce-5-licence\r
+ Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+#define JUCE_VSTINTERFACE_H_INCLUDED\r
+\r
+using namespace juce;\r
+\r
+#if JUCE_MSVC\r
+ #define VSTINTERFACECALL __cdecl\r
+ #pragma pack(push)\r
+ #pragma pack(8)\r
+#elif JUCE_MAC || JUCE_IOS\r
+ #define VSTINTERFACECALL\r
+ #if JUCE_64BIT\r
+ #pragma options align=power\r
+ #else\r
+ #pragma options align=mac68k\r
+ #endif\r
+#else\r
+ #define VSTINTERFACECALL\r
+ #pragma pack(push, 8)\r
+#endif\r
+\r
+const int32 juceVstInterfaceVersion = 2400;\r
+const int32 juceVstInterfaceIdentifier = 0x56737450; // The "magic" identifier in the SDK is 'VstP'.\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstEffectInterface\r
+{\r
+ int32 interfaceIdentifier;\r
+ pointer_sized_int (VSTINTERFACECALL* dispatchFunction) (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt);\r
+ void (VSTINTERFACECALL* processAudioFunction) (VstEffectInterface*, float** inputs, float** outputs, int32 numSamples);\r
+ void (VSTINTERFACECALL* setParameterValueFunction) (VstEffectInterface*, int32 parameterIndex, float value);\r
+ float (VSTINTERFACECALL* getParameterValueFunction) (VstEffectInterface*, int32 parameterIndex);\r
+ int32 numPrograms;\r
+ int32 numParameters;\r
+ int32 numInputChannels;\r
+ int32 numOutputChannels;\r
+ int32 flags;\r
+ pointer_sized_int hostSpace1;\r
+ pointer_sized_int hostSpace2;\r
+ int32 latency;\r
+ int32 deprecated1;\r
+ int32 deprecated2;\r
+ float deprecated3;\r
+ void* effectPointer;\r
+ void* userPointer;\r
+ int32 plugInIdentifier;\r
+ int32 plugInVersion;\r
+ void (VSTINTERFACECALL* processAudioInplaceFunction) (VstEffectInterface*, float** inputs, float** outputs, int32 numSamples);\r
+ void (VSTINTERFACECALL* processDoubleAudioInplaceFunction) (VstEffectInterface*, double** inputs, double** outputs, int32 numSamples);\r
+ char emptySpace[56];\r
+};\r
+\r
+typedef pointer_sized_int (VSTINTERFACECALL* VstHostCallback) (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt);\r
+\r
+enum VstEffectInterfaceFlags\r
+{\r
+ vstEffectFlagHasEditor = 1,\r
+ vstEffectFlagInplaceAudio = 16,\r
+ vstEffectFlagDataInChunks = 32,\r
+ vstEffectFlagIsSynth = 256,\r
+ vstEffectFlagInplaceDoubleAudio = 4096\r
+};\r
+\r
+//==============================================================================\r
+enum VstHostToPlugInOpcodes\r
+{\r
+ plugInOpcodeOpen,\r
+ plugInOpcodeClose,\r
+ plugInOpcodeSetCurrentProgram,\r
+ plugInOpcodeGetCurrentProgram,\r
+ plugInOpcodeSetCurrentProgramName,\r
+ plugInOpcodeGetCurrentProgramName,\r
+ plugInOpcodeGetParameterLabel,\r
+ plugInOpcodeGetParameterText,\r
+ plugInOpcodeGetParameterName,\r
+ plugInOpcodeSetSampleRate = plugInOpcodeGetParameterName + 2,\r
+ plugInOpcodeSetBlockSize,\r
+ plugInOpcodeResumeSuspend,\r
+ plugInOpcodeGetEditorBounds,\r
+ plugInOpcodeOpenEditor,\r
+ plugInOpcodeCloseEditor,\r
+ plugInOpcodeDrawEditor,\r
+ plugInOpcodeGetMouse,\r
+ plugInOpcodeEditorIdle = plugInOpcodeGetMouse + 2,\r
+ plugInOpcodeeffEditorTop,\r
+ plugInOpcodeSleepEditor,\r
+ plugInOpcodeIdentify,\r
+ plugInOpcodeGetData,\r
+ plugInOpcodeSetData,\r
+ plugInOpcodePreAudioProcessingEvents,\r
+ plugInOpcodeIsParameterAutomatable,\r
+ plugInOpcodeParameterValueForText,\r
+ plugInOpcodeGetProgramName = plugInOpcodeParameterValueForText + 2,\r
+ plugInOpcodeConnectInput = plugInOpcodeGetProgramName + 2,\r
+ plugInOpcodeConnectOutput,\r
+ plugInOpcodeGetInputPinProperties,\r
+ plugInOpcodeGetOutputPinProperties,\r
+ plugInOpcodeGetPlugInCategory,\r
+ plugInOpcodeSetSpeakerConfiguration = plugInOpcodeGetPlugInCategory + 7,\r
+ plugInOpcodeSetBypass = plugInOpcodeSetSpeakerConfiguration + 2,\r
+ plugInOpcodeGetPlugInName,\r
+ plugInOpcodeGetManufacturerName = plugInOpcodeGetPlugInName + 2,\r
+ plugInOpcodeGetManufacturerProductName,\r
+ plugInOpcodeGetManufacturerVersion,\r
+ plugInOpcodeManufacturerSpecific,\r
+ plugInOpcodeCanPlugInDo,\r
+ plugInOpcodeGetTailSize,\r
+ plugInOpcodeIdle,\r
+ plugInOpcodeKeyboardFocusRequired = plugInOpcodeIdle + 4,\r
+ plugInOpcodeGetVstInterfaceVersion,\r
+ plugInOpcodeGetCurrentMidiProgram = plugInOpcodeGetVstInterfaceVersion + 5,\r
+ plugInOpcodeGetSpeakerArrangement = plugInOpcodeGetCurrentMidiProgram + 6,\r
+ plugInOpcodeNextPlugInUniqueID,\r
+ plugInOpcodeStartProcess,\r
+ plugInOpcodeStopProcess,\r
+ plugInOpcodeSetNumberOfSamplesToProcess,\r
+ plugInOpcodeSetSampleFloatType = plugInOpcodeSetNumberOfSamplesToProcess + 4,\r
+ pluginOpcodeGetNumMidiInputChannels,\r
+ pluginOpcodeGetNumMidiOutputChannels,\r
+ plugInOpcodeMaximum = pluginOpcodeGetNumMidiOutputChannels\r
+};\r
+\r
+\r
+enum VstPlugInToHostOpcodes\r
+{\r
+ hostOpcodeParameterChanged,\r
+ hostOpcodeVstVersion,\r
+ hostOpcodeCurrentId,\r
+ hostOpcodeIdle,\r
+ hostOpcodePinConnected,\r
+ hostOpcodePlugInWantsMidi = hostOpcodePinConnected + 2,\r
+ hostOpcodeGetTimingInfo,\r
+ hostOpcodePreAudioProcessingEvents,\r
+ hostOpcodeSetTime,\r
+ hostOpcodeTempoAt,\r
+ hostOpcodeGetNumberOfAutomatableParameters,\r
+ hostOpcodeGetParameterInterval,\r
+ hostOpcodeIOModified,\r
+ hostOpcodeNeedsIdle,\r
+ hostOpcodeWindowSize,\r
+ hostOpcodeGetSampleRate,\r
+ hostOpcodeGetBlockSize,\r
+ hostOpcodeGetInputLatency,\r
+ hostOpcodeGetOutputLatency,\r
+ hostOpcodeGetPreviousPlugIn,\r
+ hostOpcodeGetNextPlugIn,\r
+ hostOpcodeWillReplace,\r
+ hostOpcodeGetCurrentAudioProcessingLevel,\r
+ hostOpcodeGetAutomationState,\r
+ hostOpcodeOfflineStart,\r
+ hostOpcodeOfflineReadSource,\r
+ hostOpcodeOfflineWrite,\r
+ hostOpcodeOfflineGetCurrentPass,\r
+ hostOpcodeOfflineGetCurrentMetaPass,\r
+ hostOpcodeSetOutputSampleRate,\r
+ hostOpcodeGetOutputSpeakerConfiguration,\r
+ hostOpcodeGetManufacturerName,\r
+ hostOpcodeGetProductName,\r
+ hostOpcodeGetManufacturerVersion,\r
+ hostOpcodeManufacturerSpecific,\r
+ hostOpcodeSetIcon,\r
+ hostOpcodeCanHostDo,\r
+ hostOpcodeGetLanguage,\r
+ hostOpcodeOpenEditorWindow,\r
+ hostOpcodeCloseEditorWindow,\r
+ hostOpcodeGetDirectory,\r
+ hostOpcodeUpdateView,\r
+ hostOpcodeParameterChangeGestureBegin,\r
+ hostOpcodeParameterChangeGestureEnd,\r
+};\r
+\r
+//==============================================================================\r
+enum VstProcessingSampleType\r
+{\r
+ vstProcessingSampleTypeFloat,\r
+ vstProcessingSampleTypeDouble\r
+};\r
+\r
+//==============================================================================\r
+// These names must be identical to the Steinberg SDK so JUCE users can set\r
+// exactly what they want.\r
+enum VstPlugInCategory\r
+{\r
+ kPlugCategUnknown,\r
+ kPlugCategEffect,\r
+ kPlugCategSynth,\r
+ kPlugCategAnalysis,\r
+ kPlugCategMastering,\r
+ kPlugCategSpacializer,\r
+ kPlugCategRoomFx,\r
+ kPlugSurroundFx,\r
+ kPlugCategRestoration,\r
+ kPlugCategOfflineProcess,\r
+ kPlugCategShell,\r
+ kPlugCategGenerator\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstEditorBounds\r
+{\r
+ int16 upper;\r
+ int16 leftmost;\r
+ int16 lower;\r
+ int16 rightmost;\r
+};\r
+\r
+//==============================================================================\r
+enum VstMaxStringLengths\r
+{\r
+ vstMaxNameLength = 64,\r
+ vstMaxParameterOrPinLabelLength = 64,\r
+ vstMaxParameterOrPinShortLabelLength = 8,\r
+ vstMaxCategoryLength = 24,\r
+ vstMaxManufacturerStringLength = 64,\r
+ vstMaxPlugInNameStringLength = 64\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstPinInfo\r
+{\r
+ char text[vstMaxParameterOrPinLabelLength];\r
+ int32 flags;\r
+ int32 configurationType;\r
+ char shortText[vstMaxParameterOrPinShortLabelLength];\r
+ char unused[48];\r
+};\r
+\r
+enum VstPinInfoFlags\r
+{\r
+ vstPinInfoFlagIsActive = 1,\r
+ vstPinInfoFlagIsStereo = 2,\r
+ vstPinInfoFlagValid = 4\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstEvent\r
+{\r
+ int32 type;\r
+ int32 size;\r
+ int32 sampleOffset;\r
+ int32 flags;\r
+ char content[16];\r
+};\r
+\r
+enum VstEventTypes\r
+{\r
+ vstMidiEventType = 1,\r
+ vstSysExEventType = 6\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstEventBlock\r
+{\r
+ int32 numberOfEvents;\r
+ pointer_sized_int future;\r
+ VstEvent* events[2];\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstMidiEvent\r
+{\r
+ int32 type;\r
+ int32 size;\r
+ int32 sampleOffset;\r
+ int32 flags;\r
+ int32 noteSampleLength;\r
+ int32 noteSampleOffset;\r
+ char midiData[4];\r
+ char tuning;\r
+ char noteVelocityOff;\r
+ char future1;\r
+ char future2;\r
+};\r
+\r
+enum VstMidiEventFlags\r
+{\r
+ vstMidiEventIsRealtime = 1\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstSysExEvent\r
+{\r
+ int32 type;\r
+ int32 size;\r
+ int32 offsetSamples;\r
+ int32 flags;\r
+ int32 sysExDumpSize;\r
+ pointer_sized_int future1;\r
+ char* sysExDump;\r
+ pointer_sized_int future2;\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstTimingInformation\r
+{\r
+ double samplePosition;\r
+ double sampleRate;\r
+ double systemTimeNanoseconds;\r
+ double musicalPosition;\r
+ double tempoBPM;\r
+ double lastBarPosition;\r
+ double loopStartPosition;\r
+ double loopEndPosition;\r
+ int32 timeSignatureNumerator;\r
+ int32 timeSignatureDenominator;\r
+ int32 smpteOffset;\r
+ int32 smpteRate;\r
+ int32 samplesToNearestClock;\r
+ int32 flags;\r
+};\r
+\r
+enum VstTimingInformationFlags\r
+{\r
+ vstTimingInfoFlagTransportChanged = 1,\r
+ vstTimingInfoFlagCurrentlyPlaying = 2,\r
+ vstTimingInfoFlagLoopActive = 4,\r
+ vstTimingInfoFlagCurrentlyRecording = 8,\r
+ vstTimingInfoFlagAutomationWriteModeActive = 64,\r
+ vstTimingInfoFlagAutomationReadModeActive = 128,\r
+ vstTimingInfoFlagNanosecondsValid = 256,\r
+ vstTimingInfoFlagMusicalPositionValid = 512,\r
+ vstTimingInfoFlagTempoValid = 1024,\r
+ vstTimingInfoFlagLastBarPositionValid = 2048,\r
+ vstTimingInfoFlagLoopPositionValid = 4096,\r
+ vstTimingInfoFlagTimeSignatureValid = 8192,\r
+ vstTimingInfoFlagSmpteValid = 16384,\r
+ vstTimingInfoFlagNearestClockValid = 32768\r
+};\r
+\r
+//==============================================================================\r
+enum VstSmpteRates\r
+{\r
+ vstSmpteRateFps24,\r
+ vstSmpteRateFps25,\r
+ vstSmpteRateFps2997,\r
+ vstSmpteRateFps30,\r
+ vstSmpteRateFps2997drop,\r
+ vstSmpteRateFps30drop,\r
+\r
+ vstSmpteRate16mmFilm,\r
+ vstSmpteRate35mmFilm,\r
+\r
+ vstSmpteRateFps239 = vstSmpteRate35mmFilm + 3,\r
+ vstSmpteRateFps249 ,\r
+ vstSmpteRateFps599,\r
+ vstSmpteRateFps60\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstIndividualSpeakerInfo\r
+{\r
+ float azimuthalAngle;\r
+ float elevationAngle;\r
+ float radius;\r
+ float reserved;\r
+ char label[vstMaxNameLength];\r
+ int32 type;\r
+ char unused[28];\r
+};\r
+\r
+enum VstIndividualSpeakerType\r
+{\r
+ vstIndividualSpeakerTypeUndefined = 0x7fffffff,\r
+ vstIndividualSpeakerTypeMono = 0,\r
+ vstIndividualSpeakerTypeLeft,\r
+ vstIndividualSpeakerTypeRight,\r
+ vstIndividualSpeakerTypeCentre,\r
+ vstIndividualSpeakerTypeLFE,\r
+ vstIndividualSpeakerTypeLeftSurround,\r
+ vstIndividualSpeakerTypeRightSurround,\r
+ vstIndividualSpeakerTypeLeftCentre,\r
+ vstIndividualSpeakerTypeRightCentre,\r
+ vstIndividualSpeakerTypeSurround,\r
+ vstIndividualSpeakerTypeCentreSurround = vstIndividualSpeakerTypeSurround,\r
+ vstIndividualSpeakerTypeLeftRearSurround,\r
+ vstIndividualSpeakerTypeRightRearSurround,\r
+ vstIndividualSpeakerTypeTopMiddle,\r
+ vstIndividualSpeakerTypeTopFrontLeft,\r
+ vstIndividualSpeakerTypeTopFrontCentre,\r
+ vstIndividualSpeakerTypeTopFrontRight,\r
+ vstIndividualSpeakerTypeTopRearLeft,\r
+ vstIndividualSpeakerTypeTopRearCentre,\r
+ vstIndividualSpeakerTypeTopRearRight,\r
+ vstIndividualSpeakerTypeLFE2\r
+};\r
+\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct VstSpeakerConfiguration\r
+{\r
+ int32 type;\r
+ int32 numberOfChannels;\r
+ VstIndividualSpeakerInfo speakers[8];\r
+};\r
+\r
+enum VstSpeakerConfigurationType\r
+{\r
+ vstSpeakerConfigTypeUser = -2,\r
+ vstSpeakerConfigTypeEmpty = -1,\r
+ vstSpeakerConfigTypeMono = 0,\r
+ vstSpeakerConfigTypeLR,\r
+ vstSpeakerConfigTypeLsRs,\r
+ vstSpeakerConfigTypeLcRc,\r
+ vstSpeakerConfigTypeSlSr,\r
+ vstSpeakerConfigTypeCLfe,\r
+ vstSpeakerConfigTypeLRC,\r
+ vstSpeakerConfigTypeLRS,\r
+ vstSpeakerConfigTypeLRCLfe,\r
+ vstSpeakerConfigTypeLRLfeS,\r
+ vstSpeakerConfigTypeLRCS,\r
+ vstSpeakerConfigTypeLRLsRs,\r
+ vstSpeakerConfigTypeLRCLfeS,\r
+ vstSpeakerConfigTypeLRLfeLsRs,\r
+ vstSpeakerConfigTypeLRCLsRs,\r
+ vstSpeakerConfigTypeLRCLfeLsRs,\r
+ vstSpeakerConfigTypeLRCLsRsCs,\r
+ vstSpeakerConfigTypeLRLsRsSlSr,\r
+ vstSpeakerConfigTypeLRCLfeLsRsCs,\r
+ vstSpeakerConfigTypeLRLfeLsRsSlSr,\r
+ vstSpeakerConfigTypeLRCLsRsLcRc,\r
+ vstSpeakerConfigTypeLRCLsRsSlSr,\r
+ vstSpeakerConfigTypeLRCLfeLsRsLcRc,\r
+ vstSpeakerConfigTypeLRCLfeLsRsSlSr,\r
+ vstSpeakerConfigTypeLRCLsRsLcRcCs,\r
+ vstSpeakerConfigTypeLRCLsRsCsSlSr,\r
+ vstSpeakerConfigTypeLRCLfeLsRsLcRcCs,\r
+ vstSpeakerConfigTypeLRCLfeLsRsCsSlSr,\r
+ vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2\r
+};\r
+\r
+#if JUCE_BIG_ENDIAN\r
+ #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24))\r
+#else\r
+ #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24))\r
+#endif\r
+\r
+enum PresonusExtensionConstants\r
+{\r
+ presonusVendorID = JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S'),\r
+ presonusSetContentScaleFactor = JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's')\r
+};\r
+\r
+//==============================================================================\r
+/** Structure used for VSTs\r
+\r
+ @tags{Audio}\r
+*/\r
+struct vst2FxBank\r
+{\r
+ int32 magic1;\r
+ int32 size;\r
+ int32 magic2;\r
+ int32 version1;\r
+ int32 fxID;\r
+ int32 version2;\r
+ int32 elements;\r
+ int32 current;\r
+ char shouldBeZero[124];\r
+ int32 chunkSize;\r
+ char chunk[1];\r
+};\r
+\r
+#if JUCE_MSVC\r
+ #pragma pack(pop)\r
+#elif JUCE_MAC || JUCE_IOS\r
+ #pragma options align=reset\r
+#else\r
+ #pragma pack(pop)\r
+#endif\r
numEventsUsed = 0;\r
\r
if (events != nullptr)\r
- events->numEvents = 0;\r
+ events->numberOfEvents = 0;\r
}\r
\r
void addEvent (const void* const midiData, const int numBytes, const int frameOffset)\r
{\r
ensureSize (numEventsUsed + 1);\r
\r
- Vst2::VstMidiEvent* const e = (Vst2::VstMidiEvent*) (events->events [numEventsUsed]);\r
- events->numEvents = ++numEventsUsed;\r
+ VstMidiEvent* const e = (VstMidiEvent*) (events->events [numEventsUsed]);\r
+ events->numberOfEvents = ++numEventsUsed;\r
\r
if (numBytes <= 4)\r
{\r
- if (e->type == Vst2::kVstSysExType)\r
+ if (e->type == vstSysExEventType)\r
{\r
- delete[] (((Vst2::VstMidiSysexEvent*) e)->sysexDump);\r
- e->type = Vst2::kVstMidiType;\r
- e->byteSize = sizeof (Vst2::VstMidiEvent);\r
- e->noteLength = 0;\r
- e->noteOffset = 0;\r
- e->detune = 0;\r
- e->noteOffVelocity = 0;\r
+ delete[] (((VstSysExEvent*) e)->sysExDump);\r
+ e->type = vstMidiEventType;\r
+ e->size = sizeof (VstMidiEvent);\r
+ e->noteSampleLength = 0;\r
+ e->noteSampleOffset = 0;\r
+ e->tuning = 0;\r
+ e->noteVelocityOff = 0;\r
}\r
\r
- e->deltaFrames = frameOffset;\r
+ e->sampleOffset = frameOffset;\r
memcpy (e->midiData, midiData, (size_t) numBytes);\r
}\r
else\r
{\r
- Vst2::VstMidiSysexEvent* const se = (Vst2::VstMidiSysexEvent*) e;\r
+ VstSysExEvent* const se = (VstSysExEvent*) e;\r
\r
- if (se->type == Vst2::kVstSysExType)\r
- delete[] se->sysexDump;\r
+ if (se->type == vstSysExEventType)\r
+ delete[] se->sysExDump;\r
\r
- se->sysexDump = new char [(size_t) numBytes];\r
- memcpy (se->sysexDump, midiData, (size_t) numBytes);\r
+ se->sysExDump = new char [(size_t) numBytes];\r
+ memcpy (se->sysExDump, midiData, (size_t) numBytes);\r
\r
- se->type = Vst2::kVstSysExType;\r
- se->byteSize = sizeof (Vst2::VstMidiSysexEvent);\r
- se->deltaFrames = frameOffset;\r
+ se->type = vstSysExEventType;\r
+ se->size = sizeof (VstSysExEvent);\r
+ se->offsetSamples = frameOffset;\r
se->flags = 0;\r
- se->dumpBytes = numBytes;\r
- se->resvd1 = 0;\r
- se->resvd2 = 0;\r
+ se->sysExDumpSize = numBytes;\r
+ se->future1 = 0;\r
+ se->future2 = 0;\r
}\r
}\r
\r
//==============================================================================\r
// Handy method to pull the events out of an event buffer supplied by the host\r
// or plugin.\r
- static void addEventsToMidiBuffer (const Vst2::VstEvents* events, MidiBuffer& dest)\r
+ static void addEventsToMidiBuffer (const VstEventBlock* events, MidiBuffer& dest)\r
{\r
- for (int i = 0; i < events->numEvents; ++i)\r
+ for (int i = 0; i < events->numberOfEvents; ++i)\r
{\r
- const Vst2::VstEvent* const e = events->events[i];\r
+ const VstEvent* const e = events->events[i];\r
\r
if (e != nullptr)\r
{\r
- if (e->type == Vst2::kVstMidiType)\r
+ if (e->type == vstMidiEventType)\r
{\r
- dest.addEvent ((const juce::uint8*) ((const Vst2::VstMidiEvent*) e)->midiData,\r
- 4, e->deltaFrames);\r
+ dest.addEvent ((const juce::uint8*) ((const VstMidiEvent*) e)->midiData,\r
+ 4, e->sampleOffset);\r
}\r
- else if (e->type == Vst2::kVstSysExType)\r
+ else if (e->type == vstSysExEventType)\r
{\r
- dest.addEvent ((const juce::uint8*) ((const Vst2::VstMidiSysexEvent*) e)->sysexDump,\r
- (int) ((const Vst2::VstMidiSysexEvent*) e)->dumpBytes,\r
- e->deltaFrames);\r
+ dest.addEvent ((const juce::uint8*) ((const VstSysExEvent*) e)->sysExDump,\r
+ (int) ((const VstSysExEvent*) e)->sysExDumpSize,\r
+ e->sampleOffset);\r
}\r
}\r
}\r
{\r
numEventsNeeded = (numEventsNeeded + 32) & ~31;\r
\r
- const size_t size = 20 + sizeof (Vst2::VstEvent*) * (size_t) numEventsNeeded;\r
+ const size_t size = 20 + sizeof (VstEvent*) * (size_t) numEventsNeeded;\r
\r
if (events == nullptr)\r
events.calloc (size, 1);\r
}\r
\r
//==============================================================================\r
- HeapBlock<Vst2::VstEvents> events;\r
+ HeapBlock<VstEventBlock> events;\r
\r
private:\r
int numEventsUsed, numEventsAllocated;\r
\r
- static Vst2::VstEvent* allocateVSTEvent()\r
+ static VstEvent* allocateVSTEvent()\r
{\r
- auto e = (Vst2::VstEvent*) std::calloc (1, sizeof (Vst2::VstMidiEvent) > sizeof (Vst2::VstMidiSysexEvent) ? sizeof (Vst2::VstMidiEvent)\r
- : sizeof (Vst2::VstMidiSysexEvent));\r
- e->type = Vst2::kVstMidiType;\r
- e->byteSize = sizeof (Vst2::VstMidiEvent);\r
+ auto e = (VstEvent*) std::calloc (1, sizeof (VstMidiEvent) > sizeof (VstSysExEvent) ? sizeof (VstMidiEvent)\r
+ : sizeof (VstSysExEvent));\r
+ e->type = vstMidiEventType;\r
+ e->size = sizeof (VstMidiEvent);\r
return e;\r
}\r
\r
- static void freeVSTEvent (Vst2::VstEvent* e)\r
+ static void freeVSTEvent (VstEvent* e)\r
{\r
- if (e->type == Vst2::kVstSysExType)\r
- delete[] (((Vst2::VstMidiSysexEvent*) e)->sysexDump);\r
+ if (e->type == vstSysExEventType)\r
+ delete[] (((VstSysExEvent*) e)->sysExDump);\r
\r
std::free (e);\r
}\r
#define __cdecl\r
#endif\r
\r
-#define VST_FORCE_DEPRECATED 0\r
-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
-\r
namespace Vst2\r
{\r
-// If the following files cannot be found then you are probably trying to host\r
-// VST2 plug-ins. To do this you must have a VST2 SDK in your header search\r
-// paths or use the "VST (Legacy) SDK Folder" field in the Projucer. The VST2\r
-// SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3\r
-// SDK or JUCE version 5.3.2.\r
-#include <pluginterfaces/vst2.x/aeffect.h>\r
-#include <pluginterfaces/vst2.x/aeffectx.h>\r
+ #include "juce_VSTInterface.h"\r
}\r
\r
+using namespace Vst2;\r
+\r
#include "juce_VSTCommon.h"\r
\r
#if JUCE_MSVC\r
#endif\r
\r
#ifndef JUCE_VST_WRAPPER_INVOKE_MAIN\r
-#define JUCE_VST_WRAPPER_INVOKE_MAIN effect = module->moduleMain ((Vst2::audioMasterCallback) &audioMaster);\r
+ #define JUCE_VST_WRAPPER_INVOKE_MAIN effect = module->moduleMain (&audioMaster);\r
#endif\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
-typedef Vst2::AEffect* (VSTCALLBACK *MainCall) (Vst2::audioMasterCallback);\r
-static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect*, int32, int32, pointer_sized_int, void*, float);\r
+typedef VstEffectInterface* (VSTINTERFACECALL *MainCall) (VstHostCallback);\r
+static pointer_sized_int VSTINTERFACECALL audioMaster (VstEffectInterface*, int32, int32, pointer_sized_int, void*, float);\r
\r
//==============================================================================\r
// Change this to disable logging of various VST activities\r
\r
namespace\r
{\r
- using EventProcPtr = void (*)(XEvent*);\r
+ typedef void (*EventProcPtr) (XEvent* ev);\r
\r
Window getChildWindow (Window windowToCheck)\r
{\r
\r
if (moduleMain != nullptr)\r
{\r
- vstXml = parseXML (file.withFileExtension ("vstxml"));\r
+ vstXml.reset (XmlDocument::parse (file.withFileExtension ("vstxml")));\r
\r
#if JUCE_WINDOWS\r
if (vstXml == nullptr)\r
- vstXml = parseXML (getDLLResource (file, "VSTXML", 1));\r
+ vstXml.reset (XmlDocument::parse (getDLLResource (file, "VSTXML", 1)));\r
#endif\r
}\r
\r
module.close();\r
}\r
\r
- void closeEffect (Vst2::AEffect* eff)\r
+ void closeEffect (VstEffectInterface* eff)\r
{\r
- eff->dispatcher (eff, Vst2::effClose, 0, 0, 0, 0);\r
+ eff->dispatchFunction (eff, plugInOpcodeClose, 0, 0, 0, 0);\r
}\r
\r
#if JUCE_WINDOWS\r
.findChildFiles (File::findFiles, false, "*.vstxml");\r
\r
if (! vstXmlFiles.isEmpty())\r
- vstXml = parseXML (vstXmlFiles.getReference(0));\r
+ vstXml.reset (XmlDocument::parse (vstXmlFiles.getReference(0)));\r
}\r
}\r
\r
}\r
}\r
\r
- void closeEffect (Vst2::AEffect* eff)\r
+ void closeEffect (VstEffectInterface* eff)\r
{\r
- eff->dispatcher (eff, Vst2::effClose, 0, 0, 0, 0);\r
+ eff->dispatchFunction (eff, plugInOpcodeClose, 0, 0, 0, 0);\r
}\r
\r
#endif\r
{\r
const ScopedLock sl (pluginInstance.lock);\r
\r
- return effect->getParameter (effect, getParameterIndex());\r
+ return effect->getParameterValueFunction (effect, getParameterIndex());\r
}\r
\r
return 0.0f;\r
{\r
const ScopedLock sl (pluginInstance.lock);\r
\r
- if (effect->getParameter (effect, getParameterIndex()) != newValue)\r
- effect->setParameter (effect, getParameterIndex(), newValue);\r
+ if (effect->getParameterValueFunction (effect, getParameterIndex()) != newValue)\r
+ effect->setParameterValueFunction (effect, getParameterIndex(), newValue);\r
}\r
}\r
\r
if (valueType != nullptr || ! vstValueStrings.isEmpty())\r
return getText (getValue(), 1024);\r
\r
- return pluginInstance.getTextForOpcode (getParameterIndex(), Vst2::effGetParamDisplay);\r
+ return pluginInstance.getTextForOpcode (getParameterIndex(), plugInOpcodeGetParameterText);\r
}\r
\r
float getDefaultValue() const override\r
{\r
if (name.isEmpty())\r
return pluginInstance.getTextForOpcode (getParameterIndex(),\r
- Vst2::effGetParamName);\r
+ plugInOpcodeGetParameterName);\r
\r
if (name.length() <= maximumStringLength)\r
return name;\r
String getLabel() const override\r
{\r
return label.isEmpty() ? pluginInstance.getTextForOpcode (getParameterIndex(),\r
- Vst2::effGetParamLabel)\r
+ plugInOpcodeGetParameterLabel)\r
: label;\r
}\r
\r
const VSTXMLInfo::ValueType* const valueType;\r
};\r
\r
- VSTPluginInstance (const ModuleHandle::Ptr& mh, const BusesProperties& ioConfig, Vst2::AEffect* effect,\r
+ VSTPluginInstance (const ModuleHandle::Ptr& mh, const BusesProperties& ioConfig, VstEffectInterface* effect,\r
double sampleRateToUse, int blockSizeToUse)\r
: AudioPluginInstance (ioConfig),\r
vstEffect (effect),\r
if (auto* xml = vstModule->vstXml.get())\r
xmlInfo.reset (VSTXMLInfo::createFor (*xml));\r
\r
- for (int i = 0; i < vstEffect->numParams; ++i)\r
+ for (int i = 0; i < vstEffect->numParameters; ++i)\r
{\r
String paramName;\r
Array<String> shortParamNames;\r
float defaultValue = 0;\r
String label;\r
- bool isAutomatable = dispatch (Vst2::effCanBeAutomated, i, 0, 0, 0) != 0;\r
+ bool isAutomatable = dispatch (plugInOpcodeIsParameterAutomatable, i, 0, 0, 0) != 0;\r
bool isDiscrete = false;\r
int numSteps = AudioProcessor::getDefaultNumParameterSteps();\r
bool isBoolSwitch = false;\r
\r
~VSTPluginInstance()\r
{\r
- if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */)\r
+ if (vstEffect != nullptr && vstEffect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
{\r
struct VSTDeleter : public CallbackMessage\r
{\r
\r
void cleanup()\r
{\r
- if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */)\r
+ if (vstEffect != nullptr && vstEffect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
{\r
#if JUCE_MAC\r
if (vstModule->resFileId != 0)\r
// Must delete any editors before deleting the plugin instance!\r
jassert (getActiveEditor() == 0);\r
\r
- _fpreset(); // some dodgy plug-ins mess around with this\r
+ _fpreset(); // some dodgy plugs fuck around with this\r
\r
vstModule->closeEffect (vstEffect);\r
}\r
{\r
if (auto* newEffect = constructEffect (newModule))\r
{\r
- newEffect->resvd2 = 0;\r
+ newEffect->hostSpace2 = 0;\r
\r
- newEffect->dispatcher (newEffect, Vst2::effIdentify, 0, 0, 0, 0);\r
+ newEffect->dispatchFunction (newEffect, plugInOpcodeIdentify, 0, 0, 0, 0);\r
\r
auto blockSize = jmax (32, initialBlockSize);\r
\r
- newEffect->dispatcher (newEffect, Vst2::effSetSampleRate, 0, 0, 0, static_cast<float> (initialSampleRate));\r
- newEffect->dispatcher (newEffect, Vst2::effSetBlockSize, 0, blockSize, 0, 0);\r
+ newEffect->dispatchFunction (newEffect, plugInOpcodeSetSampleRate, 0, 0, 0, static_cast<float> (initialSampleRate));\r
+ newEffect->dispatchFunction (newEffect, plugInOpcodeSetBlockSize, 0, blockSize, 0, 0);\r
\r
- newEffect->dispatcher (newEffect, Vst2::effOpen, 0, 0, 0, 0);\r
+ newEffect->dispatchFunction (newEffect, plugInOpcodeOpen, 0, 0, 0, 0);\r
BusesProperties ioConfig = queryBusIO (newEffect);\r
\r
return new VSTPluginInstance (newModule, ioConfig, newEffect, initialSampleRate, blockSize);\r
\r
{\r
char buffer[512] = { 0 };\r
- dispatch (Vst2::effGetEffectName, 0, 0, buffer, 0);\r
+ dispatch (plugInOpcodeGetPlugInName, 0, 0, buffer, 0);\r
\r
desc.descriptiveName = String::createStringFromData (buffer, (int) sizeof (buffer)).trim();\r
\r
\r
{\r
char buffer[512] = { 0 };\r
- dispatch (Vst2::effGetVendorString, 0, 0, buffer, 0);\r
+ dispatch (plugInOpcodeGetManufacturerName, 0, 0, buffer, 0);\r
desc.manufacturerName = String::createStringFromData (buffer, (int) sizeof (buffer)).trim();\r
}\r
\r
desc.version = getVersion();\r
desc.numInputChannels = getTotalNumInputChannels();\r
desc.numOutputChannels = getTotalNumOutputChannels();\r
- desc.isInstrument = (vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsIsSynth) != 0);\r
+ desc.isInstrument = (vstEffect != nullptr && (vstEffect->flags & vstEffectFlagIsSynth) != 0);\r
}\r
\r
bool initialiseEffect (double initialSampleRate, int initialBlockSize)\r
{\r
if (vstEffect != nullptr)\r
{\r
- vstEffect->resvd2 = (pointer_sized_int) (pointer_sized_int) this;\r
+ vstEffect->hostSpace2 = (pointer_sized_int) (pointer_sized_int) this;\r
initialise (initialSampleRate, initialBlockSize);\r
return true;\r
}\r
// because many plugins need a chance to create HWNDs that will get their\r
// messages delivered by the main message thread, and that's not possible from\r
// a background thread.\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
#endif\r
\r
JUCE_VST_LOG ("Initialising VST: " + vstModule->pluginName + " (" + getVersion() + ")");\r
\r
setRateAndBufferSizeDetails (initialSampleRate, initialBlockSize);\r
\r
- dispatch (Vst2::effIdentify, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeIdentify, 0, 0, 0, 0);\r
\r
if (getSampleRate() > 0)\r
- dispatch (Vst2::effSetSampleRate, 0, 0, 0, (float) getSampleRate());\r
+ dispatch (plugInOpcodeSetSampleRate, 0, 0, 0, (float) getSampleRate());\r
\r
if (getBlockSize() > 0)\r
- dispatch (Vst2::effSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0);\r
+ dispatch (plugInOpcodeSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0);\r
\r
- dispatch (Vst2::effOpen, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeOpen, 0, 0, 0, 0);\r
\r
setRateAndBufferSizeDetails (getSampleRate(), getBlockSize());\r
\r
if (getNumPrograms() > 1)\r
setCurrentProgram (0);\r
else\r
- dispatch (Vst2::effSetProgram, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeSetCurrentProgram, 0, 0, 0, 0);\r
\r
- for (int i = vstEffect->numInputs; --i >= 0;) dispatch (Vst2::effConnectInput, i, 1, 0, 0);\r
- for (int i = vstEffect->numOutputs; --i >= 0;) dispatch (Vst2::effConnectOutput, i, 1, 0, 0);\r
+ for (int i = vstEffect->numInputChannels; --i >= 0;) dispatch (plugInOpcodeConnectInput, i, 1, 0, 0);\r
+ for (int i = vstEffect->numOutputChannels; --i >= 0;) dispatch (plugInOpcodeConnectOutput, i, 1, 0, 0);\r
\r
- if (getVstCategory() != Vst2::kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call)\r
+ if (getVstCategory() != kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call)\r
updateStoredProgramNames();\r
\r
wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0;\r
usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul;\r
#endif\r
\r
- setLatencySamples (vstEffect->initialDelay);\r
+ setLatencySamples (vstEffect->latency);\r
}\r
\r
void* getPlatformSpecificData() override { return vstEffect; }\r
{\r
char buffer[512] = { 0 };\r
\r
- if (dispatch (Vst2::effGetProductString, 0, 0, buffer, 0) != 0)\r
+ if (dispatch (plugInOpcodeGetManufacturerProductName, 0, 0, buffer, 0) != 0)\r
{\r
String productName = String::createStringFromData (buffer, (int) sizeof (buffer));\r
\r
\r
int getUID() const\r
{\r
- int uid = vstEffect != nullptr ? vstEffect->uniqueID : 0;\r
+ int uid = vstEffect != nullptr ? vstEffect->plugInIdentifier : 0;\r
\r
if (uid == 0)\r
uid = vstModule->file.hashCode();\r
if (vstEffect == nullptr)\r
return 0.0;\r
\r
- if ((vstEffect->flags & Vst2::effFlagsNoSoundInStop) != 0)\r
- return 0.0;\r
-\r
- auto tailSize = dispatch (Vst2::effGetTailSize, 0, 0, 0, 0);\r
auto sampleRate = getSampleRate();\r
\r
- // remain backward compatible with old JUCE plug-ins: anything larger\r
- // than INT32_MAX is an invalid tail time but old JUCE 64-bit plug-ins\r
- // would return INT64_MAX for infinite tail time. So treat anything\r
- // equal or greater than INT32_MAX as infinite tail time.\r
- if (tailSize >= std::numeric_limits<int32>::max())\r
- return std::numeric_limits<double>::infinity();\r
-\r
- if (tailSize >= 0 && sampleRate > 0)\r
- return static_cast<double> (tailSize) / sampleRate;\r
+ if (sampleRate <= 0)\r
+ return 0.0;\r
\r
- return 0.0;\r
+ return dispatch (plugInOpcodeGetTailSize, 0, 0, 0, 0) / sampleRate;\r
}\r
\r
bool acceptsMidi() const override { return wantsMidiMessages; }\r
bool producesMidi() const override { return pluginCanDo ("sendVstMidiEvent") > 0; }\r
bool supportsMPE() const override { return pluginCanDo ("MPE") > 0; }\r
\r
- Vst2::VstPlugCategory getVstCategory() const noexcept { return (Vst2::VstPlugCategory) dispatch (Vst2::effGetPlugCategory, 0, 0, 0, 0); }\r
+ VstPlugInCategory getVstCategory() const noexcept { return (VstPlugInCategory) dispatch (plugInOpcodeGetPlugInCategory, 0, 0, 0, 0); }\r
\r
- int pluginCanDo (const char* text) const { return (int) dispatch (Vst2::effCanDo, 0, 0, (void*) text, 0); }\r
+ int pluginCanDo (const char* text) const { return (int) dispatch (plugInOpcodeCanPlugInDo, 0, 0, (void*) text, 0); }\r
\r
//==============================================================================\r
void prepareToPlay (double rate, int samplesPerBlockExpected) override\r
SpeakerMappings::VstSpeakerConfigurationHolder inArr (getChannelLayoutOfBus (true, 0));\r
SpeakerMappings::VstSpeakerConfigurationHolder outArr (getChannelLayoutOfBus (false, 0));\r
\r
- dispatch (Vst2::effSetSpeakerArrangement, 0, (pointer_sized_int) &inArr.get(), (void*) &outArr.get(), 0.0f);\r
+ dispatch (plugInOpcodeSetSpeakerConfiguration, 0, (pointer_sized_int) &inArr.get(), (void*) &outArr.get(), 0.0f);\r
}\r
\r
- vstHostTime.tempo = 120.0;\r
- vstHostTime.timeSigNumerator = 4;\r
- vstHostTime.timeSigDenominator = 4;\r
+ vstHostTime.tempoBPM = 120.0;\r
+ vstHostTime.timeSignatureNumerator = 4;\r
+ vstHostTime.timeSignatureDenominator = 4;\r
vstHostTime.sampleRate = rate;\r
- vstHostTime.samplePos = 0;\r
- vstHostTime.flags = Vst2::kVstNanosValid\r
- | Vst2::kVstAutomationWriting\r
- | Vst2::kVstAutomationReading;\r
+ vstHostTime.samplePosition = 0;\r
+ vstHostTime.flags = vstTimingInfoFlagNanosecondsValid\r
+ | vstTimingInfoFlagAutomationWriteModeActive\r
+ | vstTimingInfoFlagAutomationReadModeActive;\r
\r
initialise (rate, samplesPerBlockExpected);\r
\r
\r
incomingMidi.clear();\r
\r
- dispatch (Vst2::effSetSampleRate, 0, 0, 0, (float) rate);\r
- dispatch (Vst2::effSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0);\r
+ dispatch (plugInOpcodeSetSampleRate, 0, 0, 0, (float) rate);\r
+ dispatch (plugInOpcodeSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0);\r
\r
if (supportsDoublePrecisionProcessing())\r
{\r
- int32 vstPrecision = isUsingDoublePrecision() ? Vst2::kVstProcessPrecision64\r
- : Vst2::kVstProcessPrecision32;\r
+ int32 vstPrecision = isUsingDoublePrecision() ? vstProcessingSampleTypeDouble\r
+ : vstProcessingSampleTypeFloat;\r
\r
- dispatch (Vst2::effSetProcessPrecision, 0, (pointer_sized_int) vstPrecision, 0, 0);\r
+ dispatch (plugInOpcodeSetSampleFloatType, 0, (pointer_sized_int) vstPrecision, 0, 0);\r
}\r
\r
- auto maxChannels = jmax (1, jmax (vstEffect->numInputs, vstEffect->numOutputs));\r
+ auto maxChannels = jmax (1, jmax (vstEffect->numInputChannels, vstEffect->numOutputChannels));\r
\r
tmpBufferFloat .setSize (maxChannels, samplesPerBlockExpected);\r
tmpBufferDouble.setSize (maxChannels, samplesPerBlockExpected);\r
channelBufferFloat .calloc (static_cast<size_t> (maxChannels));\r
channelBufferDouble.calloc (static_cast<size_t> (maxChannels));\r
\r
- outOfPlaceBuffer.setSize (jmax (1, vstEffect->numOutputs), samplesPerBlockExpected);\r
+ outOfPlaceBuffer.setSize (jmax (1, vstEffect->numOutputChannels), samplesPerBlockExpected);\r
\r
if (! isPowerOn)\r
setPower (true);\r
}\r
}\r
\r
- dispatch (Vst2::effStartProcess, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeStartProcess, 0, 0, 0, 0);\r
\r
- setLatencySamples (vstEffect->initialDelay);\r
+ setLatencySamples (vstEffect->latency);\r
}\r
}\r
\r
{\r
if (initialised)\r
{\r
- dispatch (Vst2::effStopProcess, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeStopProcess, 0, 0, 0, 0);\r
setPower (false);\r
}\r
\r
//==============================================================================\r
bool supportsDoublePrecisionProcessing() const override\r
{\r
- return ((vstEffect->flags & Vst2::effFlagsCanReplacing) != 0\r
- && (vstEffect->flags & Vst2::effFlagsCanDoubleReplacing) != 0);\r
+ return ((vstEffect->flags & vstEffectFlagInplaceAudio) != 0\r
+ && (vstEffect->flags & vstEffectFlagInplaceDoubleAudio) != 0);\r
}\r
\r
AudioProcessorParameter* getBypassParameter() const override { return vstSupportsBypass ? bypassParam.get() : nullptr; }\r
if (numInputBuses > 1 || numOutputBuses > 1)\r
return (layouts == getBusesLayout());\r
\r
- return (layouts.getNumChannels (true, 0) <= vstEffect->numInputs\r
- && layouts.getNumChannels (false, 0) <= vstEffect->numOutputs);\r
+ return (layouts.getNumChannels (true, 0) <= vstEffect->numInputChannels\r
+ && layouts.getNumChannels (false, 0) <= vstEffect->numOutputChannels);\r
}\r
\r
//==============================================================================\r
#if JUCE_IOS || JUCE_ANDROID\r
bool hasEditor() const override { return false; }\r
#else\r
- bool hasEditor() const override { return vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsHasEditor) != 0; }\r
+ bool hasEditor() const override { return vstEffect != nullptr && (vstEffect->flags & vstEffectFlagHasEditor) != 0; }\r
#endif\r
\r
AudioProcessorEditor* createEditor() override;\r
{\r
if (isValidChannel (index, true))\r
{\r
- Vst2::VstPinProperties pinProps;\r
- if (dispatch (Vst2::effGetInputProperties, index, 0, &pinProps, 0.0f) != 0)\r
- return String (pinProps.label, sizeof (pinProps.label));\r
+ VstPinInfo pinProps;\r
+ if (dispatch (plugInOpcodeGetInputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+ return String (pinProps.text, sizeof (pinProps.text));\r
}\r
\r
return {};\r
if (! isValidChannel (index, true))\r
return false;\r
\r
- Vst2::VstPinProperties pinProps;\r
- if (dispatch (Vst2::effGetInputProperties, index, 0, &pinProps, 0.0f) != 0)\r
- return (pinProps.flags & Vst2::kVstPinIsStereo) != 0;\r
+ VstPinInfo pinProps;\r
+ if (dispatch (plugInOpcodeGetInputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+ return (pinProps.flags & vstPinInfoFlagIsStereo) != 0;\r
\r
return true;\r
}\r
{\r
if (isValidChannel (index, false))\r
{\r
- Vst2::VstPinProperties pinProps;\r
- if (dispatch (Vst2::effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0)\r
- return String (pinProps.label, sizeof (pinProps.label));\r
+ VstPinInfo pinProps;\r
+ if (dispatch (plugInOpcodeGetOutputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+ return String (pinProps.text, sizeof (pinProps.text));\r
}\r
\r
return {};\r
if (! isValidChannel (index, false))\r
return false;\r
\r
- Vst2::VstPinProperties pinProps;\r
- if (dispatch (Vst2::effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0)\r
- return (pinProps.flags & Vst2::kVstPinIsStereo) != 0;\r
+ VstPinInfo pinProps;\r
+ if (dispatch (plugInOpcodeGetOutputPinProperties, index, 0, &pinProps, 0.0f) != 0)\r
+ return (pinProps.flags & vstPinInfoFlagIsStereo) != 0;\r
\r
return true;\r
}\r
int getNumPrograms() override { return vstEffect != nullptr ? jmax (0, vstEffect->numPrograms) : 0; }\r
\r
// NB: some plugs return negative numbers from this function.\r
- int getCurrentProgram() override { return (int) dispatch (Vst2::effGetProgram, 0, 0, 0, 0); }\r
+ int getCurrentProgram() override { return (int) dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); }\r
\r
void setCurrentProgram (int newIndex) override\r
{\r
if (getNumPrograms() > 0 && newIndex != getCurrentProgram())\r
- dispatch (Vst2::effSetProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0);\r
+ dispatch (plugInOpcodeSetCurrentProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0);\r
}\r
\r
const String getProgramName (int index) override\r
{\r
char nm[264] = { 0 };\r
\r
- if (dispatch (Vst2::effGetProgramNameIndexed, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0)\r
+ if (dispatch (plugInOpcodeGetProgramName, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0)\r
return String::fromUTF8 (nm).trim();\r
}\r
}\r
if (index >= 0 && index == getCurrentProgram())\r
{\r
if (getNumPrograms() > 0 && newName != getCurrentProgramName())\r
- dispatch (Vst2::effSetProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f);\r
+ dispatch (plugInOpcodeSetCurrentProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f);\r
}\r
else\r
{\r
//==============================================================================\r
void timerCallback() override\r
{\r
- if (dispatch (Vst2::effIdle, 0, 0, 0, 0) == 0)\r
+ if (dispatch (plugInOpcodeIdle, 0, 0, 0, 0) == 0)\r
stopTimer();\r
}\r
\r
{\r
switch (opcode)\r
{\r
- case Vst2::audioMasterAutomate:\r
+ case hostOpcodeParameterChanged:\r
if (auto* param = getParameters()[index])\r
param->sendValueChangedMessageToListeners (opt);\r
else\r
\r
break;\r
\r
- case Vst2::audioMasterProcessEvents: handleMidiFromPlugin ((const Vst2::VstEvents*) ptr); break;\r
- case Vst2::audioMasterGetTime: return getVSTTime();\r
- case Vst2::audioMasterIdle: handleIdle(); break;\r
- case Vst2::audioMasterSizeWindow: setWindowSize (index, (int) value); return 1;\r
- case Vst2::audioMasterUpdateDisplay: triggerAsyncUpdate(); break;\r
- case Vst2::audioMasterIOChanged: setLatencySamples (vstEffect->initialDelay); break;\r
- case Vst2::audioMasterNeedIdle: startTimer (50); break;\r
+ case hostOpcodePreAudioProcessingEvents: handleMidiFromPlugin ((const VstEventBlock*) ptr); break;\r
+ case hostOpcodeGetTimingInfo: return getVSTTime();\r
+ case hostOpcodeIdle: handleIdle(); break;\r
+ case hostOpcodeWindowSize: setWindowSize (index, (int) value); return 1;\r
+ case hostOpcodeUpdateView: triggerAsyncUpdate(); break;\r
+ case hostOpcodeIOModified: setLatencySamples (vstEffect->latency); break;\r
+ case hostOpcodeNeedsIdle: startTimer (50); break;\r
\r
- case Vst2::audioMasterGetSampleRate: return (pointer_sized_int) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue);\r
- case Vst2::audioMasterGetBlockSize: return (pointer_sized_int) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue);\r
- case Vst2::audioMasterWantMidi: wantsMidiMessages = true; break;\r
- case Vst2::audioMasterGetDirectory: return getVstDirectory();\r
+ case hostOpcodeGetSampleRate: return (pointer_sized_int) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue);\r
+ case hostOpcodeGetBlockSize: return (pointer_sized_int) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue);\r
+ case hostOpcodePlugInWantsMidi: wantsMidiMessages = true; break;\r
+ case hostOpcodeGetDirectory: return getVstDirectory();\r
\r
- case Vst2::audioMasterTempoAt: return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getTempoAt ((int64) value) : 0);\r
- case Vst2::audioMasterGetAutomationState: return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getAutomationState() : 0);\r
+ case hostOpcodeTempoAt: return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getTempoAt ((int64) value) : 0);\r
+ case hostOpcodeGetAutomationState: return (pointer_sized_int) (extraFunctions != nullptr ? extraFunctions->getAutomationState() : 0);\r
\r
- case Vst2::audioMasterBeginEdit:\r
+ case hostOpcodeParameterChangeGestureBegin:\r
if (auto* param = getParameters()[index])\r
param->beginChangeGesture();\r
else\r
\r
break;\r
\r
- case Vst2::audioMasterEndEdit:\r
+ case hostOpcodeParameterChangeGestureEnd:\r
if (auto* param = getParameters()[index])\r
param->endChangeGesture();\r
else\r
\r
break;\r
\r
- case Vst2::audioMasterPinConnected: return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true)\r
- case Vst2::audioMasterGetCurrentProcessLevel: return isNonRealtime() ? 4 : 0;\r
+ case hostOpcodePinConnected: return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true)\r
+ case hostOpcodeGetCurrentAudioProcessingLevel: return isNonRealtime() ? 4 : 0;\r
\r
// none of these are handled (yet)...\r
- case Vst2::audioMasterSetTime:\r
- case Vst2::audioMasterGetParameterQuantization:\r
- case Vst2::audioMasterGetInputLatency:\r
- case Vst2::audioMasterGetOutputLatency:\r
- case Vst2::audioMasterGetPreviousPlug:\r
- case Vst2::audioMasterGetNextPlug:\r
- case Vst2::audioMasterWillReplaceOrAccumulate:\r
- case Vst2::audioMasterOfflineStart:\r
- case Vst2::audioMasterOfflineRead:\r
- case Vst2::audioMasterOfflineWrite:\r
- case Vst2::audioMasterOfflineGetCurrentPass:\r
- case Vst2::audioMasterOfflineGetCurrentMetaPass:\r
- case Vst2::audioMasterGetOutputSpeakerArrangement:\r
- case Vst2::audioMasterVendorSpecific:\r
- case Vst2::audioMasterSetIcon:\r
- case Vst2::audioMasterGetLanguage:\r
- case Vst2::audioMasterOpenWindow:\r
- case Vst2::audioMasterCloseWindow:\r
+ case hostOpcodeSetTime:\r
+ case hostOpcodeGetParameterInterval:\r
+ case hostOpcodeGetInputLatency:\r
+ case hostOpcodeGetOutputLatency:\r
+ case hostOpcodeGetPreviousPlugIn:\r
+ case hostOpcodeGetNextPlugIn:\r
+ case hostOpcodeWillReplace:\r
+ case hostOpcodeOfflineStart:\r
+ case hostOpcodeOfflineReadSource:\r
+ case hostOpcodeOfflineWrite:\r
+ case hostOpcodeOfflineGetCurrentPass:\r
+ case hostOpcodeOfflineGetCurrentMetaPass:\r
+ case hostOpcodeGetOutputSpeakerConfiguration:\r
+ case hostOpcodeManufacturerSpecific:\r
+ case hostOpcodeSetIcon:\r
+ case hostOpcodeGetLanguage:\r
+ case hostOpcodeOpenEditorWindow:\r
+ case hostOpcodeCloseEditorWindow:\r
break;\r
\r
default:\r
{\r
switch (opcode)\r
{\r
- case Vst2::audioMasterCanDo: return handleCanDo ((const char*) ptr);\r
- case Vst2::audioMasterVersion: return 2400;\r
- case Vst2::audioMasterCurrentId: return shellUIDToCreate;\r
- case Vst2::audioMasterGetNumAutomatableParameters: return 0;\r
- case Vst2::audioMasterGetAutomationState: return 1;\r
- case Vst2::audioMasterGetVendorVersion: return 0x0101;\r
+ case hostOpcodeCanHostDo: return handleCanDo ((const char*) ptr);\r
+ case hostOpcodeVstVersion: return 2400;\r
+ case hostOpcodeCurrentId: return shellUIDToCreate;\r
+ case hostOpcodeGetNumberOfAutomatableParameters: return 0;\r
+ case hostOpcodeGetAutomationState: return 1;\r
+ case hostOpcodeGetManufacturerVersion: return 0x0101;\r
\r
- case Vst2::audioMasterGetVendorString:\r
- case Vst2::audioMasterGetProductString: return getHostName ((char*) ptr);\r
+ case hostOpcodeGetManufacturerName:\r
+ case hostOpcodeGetProductName: return getHostName ((char*) ptr);\r
\r
- case Vst2::audioMasterGetSampleRate: return (pointer_sized_int) defaultVSTSampleRateValue;\r
- case Vst2::audioMasterGetBlockSize: return (pointer_sized_int) defaultVSTBlockSizeValue;\r
- case Vst2::audioMasterSetOutputSampleRate: return 0;\r
+ case hostOpcodeGetSampleRate: return (pointer_sized_int) defaultVSTSampleRateValue;\r
+ case hostOpcodeGetBlockSize: return (pointer_sized_int) defaultVSTBlockSizeValue;\r
+ case hostOpcodeSetOutputSampleRate: return 0;\r
\r
default:\r
DBG ("*** Unhandled VST Callback: " + String ((int) opcode));\r
UseResFile (vstModule->resFileId);\r
#endif\r
\r
- result = vstEffect->dispatcher (vstEffect, opcode, index, value, ptr, opt);\r
+ result = vstEffect->dispatchFunction (vstEffect, opcode, index, value, ptr, opt);\r
\r
#if JUCE_MAC\r
auto newResFile = CurResFile();\r
return true;\r
}\r
\r
- bool usesChunks() const noexcept { return vstEffect != nullptr && (vstEffect->flags & Vst2::effFlagsProgramChunks) != 0; }\r
+ bool usesChunks() const noexcept { return vstEffect != nullptr && (vstEffect->flags & vstEffectFlagDataInChunks) != 0; }\r
\r
bool getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const\r
{\r
if (usesChunks())\r
{\r
void* data = nullptr;\r
- auto bytes = (size_t) dispatch (Vst2::effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f);\r
+ auto bytes = (size_t) dispatch (plugInOpcodeGetData, isPreset ? 1 : 0, 0, &data, 0.0f);\r
\r
if (data != nullptr && bytes <= (size_t) maxSizeMB * 1024 * 1024)\r
{\r
{\r
if (size > 0 && usesChunks())\r
{\r
- dispatch (Vst2::effSetChunk, isPreset ? 1 : 0, size, (void*) data, 0.0f);\r
+ dispatch (plugInOpcodeSetData, isPreset ? 1 : 0, size, (void*) data, 0.0f);\r
\r
if (! isPreset)\r
updateStoredProgramNames();\r
return false;\r
}\r
\r
- Vst2::AEffect* vstEffect;\r
+ VstEffectInterface* vstEffect;\r
ModuleHandle::Ptr vstModule;\r
\r
std::unique_ptr<VSTPluginFormat::ExtraFunctions> extraFunctions;\r
currentValue = (newValue != 0.0f);\r
\r
if (parent.vstSupportsBypass)\r
- parent.dispatch (Vst2::effSetBypass, 0, currentValue ? 1 : 0, nullptr, 0.0f);\r
+ parent.dispatch (plugInOpcodeSetBypass, 0, currentValue ? 1 : 0, nullptr, 0.0f);\r
}\r
\r
float getValueForText (const String& text) const override\r
CriticalSection midiInLock;\r
MidiBuffer incomingMidi;\r
VSTMidiEventList midiEventsToSend;\r
- Vst2::VstTimeInfo vstHostTime;\r
+ VstTimingInformation vstHostTime;\r
\r
AudioBuffer<float> tmpBufferFloat;\r
HeapBlock<float*> channelBufferFloat;\r
if (auto* app = JUCEApplicationBase::getInstance())\r
hostName = app->getApplicationName();\r
\r
- hostName.copyToUTF8 (name, (size_t) jmin (Vst2::kVstMaxVendorStrLen, Vst2::kVstMaxProductStrLen) - 1);\r
+ hostName.copyToUTF8 (name, (size_t) jmin (vstMaxManufacturerStringLength, vstMaxPlugInNameStringLength) - 1);\r
return 1;\r
}\r
\r
\r
#if JUCE_MAC\r
if (getActiveEditor() != nullptr)\r
- dispatch (Vst2::effEditIdle, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeEditorIdle, 0, 0, 0, 0);\r
#endif\r
\r
Timer::callPendingTimersSynchronously();\r
#if JUCE_LINUX\r
const MessageManagerLock mmLock;\r
#endif\r
-\r
- #if ! JUCE_MAC\r
- if (auto* peer = ed->getTopLevelComponent()->getPeer())\r
- {\r
- auto scale = peer->getPlatformScaleFactor();\r
- ed->setSize (roundToInt (width / scale), roundToInt (height / scale));\r
-\r
- return;\r
- }\r
- #endif\r
-\r
ed->setSize (width, height);\r
}\r
}\r
\r
//==============================================================================\r
- static Vst2::AEffect* constructEffect (const ModuleHandle::Ptr& module)\r
+ static VstEffectInterface* constructEffect (const ModuleHandle::Ptr& module)\r
{\r
- Vst2::AEffect* effect = nullptr;\r
+ VstEffectInterface* effect = nullptr;\r
try\r
{\r
const IdleCallRecursionPreventer icrp;\r
JUCE_VST_WRAPPER_INVOKE_MAIN\r
}\r
\r
- if (effect != nullptr && effect->magic == 0x56737450 /* 'VstP' */)\r
+ if (effect != nullptr && effect->interfaceIdentifier == juceVstInterfaceIdentifier)\r
{\r
- jassert (effect->resvd2 == 0);\r
- jassert (effect->object != 0);\r
+ jassert (effect->hostSpace2 == 0);\r
+ jassert (effect->effectPointer != 0);\r
\r
_fpreset(); // some dodgy plugs mess around with this\r
}\r
return effect;\r
}\r
\r
- static BusesProperties queryBusIO (Vst2::AEffect* effect)\r
+ static BusesProperties queryBusIO (VstEffectInterface* effect)\r
{\r
BusesProperties returnValue;\r
\r
- if (effect->numInputs == 0 && effect->numOutputs == 0)\r
+ if (effect->numInputChannels == 0 && effect->numOutputChannels == 0)\r
return returnValue;\r
\r
// Workaround for old broken JUCE plug-ins which would return an invalid\r
// plug-in is reporting.\r
if (! pluginHasDefaultChannelLayouts (effect))\r
{\r
- SpeakerMappings::VstSpeakerConfigurationHolder canonicalIn (AudioChannelSet::canonicalChannelSet (effect->numInputs));\r
- SpeakerMappings::VstSpeakerConfigurationHolder canonicalOut (AudioChannelSet::canonicalChannelSet (effect->numOutputs));\r
+ SpeakerMappings::VstSpeakerConfigurationHolder canonicalIn (AudioChannelSet::canonicalChannelSet (effect->numInputChannels));\r
+ SpeakerMappings::VstSpeakerConfigurationHolder canonicalOut (AudioChannelSet::canonicalChannelSet (effect->numOutputChannels));\r
\r
- effect->dispatcher (effect, Vst2::effSetSpeakerArrangement, 0,\r
+ effect->dispatchFunction (effect, plugInOpcodeSetSpeakerConfiguration, 0,\r
(pointer_sized_int) &canonicalIn.get(), (void*) &canonicalOut.get(), 0.0f);\r
}\r
\r
- HeapBlock<Vst2::VstSpeakerArrangement> inArrBlock (1, true), outArrBlock (1, true);\r
+ HeapBlock<VstSpeakerConfiguration> inArrBlock (1, true), outArrBlock (1, true);\r
\r
auto* inArr = inArrBlock.get();\r
auto* outArr = outArrBlock.get();\r
for (int dir = 0; dir < 2; ++dir)\r
{\r
const bool isInput = (dir == 0);\r
- const int opcode = (isInput ? Vst2::effGetInputProperties : Vst2::effGetOutputProperties);\r
- const int maxChannels = (isInput ? effect->numInputs : effect->numOutputs);\r
- const Vst2::VstSpeakerArrangement* arr = (isInput ? inArr : outArr);\r
+ const int opcode = (isInput ? plugInOpcodeGetInputPinProperties : plugInOpcodeGetOutputPinProperties);\r
+ const int maxChannels = (isInput ? effect->numInputChannels : effect->numOutputChannels);\r
+ const VstSpeakerConfiguration* arr = (isInput ? inArr : outArr);\r
bool busAdded = false;\r
\r
- Vst2::VstPinProperties pinProps;\r
+ VstPinInfo pinProps;\r
AudioChannelSet layout;\r
\r
for (int ch = 0; ch < maxChannels; ch += layout.size())\r
{\r
- if (effect->dispatcher (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
+ if (effect->dispatchFunction (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
break;\r
\r
- if ((pinProps.flags & Vst2::kVstPinUseSpeaker) != 0)\r
+ if ((pinProps.flags & vstPinInfoFlagValid) != 0)\r
{\r
- layout = SpeakerMappings::vstArrangementTypeToChannelSet (pinProps.arrangementType, 0);\r
+ layout = SpeakerMappings::vstArrangementTypeToChannelSet (pinProps.configurationType, 0);\r
\r
if (layout.isDisabled())\r
break;\r
}\r
else if (arr == nullptr)\r
{\r
- layout = ((pinProps.flags & Vst2::kVstPinIsStereo) != 0 ? AudioChannelSet::stereo() : AudioChannelSet::mono());\r
+ layout = ((pinProps.flags & vstPinInfoFlagIsStereo) != 0 ? AudioChannelSet::stereo() : AudioChannelSet::mono());\r
}\r
else\r
break;\r
\r
busAdded = true;\r
- returnValue.addBus (isInput, pinProps.label, layout, true);\r
+ returnValue.addBus (isInput, pinProps.text, layout, true);\r
}\r
\r
// no buses?\r
{\r
String busName = (isInput ? "Input" : "Output");\r
\r
- if (effect->dispatcher (effect, opcode, 0, 0, &pinProps, 0.0f) != 0)\r
- busName = pinProps.label;\r
+ if (effect->dispatchFunction (effect, opcode, 0, 0, &pinProps, 0.0f) != 0)\r
+ busName = pinProps.text;\r
\r
if (arr != nullptr)\r
layout = SpeakerMappings::vstArrangementTypeToChannelSet (*arr);\r
return returnValue;\r
}\r
\r
- static bool pluginHasDefaultChannelLayouts (Vst2::AEffect* effect)\r
+ static bool pluginHasDefaultChannelLayouts (VstEffectInterface* effect)\r
{\r
- HeapBlock<Vst2::VstSpeakerArrangement> inArrBlock (1, true), outArrBlock (1, true);\r
+ HeapBlock<VstSpeakerConfiguration> inArrBlock (1, true), outArrBlock (1, true);\r
\r
auto* inArr = inArrBlock.get();\r
auto* outArr = outArrBlock.get();\r
for (int dir = 0; dir < 2; ++dir)\r
{\r
const bool isInput = (dir == 0);\r
- const int opcode = (isInput ? Vst2::effGetInputProperties : Vst2::effGetOutputProperties);\r
- const int maxChannels = (isInput ? effect->numInputs : effect->numOutputs);\r
+ const int opcode = (isInput ? plugInOpcodeGetInputPinProperties : plugInOpcodeGetOutputPinProperties);\r
+ const int maxChannels = (isInput ? effect->numInputChannels : effect->numOutputChannels);\r
\r
int channels = 1;\r
\r
for (int ch = 0; ch < maxChannels; ch += channels)\r
{\r
- Vst2::VstPinProperties pinProps;\r
+ VstPinInfo pinProps;\r
\r
- if (effect->dispatcher (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
+ if (effect->dispatchFunction (effect, opcode, ch, 0, &pinProps, 0.0f) == 0)\r
return false;\r
\r
- if ((pinProps.flags & Vst2::kVstPinUseSpeaker) != 0)\r
+ if ((pinProps.flags & vstPinInfoFlagValid) != 0)\r
return true;\r
\r
- channels = (pinProps.flags & Vst2::kVstPinIsStereo) != 0 ? 2 : 1;\r
+ channels = (pinProps.flags & vstPinInfoFlagIsStereo) != 0 ? 2 : 1;\r
}\r
}\r
\r
return false;\r
}\r
\r
- static bool getSpeakerArrangementWrapper (Vst2::AEffect* effect,\r
- Vst2::VstSpeakerArrangement* inArr,\r
- Vst2::VstSpeakerArrangement* outArr)\r
+ static bool getSpeakerArrangementWrapper (VstEffectInterface* effect,\r
+ VstSpeakerConfiguration* inArr,\r
+ VstSpeakerConfiguration* outArr)\r
{\r
// Workaround: unfortunately old JUCE VST-2 plug-ins had a bug and would crash if\r
// you try to get the speaker arrangement when there are no input channels present.\r
// Hopefully, one day (when there are no more old JUCE plug-ins around), we can\r
// commment out the next two lines.\r
- if (effect->numInputs == 0)\r
+ if (effect->numInputChannels == 0)\r
return false;\r
\r
- return (effect->dispatcher (effect, Vst2::effGetSpeakerArrangement, 0,\r
+ return (effect->dispatchFunction (effect, plugInOpcodeGetSpeakerArrangement, 0,\r
reinterpret_cast<pointer_sized_int> (&inArr), &outArr, 0.0f) != 0);\r
}\r
\r
if (currentPlayHead->getCurrentPosition (position))\r
{\r
\r
- vstHostTime.samplePos = (double) position.timeInSamples;\r
- vstHostTime.tempo = position.bpm;\r
- vstHostTime.timeSigNumerator = position.timeSigNumerator;\r
- vstHostTime.timeSigDenominator = position.timeSigDenominator;\r
- vstHostTime.ppqPos = position.ppqPosition;\r
- vstHostTime.barStartPos = position.ppqPositionOfLastBarStart;\r
- vstHostTime.flags |= Vst2::kVstTempoValid\r
- | Vst2::kVstTimeSigValid\r
- | Vst2::kVstPpqPosValid\r
- | Vst2::kVstBarsValid;\r
+ vstHostTime.samplePosition = (double) position.timeInSamples;\r
+ vstHostTime.tempoBPM = position.bpm;\r
+ vstHostTime.timeSignatureNumerator = position.timeSigNumerator;\r
+ vstHostTime.timeSignatureDenominator = position.timeSigDenominator;\r
+ vstHostTime.musicalPosition = position.ppqPosition;\r
+ vstHostTime.lastBarPosition = position.ppqPositionOfLastBarStart;\r
+ vstHostTime.flags |= vstTimingInfoFlagTempoValid\r
+ | vstTimingInfoFlagTimeSignatureValid\r
+ | vstTimingInfoFlagMusicalPositionValid\r
+ | vstTimingInfoFlagLastBarPositionValid;\r
\r
int32 newTransportFlags = 0;\r
- if (position.isPlaying) newTransportFlags |= Vst2::kVstTransportPlaying;\r
- if (position.isRecording) newTransportFlags |= Vst2::kVstTransportRecording;\r
+ if (position.isPlaying) newTransportFlags |= vstTimingInfoFlagCurrentlyPlaying;\r
+ if (position.isRecording) newTransportFlags |= vstTimingInfoFlagCurrentlyRecording;\r
\r
- if (newTransportFlags != (vstHostTime.flags & (Vst2::kVstTransportPlaying\r
- | Vst2::kVstTransportRecording)))\r
- vstHostTime.flags = (vstHostTime.flags & ~(Vst2::kVstTransportPlaying | Vst2::kVstTransportRecording)) | newTransportFlags | Vst2::kVstTransportChanged;\r
+ if (newTransportFlags != (vstHostTime.flags & (vstTimingInfoFlagCurrentlyPlaying\r
+ | vstTimingInfoFlagCurrentlyRecording)))\r
+ vstHostTime.flags = (vstHostTime.flags & ~(vstTimingInfoFlagCurrentlyPlaying | vstTimingInfoFlagCurrentlyRecording)) | newTransportFlags | vstTimingInfoFlagTransportChanged;\r
else\r
- vstHostTime.flags &= ~Vst2::kVstTransportChanged;\r
+ vstHostTime.flags &= ~vstTimingInfoFlagTransportChanged;\r
\r
switch (position.frameRate)\r
{\r
- case AudioPlayHead::fps24: setHostTimeFrameRate (Vst2::kVstSmpte24fps, 24.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps25: setHostTimeFrameRate (Vst2::kVstSmpte25fps, 25.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps30: setHostTimeFrameRate (Vst2::kVstSmpte30fps, 30.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps60: setHostTimeFrameRate (Vst2::kVstSmpte60fps, 60.0, position.timeInSeconds); break;\r
-\r
- case AudioPlayHead::fps23976: setHostTimeFrameRateDrop (Vst2::kVstSmpte239fps, 24.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps2997: setHostTimeFrameRateDrop (Vst2::kVstSmpte2997fps, 30.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (Vst2::kVstSmpte2997dfps, 30.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps30drop: setHostTimeFrameRateDrop (Vst2::kVstSmpte30dfps, 30.0, position.timeInSeconds); break;\r
- case AudioPlayHead::fps60drop: setHostTimeFrameRateDrop (Vst2::kVstSmpte599fps, 60.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps24: setHostTimeFrameRate (vstSmpteRateFps24, 24.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps25: setHostTimeFrameRate (vstSmpteRateFps25, 25.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps30: setHostTimeFrameRate (vstSmpteRateFps30, 30.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps60: setHostTimeFrameRate (vstSmpteRateFps60, 60.0, position.timeInSeconds); break;\r
+\r
+ case AudioPlayHead::fps23976: setHostTimeFrameRateDrop (vstSmpteRateFps239, 24.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps2997: setHostTimeFrameRateDrop (vstSmpteRateFps2997, 30.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (vstSmpteRateFps2997drop, 30.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps30drop: setHostTimeFrameRateDrop (vstSmpteRateFps30drop, 30.0, position.timeInSeconds); break;\r
+ case AudioPlayHead::fps60drop: setHostTimeFrameRateDrop (vstSmpteRateFps599, 60.0, position.timeInSeconds); break;\r
default: break;\r
}\r
\r
if (position.isLooping)\r
{\r
- vstHostTime.cycleStartPos = position.ppqLoopStart;\r
- vstHostTime.cycleEndPos = position.ppqLoopEnd;\r
- vstHostTime.flags |= (Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive);\r
+ vstHostTime.loopStartPosition = position.ppqLoopStart;\r
+ vstHostTime.loopEndPosition = position.ppqLoopEnd;\r
+ vstHostTime.flags |= (vstTimingInfoFlagLoopPositionValid | vstTimingInfoFlagLoopActive);\r
}\r
else\r
{\r
- vstHostTime.flags &= ~(Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive);\r
+ vstHostTime.flags &= ~(vstTimingInfoFlagLoopPositionValid | vstTimingInfoFlagLoopActive);\r
}\r
}\r
}\r
\r
- vstHostTime.nanoSeconds = getVSTHostTimeNanoseconds();\r
+ vstHostTime.systemTimeNanoseconds = getVSTHostTimeNanoseconds();\r
\r
if (wantsMidiMessages)\r
{\r
midiEventsToSend.addEvent (midiData, numBytesOfMidiData,\r
jlimit (0, numSamples - 1, samplePosition));\r
\r
- vstEffect->dispatcher (vstEffect, Vst2::effProcessEvents, 0, 0, midiEventsToSend.events, 0);\r
+ vstEffect->dispatchFunction (vstEffect, plugInOpcodePreAudioProcessingEvents, 0, 0, midiEventsToSend.events, 0);\r
}\r
\r
_clearfp();\r
\r
// always ensure that the buffer is at least as large as the maximum number of channels\r
- auto maxChannels = jmax (vstEffect->numInputs, vstEffect->numOutputs);\r
+ auto maxChannels = jmax (vstEffect->numInputChannels, vstEffect->numOutputChannels);\r
auto channels = channelBuffer.get();\r
\r
if (numChannels < maxChannels)\r
//==============================================================================\r
inline void invokeProcessFunction (AudioBuffer<float>& buffer, int32 sampleFrames)\r
{\r
- if ((vstEffect->flags & Vst2::effFlagsCanReplacing) != 0)\r
+ if ((vstEffect->flags & vstEffectFlagInplaceAudio) != 0)\r
{\r
- vstEffect->processReplacing (vstEffect, buffer.getArrayOfWritePointers(),\r
+ vstEffect->processAudioInplaceFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
buffer.getArrayOfWritePointers(), sampleFrames);\r
}\r
else\r
{\r
- outOfPlaceBuffer.setSize (vstEffect->numOutputs, sampleFrames);\r
+ outOfPlaceBuffer.setSize (vstEffect->numOutputChannels, sampleFrames);\r
outOfPlaceBuffer.clear();\r
\r
- vstEffect->process (vstEffect, buffer.getArrayOfWritePointers(),\r
+ vstEffect->processAudioFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
outOfPlaceBuffer.getArrayOfWritePointers(), sampleFrames);\r
\r
- for (int i = vstEffect->numOutputs; --i >= 0;)\r
+ for (int i = vstEffect->numOutputChannels; --i >= 0;)\r
buffer.copyFrom (i, 0, outOfPlaceBuffer.getReadPointer (i), sampleFrames);\r
}\r
}\r
\r
inline void invokeProcessFunction (AudioBuffer<double>& buffer, int32 sampleFrames)\r
{\r
- vstEffect->processDoubleReplacing (vstEffect, buffer.getArrayOfWritePointers(),\r
+ vstEffect->processDoubleAudioInplaceFunction (vstEffect, buffer.getArrayOfWritePointers(),\r
buffer.getArrayOfWritePointers(), sampleFrames);\r
}\r
\r
//==============================================================================\r
void setHostTimeFrameRate (long frameRateIndex, double frameRate, double currentTime) noexcept\r
{\r
- vstHostTime.flags |= Vst2::kVstSmpteValid;\r
- vstHostTime.smpteFrameRate = (int32) frameRateIndex;\r
+ vstHostTime.flags |= vstTimingInfoFlagSmpteValid;\r
+ vstHostTime.smpteRate = (int32) frameRateIndex;\r
vstHostTime.smpteOffset = (int32) (currentTime * 80.0 * frameRate + 0.5);\r
}\r
\r
return false;\r
}\r
\r
- String getTextForOpcode (const int index, const int opcode) const\r
+ String getTextForOpcode (const int index, const VstHostToPlugInOpcodes opcode) const\r
{\r
if (vstEffect == nullptr)\r
return {};\r
\r
- jassert (index >= 0 && index < vstEffect->numParams);\r
+ jassert (index >= 0 && index < vstEffect->numParameters);\r
char nm[256] = { 0 };\r
dispatch (opcode, index, 0, nm, 0);\r
return String::createStringFromData (nm, (int) sizeof (nm)).trim();\r
{\r
{\r
char nm[256] = { 0 };\r
- dispatch (Vst2::effGetProgramName, 0, 0, nm, 0);\r
+ dispatch (plugInOpcodeGetCurrentProgramName, 0, 0, nm, 0);\r
progName = String::createStringFromData (nm, (int) sizeof (nm)).trim();\r
}\r
\r
char nm[256] = { 0 };\r
\r
// only do this if the plugin can't use indexed names..\r
- if (dispatch (Vst2::effGetProgramNameIndexed, 0, -1, nm, 0) == 0)\r
+ if (dispatch (plugInOpcodeGetProgramName, 0, -1, nm, 0) == 0)\r
{\r
auto oldProgram = getCurrentProgram();\r
MemoryBlock oldSettings;\r
}\r
}\r
\r
- void handleMidiFromPlugin (const Vst2::VstEvents* events)\r
+ void handleMidiFromPlugin (const VstEventBlock* events)\r
{\r
if (events != nullptr)\r
{\r
}\r
\r
//==============================================================================\r
- int getVersionNumber() const noexcept { return vstEffect != nullptr ? vstEffect->version : 0; }\r
+ int getVersionNumber() const noexcept { return vstEffect != nullptr ? vstEffect->plugInVersion : 0; }\r
\r
String getVersion() const\r
{\r
- auto v = (unsigned int) dispatch (Vst2::effGetVendorVersion, 0, 0, 0, 0);\r
+ auto v = (unsigned int) dispatch (plugInOpcodeGetManufacturerVersion, 0, 0, 0, 0);\r
\r
String s;\r
\r
{\r
switch (getVstCategory())\r
{\r
- case Vst2::kPlugCategEffect: return "Effect";\r
- case Vst2::kPlugCategSynth: return "Synth";\r
- case Vst2::kPlugCategAnalysis: return "Analysis";\r
- case Vst2::kPlugCategMastering: return "Mastering";\r
- case Vst2::kPlugCategSpacializer: return "Spacial";\r
- case Vst2::kPlugCategRoomFx: return "Reverb";\r
- case Vst2::kPlugSurroundFx: return "Surround";\r
- case Vst2::kPlugCategRestoration: return "Restoration";\r
- case Vst2::kPlugCategGenerator: return "Tone generation";\r
+ case kPlugCategEffect: return "Effect";\r
+ case kPlugCategSynth: return "Synth";\r
+ case kPlugCategAnalysis: return "Analysis";\r
+ case kPlugCategMastering: return "Mastering";\r
+ case kPlugCategSpacializer: return "Spacial";\r
+ case kPlugCategRoomFx: return "Reverb";\r
+ case kPlugSurroundFx: return "Surround";\r
+ case kPlugCategRestoration: return "Restoration";\r
+ case kPlugCategGenerator: return "Tone generation";\r
default: break;\r
}\r
\r
\r
void setPower (const bool on)\r
{\r
- dispatch (Vst2::effMainsChanged, 0, on ? 1 : 0, 0, 0);\r
+ dispatch (plugInOpcodeResumeSuspend, 0, on ? 1 : 0, 0, 0);\r
isPowerOn = on;\r
}\r
\r
struct VSTPluginWindow : public AudioProcessorEditor,\r
#if ! JUCE_MAC\r
private ComponentMovementWatcher,\r
- private ComponentPeer::ScaleFactorListener,\r
#endif\r
private Timer\r
{\r
\r
activeVSTWindows.removeFirstMatchingValue (this);\r
plugin.editorBeingDeleted (this);\r
-\r
- #if ! JUCE_MAC\r
- for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
- if (auto* peer = ComponentPeer::getPeer (i))\r
- peer->removeScaleFactorListener (this);\r
- #endif\r
}\r
\r
//==============================================================================\r
- #if JUCE_MAC\r
- void paint (Graphics& g) override\r
- {\r
- g.fillAll (Colours::black);\r
- }\r
-\r
- void visibilityChanged() override\r
- {\r
- if (cocoaWrapper != nullptr)\r
- {\r
- if (isVisible())\r
- openPluginWindow ((NSView*)cocoaWrapper->getView());\r
- else\r
- closePluginWindow();\r
- }\r
- }\r
-\r
- void childBoundsChanged (Component*) override\r
- {\r
- if (cocoaWrapper != nullptr)\r
- {\r
- auto w = cocoaWrapper->getWidth();\r
- auto h = cocoaWrapper->getHeight();\r
-\r
- if (w != getWidth() || h != getHeight())\r
- setSize (w, h);\r
- }\r
- }\r
- #else\r
- void paint (Graphics& g) override\r
- {\r
- if (isOpen)\r
- {\r
- #if JUCE_LINUX\r
- if (pluginWindow != 0)\r
- {\r
- auto clip = g.getClipBounds();\r
-\r
- XClearArea (display, pluginWindow, clip.getX(), clip.getY(),\r
- static_cast<unsigned int> (clip.getWidth()), static_cast<unsigned int> (clip.getHeight()), True);\r
- }\r
- #endif\r
- }\r
- else\r
- {\r
- g.fillAll (Colours::black);\r
- }\r
- }\r
-\r
+ #if ! JUCE_MAC\r
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override\r
{\r
if (recursiveResize)\r
\r
if (topComp->getPeer() != nullptr)\r
{\r
- auto pos = (topComp->getLocalPoint (this, Point<int>()) * nativeScaleFactor).roundToInt();\r
+ auto pos = topComp->getLocalPoint (this, Point<int>());\r
\r
recursiveResize = true;\r
\r
#if JUCE_WINDOWS\r
if (pluginHWND != 0)\r
- MoveWindow (pluginHWND, pos.getX(), pos.getY(), roundToInt (getWidth() * nativeScaleFactor), roundToInt (getHeight() * nativeScaleFactor), TRUE);\r
+ MoveWindow (pluginHWND, pos.getX(), pos.getY(), getWidth(), getHeight(), TRUE);\r
#elif JUCE_LINUX\r
if (pluginWindow != 0)\r
{\r
XMoveResizeWindow (display, pluginWindow,\r
pos.getX(), pos.getY(),\r
- static_cast<unsigned int> (roundToInt (getWidth() * nativeScaleFactor)),\r
- static_cast<unsigned int> (roundToInt (getHeight() * nativeScaleFactor)));\r
+ (unsigned int) getWidth(),\r
+ (unsigned int) getHeight());\r
\r
XMapRaised (display, pluginWindow);\r
XFlush (display);\r
else if (! shouldAvoidDeletingWindow())\r
closePluginWindow();\r
\r
- if (auto* peer = getTopLevelComponent()->getPeer())\r
- setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor());\r
-\r
componentMovedOrResized (true, true);\r
}\r
\r
closePluginWindow();\r
openPluginWindow();\r
\r
- if (auto* peer = getTopLevelComponent()->getPeer())\r
- peer->addScaleFactorListener (this);\r
-\r
+ #if JUCE_LINUX\r
componentMovedOrResized (true, true);\r
+ #endif\r
}\r
+ #endif\r
\r
- void nativeScaleFactorChanged (double newScaleFactor) override\r
+ #if JUCE_MAC\r
+ void visibilityChanged() override\r
{\r
- setScaleFactorAndDispatchMessage (newScaleFactor);\r
-\r
- #if JUCE_WINDOWS\r
- Vst2::ERect* rect = nullptr;\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
- if (! isWindowSizeCorrectForPlugin (roundToInt ((rect->right - rect->left) / nativeScaleFactor),\r
- roundToInt ((rect->bottom - rect->top) / nativeScaleFactor)))\r
- return;\r
- #endif\r
-\r
- componentMovedOrResized (true, true);\r
+ if (cocoaWrapper != nullptr)\r
+ {\r
+ if (isVisible())\r
+ openPluginWindow ((NSView*) cocoaWrapper->getView());\r
+ else\r
+ closePluginWindow();\r
+ }\r
}\r
\r
- void setScaleFactorAndDispatchMessage (double newScaleFactor)\r
+ void childBoundsChanged (Component*) override\r
{\r
- if (approximatelyEqual ((float) newScaleFactor, nativeScaleFactor))\r
- return;\r
-\r
- nativeScaleFactor = (float) newScaleFactor;\r
+ if (cocoaWrapper != nullptr)\r
+ {\r
+ auto w = cocoaWrapper->getWidth();\r
+ auto h = cocoaWrapper->getHeight();\r
\r
- if (pluginRespondsToDPIChanges)\r
- dispatch (Vst2::effVendorSpecific,\r
- JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S'),\r
- JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's'),\r
- nullptr, nativeScaleFactor);\r
+ if (w != getWidth() || h != getHeight())\r
+ setSize (w, h);\r
+ }\r
}\r
#endif\r
\r
bool keyStateChanged (bool) override { return pluginWantsKeys; }\r
bool keyPressed (const juce::KeyPress&) override { return pluginWantsKeys; }\r
\r
+ //==============================================================================\r
+ #if JUCE_MAC\r
+ void paint (Graphics& g) override\r
+ {\r
+ g.fillAll (Colours::black);\r
+ }\r
+ #else\r
+ void paint (Graphics& g) override\r
+ {\r
+ if (isOpen)\r
+ {\r
+ #if JUCE_LINUX\r
+ if (pluginWindow != 0)\r
+ {\r
+ auto clip = g.getClipBounds();\r
+\r
+ XClearArea (display, pluginWindow,\r
+ clip.getX(), clip.getY(),\r
+ static_cast<unsigned int> (clip.getWidth()),\r
+ static_cast<unsigned int> (clip.getHeight()),\r
+ True);\r
+ }\r
+ #endif\r
+ }\r
+ else\r
+ {\r
+ g.fillAll (Colours::black);\r
+ }\r
+ }\r
+ #endif\r
+\r
//==============================================================================\r
void timerCallback() override\r
{\r
if (! reentrantGuard)\r
{\r
reentrantGuard = true;\r
- plugin.dispatch (Vst2::effEditIdle, 0, 0, 0, 0);\r
+ plugin.dispatch (plugInOpcodeEditorIdle, 0, 0, 0, 0);\r
reentrantGuard = false;\r
}\r
\r
activeVSTWindows.add (this);\r
\r
#if JUCE_MAC\r
- dispatch (Vst2::effEditTop, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeeffEditorTop, 0, 0, 0, 0);\r
#endif\r
}\r
\r
+ void setScaleFactor (float newScale) override\r
+ {\r
+ scaleFactor = newScale;\r
+ dispatch (plugInOpcodeManufacturerSpecific, presonusVendorID,\r
+ presonusSetContentScaleFactor, nullptr, newScale);\r
+ }\r
+\r
+ void sendScaleFactorIfNotUnity()\r
+ {\r
+ if (scaleFactor != 1.0f)\r
+ setScaleFactor (scaleFactor);\r
+ }\r
+\r
+ //==============================================================================\r
private:\r
VSTPluginInstance& plugin;\r
+ float scaleFactor = 1.0f;\r
bool isOpen = false, recursiveResize = false;\r
bool pluginWantsKeys = false, pluginRefusesToResize = false, alreadyInside = false;\r
\r
- #if ! JUCE_MAC\r
- bool pluginRespondsToDPIChanges = false;\r
- #endif\r
-\r
- #if ! JUCE_MAC\r
- float nativeScaleFactor = 1.0f;\r
- #if JUCE_WINDOWS\r
- HWND pluginHWND = {};\r
- void* originalWndProc = {};\r
- int sizeCheckCount = 0;\r
- #elif JUCE_LINUX\r
- ::Display* display;\r
- Window pluginWindow;\r
- #endif\r
+ #if JUCE_WINDOWS\r
+ HWND pluginHWND = {};\r
+ void* originalWndProc = {};\r
+ int sizeCheckCount = 0;\r
+ #elif JUCE_LINUX\r
+ ::Display* display;\r
+ Window pluginWindow;\r
#endif\r
\r
// This is a workaround for old Mackie plugins that crash if their\r
}\r
\r
//==============================================================================\r
- #if JUCE_MAC\r
+#if JUCE_MAC\r
void openPluginWindow (void* parentWindow)\r
{\r
if (isOpen || parentWindow == 0)\r
\r
isOpen = true;\r
\r
- Vst2::ERect* rect = nullptr;\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
- dispatch (Vst2::effEditOpen, 0, 0, parentWindow, 0);\r
+ VstEditorBounds* rect = nullptr;\r
+ dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+ dispatch (plugInOpcodeOpenEditor, 0, 0, parentWindow, 0);\r
+ sendScaleFactorIfNotUnity();\r
\r
// do this before and after like in the steinberg example\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
- dispatch (Vst2::effGetProgram, 0, 0, 0, 0); // also in steinberg code\r
+ dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+ dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); // also in steinberg code\r
\r
// Install keyboard hooks\r
- pluginWantsKeys = (dispatch (Vst2::effKeysRequired, 0, 0, 0, 0) == 0);\r
+ pluginWantsKeys = (dispatch (plugInOpcodeKeyboardFocusRequired, 0, 0, 0, 0) == 0);\r
\r
// double-check it's not too tiny\r
int w = 250, h = 150;\r
\r
if (rect != nullptr)\r
{\r
- w = rect->right - rect->left;\r
- h = rect->bottom - rect->top;\r
+ w = rect->rightmost - rect->leftmost;\r
+ h = rect->lower - rect->upper;\r
\r
if (w == 0 || h == 0)\r
{\r
startTimer (18 + juce::Random::getSystemRandom().nextInt (5));\r
repaint();\r
}\r
- #else\r
+\r
+#else\r
void openPluginWindow()\r
{\r
if (isOpen || getWindowHandle() == 0)\r
JUCE_VST_LOG ("Opening VST UI: " + plugin.getName());\r
isOpen = true;\r
\r
- pluginRespondsToDPIChanges = plugin.pluginCanDo ("supportsViewDpiScaling") > 0;\r
-\r
- if (pluginRespondsToDPIChanges)\r
- if (auto* peer = getTopLevelComponent()->getPeer())\r
- setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor());\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- std::unique_ptr<ScopedDPIAwarenessDisabler> dpiDisabler;\r
-\r
- if (! pluginRespondsToDPIChanges)\r
- dpiDisabler.reset (new ScopedDPIAwarenessDisabler());\r
- #endif\r
-\r
- Vst2::ERect* rect = nullptr;\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- // some plug-ins are fussy about this\r
- dpiDisabler.reset (nullptr);\r
- #endif\r
-\r
- dispatch (Vst2::effEditOpen, 0, 0, getWindowHandle(), 0);\r
-\r
- #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! pluginRespondsToDPIChanges)\r
- dpiDisabler.reset (new ScopedDPIAwarenessDisabler());\r
- #endif\r
+ VstEditorBounds* rect = nullptr;\r
+ dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+ dispatch (plugInOpcodeOpenEditor, 0, 0, getWindowHandle(), 0);\r
+ sendScaleFactorIfNotUnity();\r
\r
// do this before and after like in the steinberg example\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
- dispatch (Vst2::effGetProgram, 0, 0, 0, 0); // also in steinberg code\r
+ dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+ dispatch (plugInOpcodeGetCurrentProgram, 0, 0, 0, 0); // also in steinberg code\r
\r
// Install keyboard hooks\r
- pluginWantsKeys = (dispatch (Vst2::effKeysRequired, 0, 0, 0, 0) == 0);\r
+ pluginWantsKeys = (dispatch (plugInOpcodeKeyboardFocusRequired, 0, 0, 0, 0) == 0);\r
\r
#if JUCE_WINDOWS\r
originalWndProc = 0;\r
\r
#pragma warning (pop)\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- dpiDisabler.reset (nullptr);\r
- #endif\r
-\r
RECT r;\r
GetWindowRect (pluginHWND, &r);\r
- auto w = (int) (r.right - r.left);\r
- auto h = (int) (r.bottom - r.top);\r
+ int w = r.right - r.left;\r
+ int h = r.bottom - r.top;\r
\r
if (rect != nullptr)\r
{\r
- auto rw = rect->right - rect->left;\r
- auto rh = rect->bottom - rect->top;\r
+ const int rw = rect->rightmost - rect->leftmost;\r
+ const int rh = rect->lower - rect->upper;\r
\r
- if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && (! isWithin (w, rw, 2) || ! isWithin (h, rh, 2)))\r
+ if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && rw != w && rh != h)\r
|| ((w == 0 && rw > 0) || (h == 0 && rh > 0)))\r
{\r
// very dodgy logic to decide which size is right.\r
if (std::abs (rw - w) > 350 || std::abs (rh - h) > 350)\r
{\r
SetWindowPos (pluginHWND, 0,\r
- 0, 0, roundToInt (rw * nativeScaleFactor), roundToInt (rh * nativeScaleFactor),\r
+ 0, 0, rw, rh,\r
SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);\r
\r
GetWindowRect (pluginHWND, &r);\r
}\r
}\r
}\r
+\r
#elif JUCE_LINUX\r
updatePluginWindowHandle();\r
\r
\r
if (rect != nullptr)\r
{\r
- w = rect->right - rect->left;\r
- h = rect->bottom - rect->top;\r
+ w = rect->rightmost - rect->leftmost;\r
+ h = rect->lower - rect->upper;\r
\r
if (w == 0 || h == 0)\r
{\r
XMapRaised (display, pluginWindow);\r
#endif\r
\r
- w = roundToInt (w / nativeScaleFactor);\r
- h = roundToInt (h / nativeScaleFactor);\r
-\r
// double-check it's not too tiny\r
w = jmax (w, 32);\r
h = jmax (h, 32);\r
startTimer (18 + juce::Random::getSystemRandom().nextInt (5));\r
repaint();\r
}\r
- #endif\r
+#endif\r
\r
//==============================================================================\r
void closePluginWindow()\r
{\r
// You shouldn't end up hitting this assertion unless the host is trying to do GUI\r
// cleanup on a non-GUI thread.. If it does that, bad things could happen in here..\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
JUCE_VST_LOG ("Closing VST UI: " + plugin.getName());\r
isOpen = false;\r
- dispatch (Vst2::effEditClose, 0, 0, 0, 0);\r
+ dispatch (plugInOpcodeCloseEditor, 0, 0, 0, 0);\r
stopTimer();\r
\r
#if JUCE_WINDOWS\r
\r
//==============================================================================\r
#if JUCE_WINDOWS\r
- bool willCauseRecursiveResize (int w, int h)\r
- {\r
- auto newScreenBounds = Rectangle<int> (w, h).withPosition (getScreenPosition());\r
-\r
- return Desktop::getInstance().getDisplays().findDisplayForRect (newScreenBounds).scale != nativeScaleFactor;\r
- }\r
-\r
- bool isWindowSizeCorrectForPlugin (int w, int h)\r
- {\r
- if (! isShowing() || pluginRefusesToResize)\r
- return true;\r
-\r
- return (isWithin (w, getWidth(), 5) && isWithin (h, getHeight(), 5));\r
- }\r
-\r
void checkPluginWindowSize()\r
{\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! pluginRespondsToDPIChanges)\r
- {\r
- Vst2::ERect* rect = nullptr;\r
- dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
-\r
- auto w = roundToInt ((rect->right - rect->left) / nativeScaleFactor);\r
- auto h = roundToInt ((rect->bottom - rect->top) / nativeScaleFactor);\r
-\r
- if (! isWindowSizeCorrectForPlugin (w, h))\r
- {\r
- // If plug-in isn't DPI aware then we need to resize our window, but this may cause a recursive resize\r
- // so add a check\r
- if (! willCauseRecursiveResize (w, h))\r
- setSize (w, h);\r
+ RECT r;\r
+ GetWindowRect (pluginHWND, &r);\r
+ auto w = r.right - r.left;\r
+ auto h = r.bottom - r.top;\r
\r
- sizeCheckCount = 0;\r
- }\r
- }\r
- #else\r
+ if (isShowing() && w > 0 && h > 0\r
+ && (w != getWidth() || h != getHeight())\r
+ && ! pluginRefusesToResize)\r
{\r
- RECT r;\r
- GetWindowRect (pluginHWND, &r);\r
-\r
- auto w = r.right - r.left;\r
- auto h = r.bottom - r.top;\r
-\r
- if (isShowing() && w > 0 && h > 0\r
- && (w != getWidth() || h != getHeight())\r
- && !pluginRefusesToResize)\r
- {\r
- setSize (w, h);\r
- sizeCheckCount = 0;\r
- }\r
+ setSize (w, h);\r
+ sizeCheckCount = 0;\r
}\r
- #endif\r
}\r
\r
// hooks to get keyboard events from VST windows..\r
#endif\r
\r
//==============================================================================\r
- #if JUCE_MAC\r
+#if JUCE_MAC\r
#if JUCE_SUPPORT_CARBON\r
struct CarbonWrapperComponent : public CarbonViewWrapperComponent\r
{\r
if (owner.isOpen)\r
{\r
owner.isOpen = false;\r
- owner.dispatch (Vst2::effEditClose, 0, 0, 0, 0);\r
- owner.dispatch (Vst2::effEditSleep, 0, 0, 0, 0);\r
+ owner.dispatch (plugInOpcodeCloseEditor, 0, 0, 0, 0);\r
+ owner.dispatch (plugInOpcodeSleepEditor, 0, 0, 0, 0);\r
}\r
}\r
\r
bool getEmbeddedViewSize (int& w, int& h) override\r
{\r
- Vst2::ERect* rect = nullptr;\r
- owner.dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0);\r
- w = rect->right - rect->left;\r
- h = rect->bottom - rect->top;\r
+ VstEditorBounds* rect = nullptr;\r
+ owner.dispatch (plugInOpcodeGetEditorBounds, 0, 0, &rect, 0);\r
+ w = rect->rightmost - rect->leftmost;\r
+ h = rect->lower - rect->upper;\r
return true;\r
}\r
\r
{\r
alreadyInside = true;\r
getTopLevelComponent()->toFront (true);\r
- owner.dispatch (Vst2::effEditMouse, x, y, 0, 0);\r
+ owner.dispatch (plugInOpcodeGetMouse, x, y, 0, 0);\r
alreadyInside = false;\r
}\r
else\r
if (auto* peer = getPeer())\r
{\r
auto pos = peer->globalToLocal (getScreenPosition());\r
- Vst2::ERect r;\r
- r.left = (int16) pos.getX();\r
- r.top = (int16) pos.getY();\r
- r.right = (int16) (r.left + getWidth());\r
- r.bottom = (int16) (r.top + getHeight());\r
+ VstEditorBounds r;\r
+ r.leftmost = (int16) pos.getX();\r
+ r.upper = (int16) pos.getY();\r
+ r.rightmost = (int16) (r.leftmost + getWidth());\r
+ r.lower = (int16) (r.upper + getHeight());\r
\r
- owner.dispatch (Vst2::effEditDraw, 0, 0, &r, 0);\r
+ owner.dispatch (plugInOpcodeDrawEditor, 0, 0, &r, 0);\r
}\r
}\r
\r
if (cocoaWrapper != nullptr)\r
cocoaWrapper->setSize (getWidth(), getHeight());\r
}\r
- #endif\r
+#endif\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow)\r
};\r
\r
//==============================================================================\r
// entry point for all callbacks from the plugin\r
-static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
+static pointer_sized_int VSTINTERFACECALL audioMaster (VstEffectInterface* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt)\r
{\r
if (effect != nullptr)\r
- if (auto* instance = (VSTPluginInstance*) (effect->resvd2))\r
+ if (auto* instance = (VSTPluginInstance*) (effect->hostSpace2))\r
return instance->handleCallback (opcode, index, value, ptr, opt);\r
\r
return VSTPluginInstance::handleGeneralCallback (opcode, index, value, ptr, opt);\r
if (instance == nullptr)\r
return;\r
\r
- if (instance->getVstCategory() != Vst2::kPlugCategShell)\r
+ if (instance->getVstCategory() != kPlugCategShell)\r
{\r
// Normal plugin...\r
results.add (new PluginDescription (desc));\r
\r
- instance->dispatch (Vst2::effOpen, 0, 0, 0, 0);\r
+ instance->dispatch (plugInOpcodeOpen, 0, 0, 0, 0);\r
}\r
else\r
{\r
for (;;)\r
{\r
char shellEffectName [256] = { 0 };\r
- auto uid = (int) instance->dispatch (Vst2::effShellGetNextPlugin, 0, 0, shellEffectName, 0);\r
+ auto uid = (int) instance->dispatch (plugInOpcodeNextPlugInUniqueID, 0, 0, shellEffectName, 0);\r
\r
if (uid == 0)\r
break;\r
}\r
\r
void VSTPluginFormat::createPluginInstance (const PluginDescription& desc,\r
- double sampleRate, int blockSize,\r
- void* userData, PluginCreationCallback callback)\r
+ double sampleRate,\r
+ int blockSize,\r
+ void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&))\r
{\r
std::unique_ptr<VSTPluginInstance> result;\r
\r
\r
AudioPluginInstance* VSTPluginFormat::getPluginInstanceFromVstEffectInterface (void* aEffect)\r
{\r
- if (auto* vstAEffect = reinterpret_cast<Vst2::AEffect*> (aEffect))\r
- if (auto* instanceVST = reinterpret_cast<VSTPluginInstance*> (vstAEffect->resvd2))\r
+ if (auto* vstAEffect = reinterpret_cast<VstEffectInterface*> (aEffect))\r
+ if (auto* instanceVST = reinterpret_cast<VSTPluginInstance*> (vstAEffect->hostSpace2))\r
return dynamic_cast<AudioPluginInstance*> (instanceVST);\r
\r
return nullptr;\r
private:\r
//==============================================================================\r
void createPluginInstance (const PluginDescription&, double initialSampleRate,\r
- int initialBufferSize, void* userData, PluginCreationCallback) override;\r
+ int initialBufferSize, void* userData,\r
+ void (*callback) (void*, AudioPluginInstance*, const String&)) override;\r
\r
bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const noexcept override;\r
\r
\r
#if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS)\r
#include <AudioUnit/AudioUnit.h>\r
- #include <map>\r
#endif\r
\r
//==============================================================================\r
struct AutoResizingNSViewComponent : public ViewComponentBaseClass,\r
private AsyncUpdater\r
{\r
+ AutoResizingNSViewComponent() : recursive (false) {}\r
+\r
void childBoundsChanged (Component*) override\r
{\r
if (recursive)\r
{\r
recursive = true;\r
resizeToFitView();\r
- recursive = false;\r
+ recursive = true;\r
}\r
}\r
\r
- void handleAsyncUpdate() override { resizeToFitView(); }\r
+ void handleAsyncUpdate() override { resizeToFitView(); }\r
\r
- bool recursive = false;\r
+ bool recursive;\r
};\r
\r
//==============================================================================\r
#include "scanning/juce_PluginDirectoryScanner.cpp"\r
#include "scanning/juce_PluginListComponent.cpp"\r
#include "utilities/juce_AudioProcessorParameters.cpp"\r
-#include "processors/juce_AudioProcessorParameterGroup.cpp"\r
#include "utilities/juce_AudioProcessorValueTreeState.cpp"\r
\r
ID: juce_audio_processors\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE audio processor classes\r
description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
website: http://www.juce.com/juce\r
\r
//==============================================================================\r
/** Config: JUCE_PLUGINHOST_VST\r
- Enables the VST audio plugin hosting classes. You will need to have the VST2 SDK files in your header search paths. You can obtain the VST2 SDK files from on older version of the VST3 SDK.\r
+ Enables the VST audio plugin hosting classes.\r
\r
@see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3, JUCE_PLUGINHOST_LADSPA\r
*/\r
#endif\r
\r
/** Config: JUCE_PLUGINHOST_VST3\r
- Enables the VST3 audio plugin hosting classes.\r
+ Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be\r
+ installed on your machine.\r
\r
@see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_LADSPA\r
*/\r
#include "processors/juce_AudioProcessorEditor.h"\r
#include "processors/juce_AudioProcessorListener.h"\r
#include "processors/juce_AudioProcessorParameter.h"\r
-#include "processors/juce_AudioProcessorParameterGroup.h"\r
#include "processors/juce_AudioProcessor.h"\r
#include "processors/juce_PluginDescription.h"\r
#include "processors/juce_AudioPluginInstance.h"\r
#include "scanning/juce_PluginDirectoryScanner.h"\r
#include "scanning/juce_PluginListComponent.h"\r
#include "utilities/juce_AudioProcessorParameterWithID.h"\r
-#include "utilities/juce_RangedAudioParameter.h"\r
#include "utilities/juce_AudioParameterFloat.h"\r
#include "utilities/juce_AudioParameterInt.h"\r
#include "utilities/juce_AudioParameterBool.h"\r
// Currently there is no corresponding method available in the\r
// AudioProcessorParameter class, and the previous behaviour of JUCE's\r
// plug-in hosting code simply returns a string version of the index; to\r
- // maintain backwards compatibility you should perform the operation below\r
+ // maintain backwards compatibilty you should perform the operation below\r
// this comment. However the caveat is that for plug-ins which change their\r
// number of parameters dynamically at runtime you cannot rely upon the\r
// returned parameter ID mapping to the correct parameter. A comprehensive\r
if (auto* param = getParameters()[parameterIndex])\r
return param->isMetaParameter();\r
\r
- return false;\r
+ return false;\r
}\r
\r
AudioProcessorParameter::Category AudioPluginInstance::getParameterCategory (int parameterIndex) const\r
// or more parameters without having made a corresponding call to endParameterChangeGesture...\r
jassert (changingParams.countNumberOfSetBits() == 0);\r
#endif\r
-\r
- // The parameters are owned by an AudioProcessorParameterGroup, but we need\r
- // to keep the managedParameters array populated to maintain backwards\r
- // compatibility.\r
- managedParameters.clearQuick (false);\r
}\r
\r
//==============================================================================\r
return p;\r
}\r
\r
-void AudioProcessor::addParameterInternal (AudioProcessorParameter* param)\r
+void AudioProcessor::addParameter (AudioProcessorParameter* p)\r
{\r
- param->processor = this;\r
- param->parameterIndex = managedParameters.size();\r
- managedParameters.add (param);\r
+ p->processor = this;\r
+ p->parameterIndex = managedParameters.size();\r
+ managedParameters.add (p);\r
\r
#ifdef JUCE_DEBUG\r
shouldCheckParamsForDupeIDs = true;\r
#endif\r
}\r
\r
-void AudioProcessor::addParameter (AudioProcessorParameter* param)\r
-{\r
- addParameterInternal (param);\r
- parameterTree.addChild (std::unique_ptr<AudioProcessorParameter> (param));\r
-}\r
-\r
-void AudioProcessor::addParameterGroup (std::unique_ptr<AudioProcessorParameterGroup> group)\r
-{\r
- for (auto* param : group->getParameters (true))\r
- addParameterInternal (param);\r
-\r
- parameterTree.addChild (std::move (group));\r
-}\r
-\r
-const AudioProcessorParameterGroup& AudioProcessor::getParameterTree()\r
-{\r
- return parameterTree;\r
-}\r
-\r
#ifdef JUCE_DEBUG\r
void AudioProcessor::checkForDupedParamIDs()\r
{\r
return (idForAudioSuite ? 0x6a796161 /* 'jyaa' */ : 0x6a636161 /* 'jcaa' */) + uniqueFormatId;\r
}\r
\r
-//==============================================================================\r
-const char* AudioProcessor::getWrapperTypeDescription (AudioProcessor::WrapperType type) noexcept\r
-{\r
- switch (type)\r
- {\r
- case AudioProcessor::wrapperType_Undefined: return "Undefined";\r
- case AudioProcessor::wrapperType_VST: return "VST";\r
- case AudioProcessor::wrapperType_VST3: return "VST3";\r
- case AudioProcessor::wrapperType_AudioUnit: return "AU";\r
- case AudioProcessor::wrapperType_AudioUnitv3: return "AUv3";\r
- case AudioProcessor::wrapperType_RTAS: return "RTAS";\r
- case AudioProcessor::wrapperType_AAX: return "AAX";\r
- case AudioProcessor::wrapperType_Standalone: return "Standalone";\r
- default: jassertfalse; return {};\r
- }\r
-}\r
-\r
//==============================================================================\r
void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}\r
void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {}\r
@param currentLayout If non-null, pretend that the current layout of the AudioProcessor is\r
currentLayout. On exit, currentLayout will be modified to\r
to represent the buses layouts of the AudioProcessor as if the layout\r
- of the receiver had been successfully changed. This is useful as changing\r
- the layout of the receiver may change the bus layout of other buses.\r
+ of the reciever had been succesfully changed. This is useful as changing\r
+ the layout of the reciever may change the bus layout of other buses.\r
\r
@see AudioChannelSet\r
*/\r
/** Returns the parameter that controls the AudioProcessor's bypass state.\r
\r
If this method returns a nullptr then you can still control the bypass by\r
- calling processBlockBypassed instead of processBlock. On the other hand,\r
+ calling processBlockBypassed instaed of processBlock. On the other hand,\r
if this method returns a non-null value, you should never call\r
processBlockBypassed but use the returned parameter to conrol the bypass\r
state instead.\r
void updateHostDisplay();\r
\r
//==============================================================================\r
- /** Adds a parameter to the AudioProcessor.\r
-\r
- The parameter object will be managed and deleted automatically by the\r
- AudioProcessor when no longer needed.\r
+ /** Adds a parameter to the list.\r
+ The parameter object will be managed and deleted automatically by the list\r
+ when no longer needed.\r
*/\r
void addParameter (AudioProcessorParameter*);\r
\r
- /** Adds a group of parameters to the AudioProcessor.\r
-\r
- All the parameter objects contained within the group will be managed and\r
- deleted automatically by the AudioProcessor when no longer needed.\r
-\r
- @see addParameter\r
- */\r
- void addParameterGroup (std::unique_ptr<AudioProcessorParameterGroup>);\r
-\r
- /** Returns the group of parameters managed by this AudioProcessor. */\r
- const AudioProcessorParameterGroup& getParameterTree();\r
-\r
/** Returns the current list of parameters. */\r
const OwnedArray<AudioProcessorParameter>& getParameters() const noexcept;\r
\r
const AudioChannelSet& mainOutputLayout,\r
bool idForAudioSuite) const;\r
\r
- //==============================================================================\r
- /** Some plug-ins support sharing response curve data with the host so that it can\r
- display this curve on a console or in the mixer panel. For example, ProTools\r
- allows you to see the total EQ curve of a track. It does this by interrogating\r
- each plug-in for their internal EQ curve. */\r
- struct CurveData\r
- {\r
- enum class Type : int\r
- {\r
- EQ, // an EQ curve - input is in Hz, output is in dB\r
- Dynamics, // a dynamics curve - input and output is in dB\r
- GainReduction, // a gain reduction curve - input and output is in dB\r
-\r
- Unknown = -1\r
- };\r
-\r
- std::function<float (float)> curve; // a function which represents your curve (such as an eq)\r
- Range<float> xRange, yRange; // the data range of your curve\r
-\r
- // For some curve types, your plug-in may already measure the current input and output values.\r
- // An host can use to indicate where on the curve the current signal is (for example\r
- // by putting a dot on the curve). Simply leave these strings empty if you do not want to\r
- // support this.\r
- String xMeterID, yMeterID;\r
- };\r
-\r
- virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const { return {}; }\r
-\r
//==============================================================================\r
/** Not for public use - this is called before deleting an editor component. */\r
void editorBeingDeleted (AudioProcessorEditor*) noexcept;\r
wrapperType_AudioUnitv3,\r
wrapperType_RTAS,\r
wrapperType_AAX,\r
- wrapperType_Standalone,\r
- wrapperType_Unity\r
+ wrapperType_Standalone\r
};\r
\r
/** When loaded by a plugin wrapper, this flag will be set to indicate the type\r
*/\r
WrapperType wrapperType;\r
\r
- /** Returns a textual description of a WrapperType value */\r
- static const char* getWrapperTypeDescription (AudioProcessor::WrapperType) noexcept;\r
-\r
-\r
/** A struct containing information about the DAW track inside which your\r
AudioProcessor is loaded. */\r
struct TrackProperties\r
\r
When adding a bus, isAddingBuses will be true and the plug-in is\r
expected to fill out outNewBusProperties with the properties of the\r
- bus which will be created just after the successful return of this callback.\r
+ bus which will be created just after the succesful return of this callback.\r
\r
Implementations of AudioProcessor will rarely need to override this\r
method. Only override this method if your processor supports adding\r
void sendParamChangeMessageToListeners (int parameterIndex, float newValue);\r
\r
private:\r
- //==============================================================================\r
- void addParameterInternal (AudioProcessorParameter*);\r
-\r
//==============================================================================\r
struct InOutChannelPair\r
{\r
- InOutChannelPair() = default;\r
+ int16 inChannels = 0, outChannels = 0;\r
\r
+ InOutChannelPair() noexcept {}\r
+ InOutChannelPair (const InOutChannelPair& o) noexcept : inChannels (o.inChannels), outChannels (o.outChannels) {}\r
InOutChannelPair (int16 inCh, int16 outCh) noexcept : inChannels (inCh), outChannels (outCh) {}\r
InOutChannelPair (const int16 (&config)[2]) noexcept : inChannels (config[0]), outChannels (config[1]) {}\r
\r
+ InOutChannelPair& operator= (const InOutChannelPair& o) noexcept { inChannels = o.inChannels; outChannels = o.outChannels; return *this; }\r
+\r
bool operator== (const InOutChannelPair& other) const noexcept\r
{\r
return other.inChannels == inChannels && other.outChannels == outChannels;\r
}\r
-\r
- int16 inChannels = 0, outChannels = 0;\r
};\r
\r
template <int numLayouts>\r
OwnedArray<AudioProcessorParameter> managedParameters;\r
AudioProcessorParameter* getParamChecked (int) const noexcept;\r
\r
- AudioProcessorParameterGroup parameterTree { {}, {}, {} };\r
-\r
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING\r
BigInteger changingParams;\r
#endif\r
\r
friend class JuceVST3EditController;\r
friend class JuceVST3Component;\r
- friend class VST3PluginInstance;\r
friend class AudioUnitPluginInstance;\r
friend class LADSPAPluginInstance;\r
\r
{\r
resizable = shouldBeResizable;\r
\r
- if (! resizable && constrainer == &defaultConstrainer)\r
+ if (! resizable)\r
{\r
- auto width = getWidth();\r
- auto height = getHeight();\r
+ setConstrainer (&defaultConstrainer);\r
\r
- if (width > 0 && height > 0)\r
- defaultConstrainer.setSizeLimits (width, height, width, height);\r
+ if (auto w = getWidth())\r
+ {\r
+ if (auto h = getHeight())\r
+ {\r
+ defaultConstrainer.setSizeLimits (w, h, w, h);\r
+ resized();\r
+ }\r
+ }\r
}\r
}\r
\r
{\r
if (constrainer != newConstrainer)\r
{\r
- if (newConstrainer != nullptr)\r
- resizable = (newConstrainer->getMinimumWidth() != newConstrainer->getMaximumWidth()\r
- || newConstrainer->getMinimumHeight() != newConstrainer->getMaximumHeight());\r
-\r
+ resizable = true;\r
attachConstrainer (newConstrainer);\r
}\r
}\r
editorResized (true);\r
}\r
\r
-//==============================================================================\r
-#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&);\r
- createUnityPeerFunctionType juce_createUnityPeerFn = nullptr;\r
-#endif\r
-\r
-ComponentPeer* AudioProcessorEditor::createNewPeer (int styleFlags, void* nativeWindow)\r
-{\r
- #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- if (juce_createUnityPeerFn != nullptr)\r
- {\r
- ignoreUnused (styleFlags, nativeWindow);\r
- return juce_createUnityPeerFn (*this);\r
- }\r
- #endif\r
-\r
- return Component::createNewPeer (styleFlags, nativeWindow);\r
-}\r
-\r
} // namespace juce\r
JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditorListener)\r
};\r
\r
- ComponentPeer* createNewPeer (int styleFlags, void*) override;\r
-\r
//==============================================================================\r
void initialise();\r
void editorResized (bool wasResized);\r
{\r
AudioProcessorGraph::NodeAndChannel channel;\r
\r
- static AssignedBuffer createReadOnlyEmpty() noexcept { return { { zeroNodeID(), 0 } }; }\r
- static AssignedBuffer createFree() noexcept { return { { freeNodeID(), 0 } }; }\r
+ static AssignedBuffer createReadOnlyEmpty() noexcept { return { { (NodeID) zeroNodeID, 0 } }; }\r
+ static AssignedBuffer createFree() noexcept { return { { (NodeID) freeNodeID, 0 } }; }\r
\r
- bool isReadOnlyEmpty() const noexcept { return channel.nodeID == zeroNodeID(); }\r
- bool isFree() const noexcept { return channel.nodeID == freeNodeID(); }\r
+ bool isReadOnlyEmpty() const noexcept { return channel.nodeID == (NodeID) zeroNodeID; }\r
+ bool isFree() const noexcept { return channel.nodeID == (NodeID) freeNodeID; }\r
bool isAssigned() const noexcept { return ! (isReadOnlyEmpty() || isFree()); }\r
\r
- void setFree() noexcept { channel = { freeNodeID(), 0 }; }\r
- void setAssignedToNonExistentNode() noexcept { channel = { anonNodeID(), 0 }; }\r
+ void setFree() noexcept { channel = { (NodeID) freeNodeID, 0 }; }\r
+ void setAssignedToNonExistentNode() noexcept { channel = { (NodeID) anonNodeID, 0 }; }\r
\r
private:\r
- static NodeID anonNodeID() { return NodeID (0x7ffffffd); }\r
- static NodeID zeroNodeID() { return NodeID (0x7ffffffe); }\r
- static NodeID freeNodeID() { return NodeID (0x7fffffff); }\r
+ enum\r
+ {\r
+ anonNodeID = 0x7ffffffd,\r
+ zeroNodeID = 0x7ffffffe,\r
+ freeNodeID = 0x7fffffff\r
+ };\r
};\r
\r
Array<AssignedBuffer> audioBuffers, midiBuffers;\r
int delay;\r
};\r
\r
- HashMap<uint32, int> delays;\r
+ HashMap<NodeID, int> delays;\r
int totalLatency = 0;\r
\r
int getNodeDelay (NodeID nodeID) const noexcept\r
{\r
- return delays[nodeID.uid];\r
+ return delays[nodeID];\r
}\r
\r
int getInputLatencyForNode (NodeID nodeID) const\r
if (processor.producesMidi())\r
midiBuffers.getReference (midiBufferToUse).channel = { node.nodeID, AudioProcessorGraph::midiChannelIndex };\r
\r
- delays.set (node.nodeID.uid, maxLatency + processor.getLatencySamples());\r
+ delays.set (node.nodeID, maxLatency + processor.getLatencySamples());\r
\r
if (numOuts == 0)\r
totalLatency = maxLatency;\r
\r
- sequence.addProcessOp (node, audioChannelsToUse, totalChans, midiBufferToUse);\r
+ sequence.addProcessOp (&node, audioChannelsToUse, totalChans, midiBufferToUse);\r
}\r
\r
//==============================================================================\r
\r
void AudioProcessorGraph::clear()\r
{\r
- const ScopedLock sl (getCallbackLock());\r
-\r
if (nodes.isEmpty())\r
return;\r
\r
return {};\r
}\r
\r
- if (nodeID == NodeID())\r
- nodeID.uid = ++(lastNodeID.uid);\r
+ if (nodeID == 0)\r
+ nodeID = ++lastNodeID;\r
\r
for (auto* n : nodes)\r
{\r
}\r
}\r
\r
- if (lastNodeID < nodeID)\r
+ if (nodeID > lastNodeID)\r
lastNodeID = nodeID;\r
\r
newProcessor->setPlayHead (getPlayHead());\r
\r
Node::Ptr n (new Node (nodeID, newProcessor));\r
- nodes.add (n.get());\r
+ nodes.add (n);\r
n->setParentGraph (this);\r
topologyChanged();\r
return n;\r
}\r
\r
//==============================================================================\r
-void AudioProcessorGraph::prepareToPlay (double sampleRate, int estimatedSamplesPerBlock)\r
+void AudioProcessorGraph::prepareToPlay (double /*sampleRate*/, int estimatedSamplesPerBlock)\r
{\r
- setRateAndBufferSizeDetails (sampleRate, estimatedSamplesPerBlock);\r
+ if (renderSequenceFloat != nullptr)\r
+ renderSequenceFloat->prepareBuffers (estimatedSamplesPerBlock);\r
+\r
+ if (renderSequenceDouble != nullptr)\r
+ renderSequenceDouble->prepareBuffers (estimatedSamplesPerBlock);\r
+\r
clearRenderingSequence();\r
triggerAsyncUpdate();\r
}\r
\r
void AudioProcessorGraph::releaseResources()\r
{\r
- const ScopedLock sl (getCallbackLock());\r
-\r
isPrepared = 0;\r
\r
for (auto* n : nodes)\r
~AudioProcessorGraph();\r
\r
/** Each node in the graph has a UID of this type. */\r
- struct NodeID\r
- {\r
- NodeID() {}\r
- explicit NodeID (uint32 i) : uid (i) {}\r
-\r
- uint32 uid = 0;\r
-\r
- bool operator== (const NodeID& other) const noexcept { return uid == other.uid; }\r
- bool operator!= (const NodeID& other) const noexcept { return uid != other.uid; }\r
- bool operator< (const NodeID& other) const noexcept { return uid < other.uid; }\r
- };\r
+ using NodeID = uint32;\r
\r
//==============================================================================\r
/** A special index that represents the midi channel of a node.\r
This will return nullptr if the index is out of range.\r
@see getNodeForId\r
*/\r
- Node::Ptr getNode (int index) const noexcept { return nodes[index]; }\r
+ Node* getNode (int index) const noexcept { return nodes [index]; }\r
\r
/** Searches the graph for a node with the given ID number and returns it.\r
If no such node was found, this returns nullptr.\r
//==============================================================================\r
/** Receives a callback when a parameter is changed.\r
\r
- IMPORTANT NOTE: This will be called synchronously when a parameter changes, and\r
+ IMPORTANT NOTE: this will be called synchronously when a parameter changes, and\r
many audio processors will change their parameter during their audio callback.\r
This means that not only has your handler code got to be completely thread-safe,\r
but it's also got to be VERY fast, and avoid blocking. If you need to handle\r
/** Called to indicate that something else in the plugin has changed, like its\r
program, number of parameters, etc.\r
\r
- IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+ IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
call it during their audio callback. This means that not only has your handler code\r
got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
blocking. If you need to handle this event on your message thread, use this callback\r
press the mouse button, and audioProcessorParameterChangeGestureEnd would be\r
called when they release it.\r
\r
- IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+ IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
call it during their audio callback. This means that not only has your handler code\r
got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
blocking. If you need to handle this event on your message thread, use this callback\r
E.g. if the user is dragging a slider, this would be called when they release\r
the mouse button.\r
\r
- IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+ IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
call it during their audio callback. This means that not only has your handler code\r
got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
blocking. If you need to handle this event on your message thread, use this callback\r
*/\r
virtual bool isBoolean() const;\r
\r
- /** Returns a textual version of the supplied normalised parameter value.\r
+ /** Returns a textual version of the supplied parameter value.\r
The default implementation just returns the floating point value\r
as a string, but this could do anything you need for a custom type\r
of value.\r
*/\r
- virtual String getText (float normalisedValue, int /*maximumStringLength*/) const;\r
+ virtual String getText (float value, int /*maximumStringLength*/) const;\r
\r
/** Should parse a string and return the appropriate value for it. */\r
virtual float getValueForText (const String& text) const = 0;\r
/** Returns the set of strings which represent the possible states a parameter\r
can be in.\r
\r
- If you are hosting a plug-in you can use the result of this function to\r
+ If you are hosting a plug-in you can use the result of this funtion to\r
populate a ComboBox listing the allowed values.\r
\r
If you are implementing a plug-in then you do not need to override this.\r
\r
/** Receives a callback when a parameter has been changed.\r
\r
- IMPORTANT NOTE: This will be called synchronously when a parameter changes, and\r
+ IMPORTANT NOTE: this will be called synchronously when a parameter changes, and\r
many audio processors will change their parameter during their audio callback.\r
This means that not only has your handler code got to be completely thread-safe,\r
but it's also got to be VERY fast, and avoid blocking. If you need to handle\r
being true when they first press the mouse button, and it will be called again with\r
gestureIsStarting being false when they release it.\r
\r
- IMPORTANT NOTE: This will be called synchronously, and many audio processors will\r
+ IMPORTANT NOTE: this will be called synchronously, and many audio processors will\r
call it during their audio callback. This means that not only has your handler code\r
got to be completely thread-safe, but it's also got to be VERY fast, and avoid\r
blocking. If you need to handle this event on your message thread, use this callback\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class ParameterGroupTests : public UnitTest\r
-{\r
-public:\r
- ParameterGroupTests() : UnitTest ("ParameterGroups", "Parameters") {}\r
-\r
- void runTest() override\r
- {\r
- beginTest ("ParameterGroups");\r
-\r
- auto g1 = std::make_unique<AudioProcessorParameterGroup> ("g1", "g1", " - ");\r
-\r
- auto* p1 = new AudioParameterFloat ("p1", "p1", { 0.0f, 2.0f }, 0.5f);\r
- auto* p2 = new AudioParameterFloat ("p2", "p2", { 0.0f, 2.0f }, 0.5f);\r
- auto* p3 = new AudioParameterFloat ("p3", "p3", { 0.0f, 2.0f }, 0.5f);\r
-\r
- g1->addChild (std::unique_ptr<AudioParameterFloat> (p1));\r
- g1->addChild (std::unique_ptr<AudioParameterFloat> (p2),\r
- std::unique_ptr<AudioParameterFloat> (p3));\r
-\r
- auto p4 = std::make_unique<AudioParameterFloat> ("p4", "p4", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
- auto p5 = std::make_unique<AudioParameterFloat> ("p5", "p5", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
- auto p6 = std::make_unique<AudioParameterFloat> ("p6", "p6", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-\r
- g1->addChild (std::move (p4));\r
- g1->addChild (std::move (p5),\r
- std::move (p6));\r
-\r
- {\r
- auto topLevelParams = g1->getParameters (false);\r
- auto params = g1->getParameters (true);\r
- expect (topLevelParams == params);\r
- expectEquals (params.size(), 6);\r
-\r
- expect (params[0] == (AudioProcessorParameter*) p1);\r
- expect (params[1] == (AudioProcessorParameter*) p2);\r
- expect (params[2] == (AudioProcessorParameter*) p3);\r
-\r
- expect (dynamic_cast<AudioParameterFloat*> (params[3])->name == "p4");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[4])->name == "p5");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[5])->name == "p6");\r
- }\r
-\r
- auto* p7 = new AudioParameterFloat ("p7", "p7", { 0.0f, 2.0f }, 0.5f);\r
- auto* p8 = new AudioParameterFloat ("p8", "p8", { 0.0f, 2.0f }, 0.5f);\r
- auto* p9 = new AudioParameterFloat ("p9", "p9", { 0.0f, 2.0f }, 0.5f);\r
-\r
- auto p10 = std::make_unique<AudioParameterFloat> ("p10", "p10", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
- auto p11 = std::make_unique<AudioParameterFloat> ("p11", "p11", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
- auto p12 = std::make_unique<AudioParameterFloat> ("p12", "p12", NormalisableRange<float> (0.0f, 2.0f), 0.5f);\r
-\r
- auto g2 = std::make_unique<AudioProcessorParameterGroup> ("g2", "g2", " | ", std::unique_ptr<AudioParameterFloat> (p7));\r
- auto g3 = std::make_unique<AudioProcessorParameterGroup> ("g3", "g3", " | ", std::unique_ptr<AudioParameterFloat> (p8), std::unique_ptr<AudioParameterFloat> (p9));\r
- auto g4 = std::make_unique<AudioProcessorParameterGroup> ("g4", "g4", " | ", std::move (p10));\r
- auto g5 = std::make_unique<AudioProcessorParameterGroup> ("g5", "g5", " | ", std::move (p11), std::move (p12));\r
-\r
- g1->addChild (std::move (g2));\r
- g4->addChild (std::move (g5));\r
- g1->addChild (std::move (g3), std::move (g4));\r
-\r
- {\r
- auto topLevelParams = g1->getParameters (false);\r
- auto params = g1->getParameters (true);\r
- expectEquals (topLevelParams.size(), 6);\r
- expectEquals (params.size(), 12);\r
-\r
- expect (params[0] == (AudioProcessorParameter*) p1);\r
- expect (params[1] == (AudioProcessorParameter*) p2);\r
- expect (params[2] == (AudioProcessorParameter*) p3);\r
-\r
- expect (dynamic_cast<AudioParameterFloat*> (params[3])->name == "p4");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[4])->name == "p5");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[5])->name == "p6");\r
-\r
- expect (params[6] == (AudioProcessorParameter*) p7);\r
- expect (params[7] == (AudioProcessorParameter*) p8);\r
- expect (params[8] == (AudioProcessorParameter*) p9);\r
-\r
- expect (dynamic_cast<AudioParameterFloat*> (params[9]) ->name == "p10");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[10])->name == "p11");\r
- expect (dynamic_cast<AudioParameterFloat*> (params[11])->name == "p12");\r
- }\r
-\r
- g1->addChild (std::make_unique<AudioProcessorParameterGroup> ("g6", "g6", " | ",\r
- std::make_unique<AudioParameterFloat> ("p11", "p11", NormalisableRange<float> (0.0f, 2.0f), 0.5f),\r
- std::make_unique<AudioProcessorParameterGroup> ("g7", "g7", " | ",\r
- std::make_unique<AudioParameterFloat> ("p12", "p12", NormalisableRange<float> (0.0f, 2.0f), 0.5f)),\r
- std::make_unique<AudioParameterFloat> ("p13", "p13", NormalisableRange<float> (0.0f, 2.0f), 0.5f)));\r
-\r
- TestAudioProcessor processor;\r
-\r
- processor.addParameter (new AudioParameterFloat ("pstart", "pstart", NormalisableRange<float> (0.0f, 2.0f), 0.5f));\r
- auto groupParams = g1->getParameters (true);\r
- processor.addParameterGroup (std::move (g1));\r
- processor.addParameter (new AudioParameterFloat ("pend", "pend", NormalisableRange<float> (0.0f, 2.0f), 0.5f));\r
-\r
- auto& processorParams = processor.getParameters();\r
- expect (dynamic_cast<AudioParameterFloat*> (processorParams.getFirst())->name == "pstart");\r
- expect (dynamic_cast<AudioParameterFloat*> (processorParams.getLast()) ->name == "pend");\r
-\r
- auto numParams = processorParams.size();\r
-\r
- for (int i = 1; i < numParams - 1; ++i)\r
- expect (processorParams[i] == groupParams[i - 1]);\r
-\r
- }\r
-private:\r
- struct TestAudioProcessor : public AudioProcessor\r
- {\r
- const String getName() const override { return "ap"; }\r
- void prepareToPlay (double, int) override {}\r
- void releaseResources() override {}\r
- void processBlock (AudioBuffer<float>&, MidiBuffer&) override {}\r
- double getTailLengthSeconds() const override { return 0.0; }\r
- bool acceptsMidi() const override { return false; }\r
- bool producesMidi() const override { return false; }\r
- AudioProcessorEditor* createEditor() override { return nullptr; }\r
- bool hasEditor() const override { return false; }\r
- int getNumPrograms() override { return 0; }\r
- int getCurrentProgram() override { return 0; }\r
- void setCurrentProgram (int) override {}\r
- const String getProgramName (int) override { return {}; }\r
- void changeProgramName (int, const String&) override {}\r
- void getStateInformation (MemoryBlock&) override {}\r
- void setStateInformation (const void*, int) override {}\r
- };\r
-};\r
-\r
-static ParameterGroupTests parameterGroupTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/** A class encapsulating a group of AudioProcessorParameters and nested\r
- AudioProcessorParameterGroups.\r
-\r
- This class is predominantly write-only; there are methods for adding group\r
- members but none for removing them. Ultimately you will probably want to\r
- add a fully constructed group to an AudioProcessor.\r
-\r
- @see AudioProcessor::addParameterGroup\r
-\r
- @tags{Audio}\r
-*/\r
-class AudioProcessorParameterGroup\r
-{\r
-public:\r
- //==============================================================================\r
- /** A child of an AudioProcessorParameterGroup.\r
-\r
- This can contain either an AudioProcessorParameter or an\r
- AudioProcessorParameterGroup. You can query which using the\r
- getParameter and getGroup methods.\r
-\r
- @code\r
- for (auto* child : group)\r
- if (auto* parameter = node.getParameter())\r
- parameter->setValueNotifyingHost (0.5f);\r
- else\r
- node.getGroup()->AddChild (new Parameter());\r
- @endcode\r
- */\r
- class AudioProcessorParameterNode\r
- {\r
- public:\r
- //==============================================================================\r
- /** Returns the parent group or nullptr if this is a top-level group. */\r
- AudioProcessorParameterGroup* getParent() const { return parent; }\r
-\r
- /** Returns a pointer to a parameter if this node contains a paramater, nullptr otherwise. */\r
- AudioProcessorParameter* getParameter() const { return parameter.get(); }\r
-\r
- /** Returns a pointer to a group if this node contains a group, nullptr otherwise. */\r
- AudioProcessorParameterGroup* getGroup() const { return group.get(); }\r
-\r
- private:\r
- //==============================================================================\r
- AudioProcessorParameterNode (std::unique_ptr<AudioProcessorParameter> param,\r
- AudioProcessorParameterGroup* parentGroup)\r
- : parameter (std::move (param)), parent (parentGroup)\r
- {}\r
-\r
- AudioProcessorParameterNode (std::unique_ptr<AudioProcessorParameterGroup> grp,\r
- AudioProcessorParameterGroup* parentGroup)\r
- : group (std::move (grp)), parent (parentGroup)\r
- {\r
- group->parent = parent;\r
- }\r
-\r
- std::unique_ptr<AudioProcessorParameterGroup> group;\r
- std::unique_ptr<AudioProcessorParameter> parameter;\r
- AudioProcessorParameterGroup* parent = nullptr;\r
-\r
- friend class AudioProcessorParameterGroup;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterNode)\r
- };\r
-\r
- //==============================================================================\r
- /** Creates an empty AudioProcessorParameterGroup.\r
-\r
- @param groupID A unique identifier for the group. Keep it basic; don't use any special\r
- characters like "." and avoid pure integer strings which could collide with\r
- legacy parameter IDs.\r
- @param groupName The group's name, which will be displayed in the host.\r
- @param subgroupSeparator A separator string to use between the name of this group and the name of any\r
- subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
- layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
-\r
- */\r
- AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator)\r
- : identifier (groupID), name (groupName), separator (subgroupSeparator)\r
- {\r
- }\r
-\r
- /** Creates an AudioProcessorParameterGroup with a single child.\r
-\r
- @param groupID A unique identifier for the group. Keep it basic; don't use any special\r
- characters like "." and avoid pure integer strings which could collide with\r
- legacy parameter IDs.\r
- @param groupName The group's name, which will be displayed in the host.\r
- @param subgroupSeparator A separator string to use between the name of this group and the name of any\r
- subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
- layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
- @param child An AudioProcessorParameter or an AudioProcessorParameterGroup to add to the group.\r
- */\r
- template <typename ChildType>\r
- AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator,\r
- std::unique_ptr<ChildType> child)\r
- : AudioProcessorParameterGroup (groupID, groupName, subgroupSeparator)\r
- {\r
- addChild (std::move (child));\r
- }\r
-\r
- /** Creates an AudioProcessorParameterGroup with multiple children.\r
-\r
- @param groupID A unique identifier for the group. Keep it basic; don't use any special\r
- characters like "." and avoid pure integer strings which could collide with\r
- legacy parameter IDs.\r
- @param groupName The group's name, which will be displayed in the host.\r
- @param subgroupSeparator A separator string to use between the name of this group and the name of any\r
- subgroups if this group is flattened. AUv3 and VST3 plug-ins can have multiple\r
- layers of nested subgroups, but AU plug-ins cannot have any subgroups.\r
- @param firstChild An AudioProcessorParameter or an AudioProcessorParameterGroup to add to the group.\r
- @param remainingChildren A list of more AudioProcessorParameters or AudioProcessorParameterGroups to add to the group.\r
- */\r
- template <typename ChildType, typename... Args>\r
- AudioProcessorParameterGroup (const String& groupID, const String& groupName, const String& subgroupSeparator,\r
- std::unique_ptr<ChildType> firstChild, Args&&... remainingChildren)\r
- : AudioProcessorParameterGroup (groupID, groupName, subgroupSeparator, std::move (firstChild))\r
- {\r
- addChild (std::forward<Args> (remainingChildren)...);\r
- }\r
-\r
- //==============================================================================\r
- /** Returns the group's ID. */\r
- String getID() const { return identifier; }\r
-\r
- /** Returns the group's name. */\r
- String getName() const { return name; }\r
-\r
- /** Returns the group's separator string. */\r
- String getSeparator() const { return separator; }\r
-\r
- /** Returns the parent of the group, or nullptr if this is a top-levle group. */\r
- const AudioProcessorParameterGroup* getParent() const noexcept { return parent; }\r
-\r
- //==============================================================================\r
- const AudioProcessorParameterNode** begin() const noexcept { return children.begin(); }\r
- const AudioProcessorParameterNode** end() const noexcept { return children.end(); }\r
-\r
- //==============================================================================\r
- /** Swaps the content of this group with another. */\r
- void swapWith (AudioProcessorParameterGroup& other) noexcept\r
- {\r
- children.swapWith (other.children);\r
-\r
- auto refreshParentPtr = [] (AudioProcessorParameterGroup& parentGroup)\r
- {\r
- for (auto* child : parentGroup)\r
- if (auto* group = child->getGroup())\r
- group->parent = &parentGroup;\r
- };\r
-\r
- refreshParentPtr (*this);\r
- refreshParentPtr (other);\r
- }\r
-\r
- //==============================================================================\r
- /** Returns all subgroups of this group.\r
-\r
- @param recursive If this is true then this method will fetch all nested\r
- subgroups using a depth first search.\r
- */\r
- Array<const AudioProcessorParameterGroup*> getSubgroups (bool recursive) const\r
- {\r
- Array<const AudioProcessorParameterGroup*> groups;\r
- getSubgroups (groups, recursive);\r
- return groups;\r
- }\r
-\r
- /** Returns all the parameters in this group.\r
-\r
- @param recursive If this is true then this method will fetch all nested\r
- parameters using a depth first search.\r
- */\r
- Array<AudioProcessorParameter*> getParameters (bool recursive) const\r
- {\r
- Array<AudioProcessorParameter*> parameters;\r
- getParameters (parameters, recursive);\r
- return parameters;\r
- }\r
-\r
- /** Searches this group recursively for a parameter and returns a depth ordered\r
- list of the groups it belongs to.\r
- */\r
- Array<const AudioProcessorParameterGroup*> getGroupsForParameter (AudioProcessorParameter* parameter) const\r
- {\r
- Array<const AudioProcessorParameterGroup*> groups;\r
-\r
- if (auto* group = getGroupForParameter (parameter))\r
- {\r
- while (group != this)\r
- {\r
- groups.insert (0, group);\r
- group = group->getParent();\r
- }\r
- }\r
-\r
- return groups;\r
- }\r
-\r
- //==============================================================================\r
- /** Adds a child to the group. */\r
- template <typename ChildType>\r
- void addChild (std::unique_ptr<ChildType> child)\r
- {\r
- // If you hit a compiler error here then you are attempting to add a\r
- // child that is neither a pointer to an AudioProcessorParameterGroup\r
- // nor a pointer to an AudioProcessorParameter.\r
- children.add (new AudioProcessorParameterNode (std::move (child), this));\r
- }\r
-\r
- /** Adds multiple children to the group. */\r
- template <typename ChildType, typename... Args>\r
- void addChild (std::unique_ptr<ChildType> firstChild, Args&&... remainingChildren)\r
- {\r
- addChild (std::move (firstChild));\r
- addChild (std::forward<Args> (remainingChildren)...);\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- void getSubgroups (Array<const AudioProcessorParameterGroup*>& previousGroups, bool recursive) const\r
- {\r
- for (auto* child : children)\r
- {\r
- if (auto* group = child->getGroup())\r
- {\r
- previousGroups.add (group);\r
-\r
- if (recursive)\r
- group->getSubgroups (previousGroups, true);\r
- }\r
- }\r
- }\r
-\r
- void getParameters (Array<AudioProcessorParameter*>& previousParameters, bool recursive) const\r
- {\r
- for (auto* child : children)\r
- {\r
- if (auto* parameter = child->getParameter())\r
- previousParameters.add (parameter);\r
- else if (recursive)\r
- child->getGroup()->getParameters (previousParameters, true);\r
- }\r
- }\r
-\r
- const AudioProcessorParameterGroup* getGroupForParameter (AudioProcessorParameter* parameter) const\r
- {\r
- for (auto* child : children)\r
- {\r
- if (child->getParameter() == parameter)\r
- return this;\r
-\r
- if (auto* group = child->getGroup())\r
- if (auto* foundGroup = group->getGroupForParameter (parameter))\r
- return foundGroup;\r
- }\r
-\r
- return nullptr;\r
- }\r
-\r
- //==============================================================================\r
- const String identifier, name, separator;\r
- OwnedArray<const AudioProcessorParameterNode> children;\r
- AudioProcessorParameterGroup* parent = nullptr;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterGroup)\r
-};\r
-\r
-} // namespace juce\r
private Timer\r
{\r
public:\r
- ParameterListener (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : processor (proc), parameter (param)\r
+ ParameterListener (AudioProcessor& p, AudioProcessorParameter& param)\r
+ : processor (p), parameter (param)\r
{\r
if (LegacyAudioParameter::isLegacy (¶meter))\r
processor.addListener (this);\r
private ParameterListener\r
{\r
public:\r
- BooleanParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ BooleanParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+ : ParameterListener (processor, param)\r
{\r
// Set the initial value.\r
handleNewParameterValue();\r
private ParameterListener\r
{\r
public:\r
- SwitchParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ SwitchParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+ : ParameterListener (processor, param)\r
{\r
auto* leftButton = buttons.add (new TextButton());\r
auto* rightButton = buttons.add (new TextButton());\r
private ParameterListener\r
{\r
public:\r
- ChoiceParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param),\r
+ ChoiceParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+ : ParameterListener (processor, param),\r
parameterValues (getParameter().getAllValueStrings())\r
{\r
box.addItemList (parameterValues, 1);\r
private ParameterListener\r
{\r
public:\r
- SliderParameterComponent (AudioProcessor& proc, AudioProcessorParameter& param)\r
- : ParameterListener (proc, param)\r
+ SliderParameterComponent (AudioProcessor& processor, AudioProcessorParameter& param)\r
+ : ParameterListener (processor, param)\r
{\r
if (getParameter().getNumSteps() != AudioProcessor::getDefaultNumParameterSteps())\r
slider.setRange (0.0, 1.0, 1.0 / (getParameter().getNumSteps() - 1.0));\r
};\r
\r
//==============================================================================\r
-struct GenericAudioProcessorEditor::Pimpl\r
+struct GenericAudioProcessorEditor::Pimpl\r
{\r
Pimpl (GenericAudioProcessorEditor& parent)\r
: owner (parent)\r
\r
void PluginListComponent::resized()\r
{\r
- auto r = getLocalBounds().reduced (2);\r
+ Rectangle<int> r (getLocalBounds().reduced (2));\r
\r
optionsButton.setBounds (r.removeFromBottom (24));\r
optionsButton.changeWidthToFitText (24);\r
std::unique_ptr<TableListBoxModel> tableModel;\r
\r
class Scanner;\r
+ friend class Scanner;\r
+ friend struct ContainerDeletePolicy<Scanner>;\r
std::unique_ptr<Scanner> currentScanner;\r
\r
void scanFinished (const StringArray&);\r
\r
@tags{Audio}\r
*/\r
-class JUCE_API AudioParameterBool : public RangedAudioParameter\r
+class JUCE_API AudioParameterBool : public AudioProcessorParameterWithID\r
{\r
public:\r
/** Creates a AudioParameterBool with the specified parameters.\r
\r
/** Returns the parameter's current boolean value. */\r
bool get() const noexcept { return value >= 0.5f; }\r
-\r
/** Returns the parameter's current boolean value. */\r
operator bool() const noexcept { return get(); }\r
\r
/** Changes the parameter's current value to a new boolean. */\r
AudioParameterBool& operator= (bool newValue);\r
\r
- /** Returns the range of values that the parameter can take. */\r
- const NormalisableRange<float>& getNormalisableRange() const override { return range; }\r
-\r
protected:\r
/** Override this method if you are interested in receiving callbacks\r
when the parameter value changes.\r
String getText (float, int) const override;\r
float getValueForText (const String&) const override;\r
\r
- const NormalisableRange<float> range { 0.0f, 1.0f, 1.0f };\r
float value;\r
const float defaultValue;\r
std::function<String (bool, int)> stringFromBoolFunction;\r
\r
@tags{Audio}\r
*/\r
-class JUCE_API AudioParameterChoice : public RangedAudioParameter\r
+class JUCE_API AudioParameterChoice : public AudioProcessorParameterWithID\r
{\r
public:\r
/** Creates a AudioParameterChoice with the specified parameters.\r
\r
/** Returns the current index of the selected item. */\r
int getIndex() const noexcept { return roundToInt (value); }\r
-\r
/** Returns the current index of the selected item. */\r
operator int() const noexcept { return getIndex(); }\r
\r
/** Returns the name of the currently selected item. */\r
String getCurrentChoiceName() const noexcept { return choices[getIndex()]; }\r
-\r
/** Returns the name of the currently selected item. */\r
operator String() const noexcept { return getCurrentChoiceName(); }\r
\r
/** Changes the selected item to a new index. */\r
AudioParameterChoice& operator= (int newValue);\r
\r
- /** Returns the range of values that the parameter can take. */\r
- const NormalisableRange<float>& getNormalisableRange() const override { return range; }\r
-\r
/** Provides access to the list of choices that this parameter is working with. */\r
const StringArray choices;\r
\r
String getText (float, int) const override;\r
float getValueForText (const String&) const override;\r
\r
- const NormalisableRange<float> range;\r
+ int limitRange (int) const noexcept;\r
+ float convertTo0to1 (int) const noexcept;\r
+ int convertFrom0to1 (float) const noexcept;\r
+\r
float value;\r
+ const int maxIndex;\r
const float defaultValue;\r
std::function<String (int, int)> stringFromIndexFunction;\r
std::function<int (const String&)> indexFromStringFunction;\r
\r
@tags{Audio}\r
*/\r
-class JUCE_API AudioParameterFloat : public RangedAudioParameter\r
+class JUCE_API AudioParameterFloat : public AudioProcessorParameterWithID\r
{\r
public:\r
/** Creates a AudioParameterFloat with the specified parameters.\r
converts it into a non-normalised value. Some hosts use\r
this to allow users to type in parameter values.\r
*/\r
- AudioParameterFloat (const String& parameterID,\r
- const String& name,\r
+ AudioParameterFloat (const String& parameterID, const String& name,\r
NormalisableRange<float> normalisableRange,\r
float defaultValue,\r
const String& label = String(),\r
For control over skew factors, you can use the other\r
constructor and provide a NormalisableRange.\r
*/\r
- AudioParameterFloat (String parameterID,\r
- String name,\r
+ AudioParameterFloat (String parameterID, String name,\r
float minValue,\r
float maxValue,\r
float defaultValue);\r
\r
/** Returns the parameter's current value. */\r
float get() const noexcept { return value; }\r
-\r
/** Returns the parameter's current value. */\r
operator float() const noexcept { return value; }\r
\r
/** Changes the parameter's current value. */\r
AudioParameterFloat& operator= (float newValue);\r
\r
- /** Returns the range of values that the parameter can take. */\r
- const NormalisableRange<float>& getNormalisableRange() const override { return range; }\r
-\r
/** Provides access to the parameter's range. */\r
NormalisableRange<float> range;\r
\r
\r
@tags{Audio}\r
*/\r
-class JUCE_API AudioParameterInt : public RangedAudioParameter\r
+class JUCE_API AudioParameterInt : public AudioProcessorParameterWithID\r
{\r
public:\r
/** Creates a AudioParameterInt with the specified parameters.\r
\r
/** Returns the parameter's current value as an integer. */\r
int get() const noexcept { return roundToInt (value); }\r
-\r
/** Returns the parameter's current value as an integer. */\r
operator int() const noexcept { return get(); }\r
\r
AudioParameterInt& operator= (int newValue);\r
\r
/** Returns the parameter's range. */\r
- Range<int> getRange() const noexcept { return { (int) getNormalisableRange().start, (int) getNormalisableRange().end }; }\r
-\r
- /** Returns the range of values that the parameter can take. */\r
- const NormalisableRange<float>& getNormalisableRange() const override { return range; }\r
+ Range<int> getRange() const noexcept { return Range<int> (minValue, maxValue); }\r
\r
protected:\r
/** Override this method if you are interested in receiving callbacks\r
String getText (float, int) const override;\r
float getValueForText (const String&) const override;\r
\r
- const NormalisableRange<float> range;\r
+ int limitRange (int) const noexcept;\r
+ float convertTo0to1 (int) const noexcept;\r
+ int convertFrom0to1 (float) const noexcept;\r
+\r
+ const int minValue, maxValue, rangeOfValues;\r
float value;\r
const float defaultValue;\r
std::function<String (int, int)> stringFromIntFunction;\r
class JUCE_API AudioProcessorParameterWithID : public AudioProcessorParameter\r
{\r
public:\r
- /** The creation of this object requires providing a name and ID which will be\r
+ /** Creation of this object requires providing a name and ID which will be\r
constant for its lifetime.\r
*/\r
AudioProcessorParameterWithID (const String& parameterID,\r
const String& labelToUse, Category categoryToUse,\r
std::function<String (float, int)> stringFromValue,\r
std::function<float (const String&)> valueFromString)\r
- : RangedAudioParameter (idToUse, nameToUse, labelToUse, categoryToUse),\r
+ : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse, categoryToUse),\r
range (r), value (def), defaultValue (def),\r
stringFromValueFunction (stringFromValue),\r
valueFromStringFunction (valueFromString)\r
\r
AudioParameterFloat::~AudioParameterFloat() {}\r
\r
-float AudioParameterFloat::getValue() const { return convertTo0to1 (value); }\r
-void AudioParameterFloat::setValue (float newValue) { value = convertFrom0to1 (newValue); valueChanged (get()); }\r
-float AudioParameterFloat::getDefaultValue() const { return convertTo0to1 (defaultValue); }\r
+float AudioParameterFloat::getValue() const { return range.convertTo0to1 (value); }\r
+void AudioParameterFloat::setValue (float newValue) { value = range.convertFrom0to1 (newValue); valueChanged (get()); }\r
+float AudioParameterFloat::getDefaultValue() const { return range.convertTo0to1 (defaultValue); }\r
int AudioParameterFloat::getNumSteps() const { return AudioProcessorParameterWithID::getNumSteps(); }\r
-String AudioParameterFloat::getText (float v, int length) const { return stringFromValueFunction (convertFrom0to1 (v), length); }\r
-float AudioParameterFloat::getValueForText (const String& text) const { return convertTo0to1 (valueFromStringFunction (text)); }\r
+String AudioParameterFloat::getText (float v, int length) const { return stringFromValueFunction (range.convertFrom0to1 (v), length); }\r
+float AudioParameterFloat::getValueForText (const String& text) const { return range.convertTo0to1 (valueFromStringFunction (text)); }\r
void AudioParameterFloat::valueChanged (float) {}\r
\r
AudioParameterFloat& AudioParameterFloat::operator= (float newValue)\r
{\r
if (value != newValue)\r
- setValueNotifyingHost (convertTo0to1 (newValue));\r
+ setValueNotifyingHost (range.convertTo0to1 (newValue));\r
\r
return *this;\r
}\r
\r
-\r
//==============================================================================\r
AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameToUse,\r
- int minValue, int maxValue, int def,\r
+ int mn, int mx, int def,\r
const String& labelToUse,\r
std::function<String (int, int)> stringFromInt,\r
std::function<int (const String&)> intFromString)\r
- : RangedAudioParameter (idToUse, nameToUse, labelToUse),\r
- range ((float) minValue, (float) maxValue,\r
- [](float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); },\r
- [](float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); },\r
- [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }),\r
+ : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),\r
+ minValue (mn), maxValue (mx), rangeOfValues (maxValue - minValue),\r
value ((float) def),\r
- defaultValue (convertTo0to1 ((float) def)),\r
+ defaultValue (convertTo0to1 (def)),\r
stringFromIntFunction (stringFromInt),\r
intFromStringFunction (intFromString)\r
{\r
\r
AudioParameterInt::~AudioParameterInt() {}\r
\r
-float AudioParameterInt::getValue() const { return convertTo0to1 (value); }\r
-void AudioParameterInt::setValue (float newValue) { value = convertFrom0to1 (newValue); valueChanged (get()); }\r
+int AudioParameterInt::limitRange (int v) const noexcept { return jlimit (minValue, maxValue, v); }\r
+float AudioParameterInt::convertTo0to1 (int v) const noexcept { return (limitRange (v) - minValue) / (float) rangeOfValues; }\r
+int AudioParameterInt::convertFrom0to1 (float v) const noexcept { return limitRange (roundToInt ((v * (float) rangeOfValues) + minValue)); }\r
+\r
+float AudioParameterInt::getValue() const { return convertTo0to1 (roundToInt (value)); }\r
+void AudioParameterInt::setValue (float newValue) { value = (float) convertFrom0to1 (newValue); valueChanged (get()); }\r
float AudioParameterInt::getDefaultValue() const { return defaultValue; }\r
-int AudioParameterInt::getNumSteps() const { return ((int) getNormalisableRange().getRange().getLength()) + 1; }\r
-float AudioParameterInt::getValueForText (const String& text) const { return convertTo0to1 ((float) intFromStringFunction (text)); }\r
-String AudioParameterInt::getText (float v, int length) const { return stringFromIntFunction ((int) convertFrom0to1 (v), length); }\r
+int AudioParameterInt::getNumSteps() const { return rangeOfValues + 1; }\r
+float AudioParameterInt::getValueForText (const String& text) const { return convertTo0to1 (intFromStringFunction (text)); }\r
+String AudioParameterInt::getText (float v, int length) const { return stringFromIntFunction (convertFrom0to1 (v), length); }\r
void AudioParameterInt::valueChanged (int) {}\r
\r
AudioParameterInt& AudioParameterInt::operator= (int newValue)\r
{\r
if (get() != newValue)\r
- setValueNotifyingHost (convertTo0to1 ((float) newValue));\r
+ setValueNotifyingHost (convertTo0to1 (newValue));\r
\r
return *this;\r
}\r
bool def, const String& labelToUse,\r
std::function<String (bool, int)> stringFromBool,\r
std::function<bool (const String&)> boolFromString)\r
- : RangedAudioParameter (idToUse, nameToUse, labelToUse),\r
+ : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse),\r
value (def ? 1.0f : 0.0f),\r
defaultValue (value),\r
stringFromBoolFunction (stringFromBool),\r
const StringArray& c, int def, const String& labelToUse,\r
std::function<String (int, int)> stringFromIndex,\r
std::function<int (const String&)> indexFromString)\r
- : RangedAudioParameter (idToUse, nameToUse, labelToUse), choices (c),\r
- range (0.0f, choices.size() - 1.0f,\r
- [](float, float end, float v) { return jlimit (0.0f, end, v * end); },\r
- [](float, float end, float v) { return jlimit (0.0f, 1.0f, v / end); },\r
- [](float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); }),\r
+ : AudioProcessorParameterWithID (idToUse, nameToUse, labelToUse), choices (c),\r
value ((float) def),\r
- defaultValue (convertTo0to1 ((float) def)),\r
+ maxIndex (choices.size() - 1),\r
+ defaultValue (convertTo0to1 (def)),\r
stringFromIndexFunction (stringFromIndex),\r
indexFromStringFunction (indexFromString)\r
{\r
\r
AudioParameterChoice::~AudioParameterChoice() {}\r
\r
-float AudioParameterChoice::getValue() const { return convertTo0to1 (value); }\r
-void AudioParameterChoice::setValue (float newValue) { value = convertFrom0to1 (newValue); valueChanged (getIndex()); }\r
+int AudioParameterChoice::limitRange (int v) const noexcept { return jlimit (0, maxIndex, v); }\r
+float AudioParameterChoice::convertTo0to1 (int v) const noexcept { return jlimit (0.0f, 1.0f, v / (float) maxIndex); }\r
+int AudioParameterChoice::convertFrom0to1 (float v) const noexcept { return limitRange (roundToInt (v * (float) maxIndex)); }\r
+\r
+float AudioParameterChoice::getValue() const { return convertTo0to1 (roundToInt (value)); }\r
+void AudioParameterChoice::setValue (float newValue) { value = (float) convertFrom0to1 (newValue); valueChanged (getIndex()); }\r
float AudioParameterChoice::getDefaultValue() const { return defaultValue; }\r
int AudioParameterChoice::getNumSteps() const { return choices.size(); }\r
bool AudioParameterChoice::isDiscrete() const { return true; }\r
-float AudioParameterChoice::getValueForText (const String& text) const { return convertTo0to1 ((float) indexFromStringFunction (text)); }\r
-String AudioParameterChoice::getText (float v, int length) const { return stringFromIndexFunction ((int) convertFrom0to1 (v), length); }\r
+float AudioParameterChoice::getValueForText (const String& text) const { return convertTo0to1 (indexFromStringFunction (text)); }\r
+String AudioParameterChoice::getText (float v, int length) const { return stringFromIndexFunction (convertFrom0to1 (v), length); }\r
void AudioParameterChoice::valueChanged (int) {}\r
\r
AudioParameterChoice& AudioParameterChoice::operator= (int newValue)\r
{\r
if (getIndex() != newValue)\r
- setValueNotifyingHost (convertTo0to1 ((float) newValue));\r
+ setValueNotifyingHost (convertTo0to1 (newValue));\r
\r
return *this;\r
}\r
\r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct SpecialisedAudioParameterTests final : public UnitTest\r
-{\r
- SpecialisedAudioParameterTests() : UnitTest ("Specialised Audio Parameters", "AudioProcessor parameters") {}\r
-\r
- void runTest() override\r
- {\r
- beginTest ("A choice parameter with three options switches at the correct points");\r
- {\r
- AudioParameterChoice choice ({}, {}, { "a", "b", "c" }, {});\r
-\r
- choice.setValueNotifyingHost (0.0f);\r
- expectEquals (choice.getIndex(), 0);\r
-\r
- choice.setValueNotifyingHost (0.2f);\r
- expectEquals (choice.getIndex(), 0);\r
-\r
- choice.setValueNotifyingHost (0.3f);\r
- expectEquals (choice.getIndex(), 1);\r
-\r
- choice.setValueNotifyingHost (0.7f);\r
- expectEquals (choice.getIndex(), 1);\r
-\r
- choice.setValueNotifyingHost (0.8f);\r
- expectEquals (choice.getIndex(), 2);\r
-\r
- choice.setValueNotifyingHost (1.0f);\r
- expectEquals (choice.getIndex(), 2);\r
- }\r
-\r
- beginTest ("An int parameter with three options switches at the correct points");\r
- {\r
- AudioParameterInt intParam ({}, {}, 1, 3, 1);\r
-\r
- intParam.setValueNotifyingHost (0.0f);\r
- expectEquals (intParam.get(), 1);\r
-\r
- intParam.setValueNotifyingHost (0.2f);\r
- expectEquals (intParam.get(), 1);\r
-\r
- intParam.setValueNotifyingHost (0.3f);\r
- expectEquals (intParam.get(), 2);\r
-\r
- intParam.setValueNotifyingHost (0.7f);\r
- expectEquals (intParam.get(), 2);\r
-\r
- intParam.setValueNotifyingHost (0.8f);\r
- expectEquals (intParam.get(), 3);\r
-\r
- intParam.setValueNotifyingHost (1.0f);\r
- expectEquals (intParam.get(), 3);\r
- }\r
-\r
-\r
- beginTest ("Choice parameters handle out-of-bounds input");\r
- {\r
- AudioParameterChoice choiceParam ({}, {}, { "a", "b", "c" }, {});\r
-\r
- choiceParam.setValueNotifyingHost (-0.5f);\r
- expectEquals (choiceParam.getIndex(), 0);\r
-\r
- choiceParam.setValueNotifyingHost (1.5f);\r
- expectEquals (choiceParam.getIndex(), 2);\r
- }\r
-\r
- beginTest ("Int parameters handle out-of-bounds input");\r
- {\r
- AudioParameterInt intParam ({}, {}, -1, 2, 0);\r
-\r
- intParam.setValueNotifyingHost (-0.5f);\r
- expectEquals (intParam.get(), -1);\r
-\r
- intParam.setValueNotifyingHost (1.5f);\r
- expectEquals (intParam.get(), 2);\r
-\r
- intParam = -5;\r
- expectEquals (intParam.get(), -1);\r
-\r
- intParam = 5;\r
- expectEquals (intParam.get(), 2);\r
- }\r
- }\r
-} specialisedAudioParameterTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
namespace juce\r
{\r
\r
-//==============================================================================\r
-AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID,\r
- const String& parameterName,\r
- const String& labelText,\r
- NormalisableRange<float> valueRange,\r
- float defaultValue,\r
- std::function<String (float)> valueToTextFunction,\r
- std::function<float (const String&)> textToValueFunction,\r
- bool isMetaParameter,\r
- bool isAutomatableParameter,\r
- bool isDiscrete,\r
- AudioProcessorParameter::Category category,\r
- bool isBoolean)\r
- : AudioParameterFloat (parameterID,\r
- parameterName,\r
- valueRange,\r
- defaultValue,\r
- labelText,\r
- category,\r
- valueToTextFunction == nullptr ? std::function<String (float v, int)>()\r
- : [valueToTextFunction](float v, int) { return valueToTextFunction (v); },\r
- std::move (textToValueFunction)),\r
- unsnappedDefault (valueRange.convertTo0to1 (defaultValue)),\r
- metaParameter (isMetaParameter),\r
- automatable (isAutomatableParameter),\r
- discrete (isDiscrete),\r
- boolean (isBoolean)\r
+struct AudioProcessorValueTreeState::Parameter : public AudioProcessorParameterWithID,\r
+ private ValueTree::Listener\r
{\r
-}\r
+ Parameter (AudioProcessorValueTreeState& s,\r
+ const String& parameterID, const String& paramName, const String& labelText,\r
+ NormalisableRange<float> r, float defaultVal,\r
+ std::function<String (float)> valueToText,\r
+ std::function<float (const String&)> textToValue,\r
+ bool meta,\r
+ bool automatable,\r
+ bool discrete,\r
+ AudioProcessorParameter::Category category,\r
+ bool boolean)\r
+ : AudioProcessorParameterWithID (parameterID, paramName, labelText, category),\r
+ owner (s), valueToTextFunction (valueToText), textToValueFunction (textToValue),\r
+ range (r), value (defaultVal), defaultValue (defaultVal),\r
+ listenersNeedCalling (true),\r
+ isMetaParam (meta),\r
+ isAutomatableParam (automatable),\r
+ isDiscreteParam (discrete),\r
+ isBooleanParam (boolean)\r
+ {\r
+ value = defaultValue;\r
+ state.addListener (this);\r
+ }\r
\r
-float AudioProcessorValueTreeState::Parameter::getDefaultValue() const { return unsnappedDefault; }\r
-int AudioProcessorValueTreeState::Parameter::getNumSteps() const { return RangedAudioParameter::getNumSteps(); }\r
+ ~Parameter()\r
+ {\r
+ // should have detached all callbacks before destroying the parameters!\r
+ jassert (listeners.size() <= 1);\r
+ }\r
\r
-bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const { return metaParameter; }\r
-bool AudioProcessorValueTreeState::Parameter::isAutomatable() const { return automatable; }\r
-bool AudioProcessorValueTreeState::Parameter::isDiscrete() const { return discrete; }\r
-bool AudioProcessorValueTreeState::Parameter::isBoolean() const { return boolean; }\r
+ float getValue() const override { return range.convertTo0to1 (value); }\r
+ float getDefaultValue() const override { return range.convertTo0to1 (defaultValue); }\r
\r
-//==============================================================================\r
-class AudioProcessorValueTreeState::ParameterAdapter : private AudioProcessorParameter::Listener\r
-{\r
-private:\r
- using Listener = AudioProcessorValueTreeState::Listener;\r
-\r
-public:\r
- explicit ParameterAdapter (RangedAudioParameter& parameterIn)\r
- : parameter (parameterIn),\r
- // For legacy reasons, the unnormalised value should *not* be snapped on construction\r
- unnormalisedValue (getRange().convertFrom0to1 (parameter.getDefaultValue()))\r
+ float getValueForText (const String& text) const override\r
{\r
- parameter.addListener (this);\r
+ return range.convertTo0to1 (textToValueFunction != nullptr ? textToValueFunction (text)\r
+ : text.getFloatValue());\r
}\r
\r
- ~ParameterAdapter() noexcept { parameter.removeListener (this); }\r
+ String getText (float v, int length) const override\r
+ {\r
+ return valueToTextFunction != nullptr ? valueToTextFunction (range.convertFrom0to1 (v))\r
+ : AudioProcessorParameter::getText (v, length);\r
+ }\r
\r
- void addListener (Listener* l) { listeners.add (l); }\r
- void removeListener (Listener* l) { listeners.remove (l); }\r
+ int getNumSteps() const override\r
+ {\r
+ if (range.interval > 0)\r
+ return (static_cast<int> ((range.end - range.start) / range.interval) + 1);\r
\r
- RangedAudioParameter& getParameter() { return parameter; }\r
- const RangedAudioParameter& getParameter() const { return parameter; }\r
+ return AudioProcessor::getDefaultNumParameterSteps();\r
+ }\r
\r
- const NormalisableRange<float>& getRange() const { return parameter.getNormalisableRange(); }\r
+ void setValue (float newValue) override\r
+ {\r
+ newValue = range.snapToLegalValue (range.convertFrom0to1 (newValue));\r
\r
- float getDenormalisedDefaultValue() const { return denormalise (parameter.getDefaultValue()); }\r
+ if (value != newValue || listenersNeedCalling)\r
+ {\r
+ value = newValue;\r
\r
- void setDenormalisedValue (float value)\r
- {\r
- if (value == unnormalisedValue)\r
- return;\r
+ listeners.call ([=] (AudioProcessorValueTreeState::Listener& l) { l.parameterChanged (paramID, value); });\r
+ listenersNeedCalling = false;\r
\r
- setNormalisedValue (normalise (value));\r
+ needsUpdate = true;\r
+ }\r
}\r
\r
- float getDenormalisedValueForText (const String& text) const\r
+ void setNewState (const ValueTree& v)\r
{\r
- return denormalise (parameter.getValueForText (text));\r
+ state = v;\r
+ updateFromValueTree();\r
}\r
\r
- String getTextForDenormalisedValue (float value) const\r
+ void setUnnormalisedValue (float newUnnormalisedValue)\r
{\r
- return parameter.getText (normalise (value), 0);\r
+ if (value != newUnnormalisedValue)\r
+ {\r
+ const float newValue = range.convertTo0to1 (newUnnormalisedValue);\r
+ setValueNotifyingHost (newValue);\r
+ }\r
}\r
\r
- float getDenormalisedValue() const { return unnormalisedValue; }\r
- float& getRawDenormalisedValue() { return unnormalisedValue; }\r
-\r
- bool flushToTree (ValueTree tree, const Identifier& key, UndoManager* um)\r
+ void updateFromValueTree()\r
{\r
- auto needsUpdateTestValue = true;\r
-\r
- if (! needsUpdate.compare_exchange_strong (needsUpdateTestValue, false))\r
- return false;\r
+ setUnnormalisedValue (state.getProperty (owner.valuePropertyID, defaultValue));\r
+ }\r
\r
- if (auto valueProperty = tree.getPropertyPointer (key))\r
+ void copyValueToValueTree()\r
+ {\r
+ if (auto* valueProperty = state.getPropertyPointer (owner.valuePropertyID))\r
{\r
- if ((float) *valueProperty != unnormalisedValue)\r
+ if ((float) *valueProperty != value)\r
{\r
ScopedValueSetter<bool> svs (ignoreParameterChangedCallbacks, true);\r
- tree.setProperty (key, unnormalisedValue, um);\r
+ state.setProperty (owner.valuePropertyID, value, owner.undoManager);\r
}\r
}\r
else\r
{\r
- tree.setProperty (key, unnormalisedValue, nullptr);\r
+ state.setProperty (owner.valuePropertyID, value, nullptr);\r
}\r
-\r
- return true;\r
- }\r
-\r
-private:\r
- void parameterGestureChanged (int, bool) override {}\r
-\r
- void parameterValueChanged (int, float) override\r
- {\r
- const auto newValue = denormalise (parameter.getValue());\r
-\r
- if (unnormalisedValue == newValue && ! listenersNeedCalling)\r
- return;\r
-\r
- unnormalisedValue = newValue;\r
- listeners.call ([=](Listener& l) { l.parameterChanged (parameter.paramID, unnormalisedValue); });\r
- listenersNeedCalling = false;\r
- needsUpdate = true;\r
- }\r
-\r
- float denormalise (float normalised) const\r
- {\r
- return getParameter().convertFrom0to1 (normalised);\r
- }\r
-\r
- float normalise (float denormalised) const\r
- {\r
- return getParameter().convertTo0to1 (denormalised);\r
}\r
\r
- void setNormalisedValue (float value)\r
+ void valueTreePropertyChanged (ValueTree&, const Identifier& property) override\r
{\r
if (ignoreParameterChangedCallbacks)\r
return;\r
\r
- parameter.setValueNotifyingHost (value);\r
+ if (property == owner.valuePropertyID)\r
+ updateFromValueTree();\r
}\r
\r
- RangedAudioParameter& parameter;\r
- ListenerList<Listener> listeners;\r
- float unnormalisedValue{};\r
- std::atomic<bool> needsUpdate { true };\r
- bool listenersNeedCalling { true }, ignoreParameterChangedCallbacks { false };\r
-};\r
+ void valueTreeChildAdded (ValueTree&, ValueTree&) override {}\r
+ void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override {}\r
+ void valueTreeChildOrderChanged (ValueTree&, int, int) override {}\r
+ void valueTreeParentChanged (ValueTree&) override {}\r
\r
-//==============================================================================\r
-AudioProcessorValueTreeState::AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo,\r
- UndoManager* undoManagerToUse,\r
- const juce::Identifier& valueTreeType,\r
- ParameterLayout parameterLayout)\r
- : AudioProcessorValueTreeState (processorToConnectTo, undoManagerToUse)\r
-{\r
- struct PushBackVisitor : ParameterLayout::Visitor\r
+ static Parameter* getParameterForID (AudioProcessor& processor, StringRef paramID) noexcept\r
{\r
- explicit PushBackVisitor (AudioProcessorValueTreeState& stateIn)\r
- : state (&stateIn) {}\r
-\r
- void visit (std::unique_ptr<RangedAudioParameter> param) const override\r
- {\r
- if (param == nullptr)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- state->parameters.emplace_back (std::make_unique<ParameterAdapter> (*param));\r
- state->processor.addParameter (param.release());\r
- }\r
-\r
- void visit (std::unique_ptr<AudioProcessorParameterGroup> group) const override\r
+ for (auto* ap : processor.getParameters())\r
{\r
- if (group == nullptr)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
+ // When using this class, you must allow it to manage all the parameters in your AudioProcessor, and\r
+ // not add any parameter objects of other types!\r
+ jassert (dynamic_cast<Parameter*> (ap) != nullptr);\r
\r
- for (const auto param : group->getParameters (true))\r
- {\r
- if (const auto rangedParam = dynamic_cast<RangedAudioParameter*> (param))\r
- {\r
- state->parameters.emplace_back (std::make_unique<ParameterAdapter> (*rangedParam));\r
- }\r
- else\r
- {\r
- // If you hit this assertion then you are attempting to add a parameter that is\r
- // not derived from RangedAudioParameter to the AudioProcessorValueTreeState.\r
- jassertfalse;\r
- }\r
- }\r
+ auto* p = static_cast<Parameter*> (ap);\r
\r
- state->processor.addParameterGroup (move (group));\r
+ if (paramID == p->paramID)\r
+ return p;\r
}\r
\r
- AudioProcessorValueTreeState* state;\r
- };\r
+ return nullptr;\r
+ }\r
\r
- for (auto& item : parameterLayout.parameters)\r
- item->accept (PushBackVisitor (*this));\r
+ bool isMetaParameter() const override { return isMetaParam; }\r
+ bool isAutomatable() const override { return isAutomatableParam; }\r
+ bool isDiscrete() const override { return isDiscreteParam; }\r
+ bool isBoolean() const override { return isBooleanParam; }\r
\r
- state = ValueTree (valueTreeType);\r
-}\r
+ AudioProcessorValueTreeState& owner;\r
+ ValueTree state;\r
+ ListenerList<AudioProcessorValueTreeState::Listener> listeners;\r
+ std::function<String (float)> valueToTextFunction;\r
+ std::function<float (const String&)> textToValueFunction;\r
+ NormalisableRange<float> range;\r
+ float value, defaultValue;\r
+ std::atomic<bool> needsUpdate { true };\r
+ bool listenersNeedCalling;\r
+ const bool isMetaParam, isAutomatableParam, isDiscreteParam, isBooleanParam;\r
+ bool ignoreParameterChangedCallbacks = false;\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Parameter)\r
+};\r
\r
+//==============================================================================\r
AudioProcessorValueTreeState::AudioProcessorValueTreeState (AudioProcessor& p, UndoManager* um)\r
: processor (p), undoManager (um)\r
{\r
\r
AudioProcessorValueTreeState::~AudioProcessorValueTreeState() {}\r
\r
-//==============================================================================\r
-RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (const String& paramID,\r
- const String& paramName,\r
- const String& labelText,\r
- NormalisableRange<float> range,\r
- float defaultVal,\r
- std::function<String (float)> valueToTextFunction,\r
- std::function<float (const String&)> textToValueFunction,\r
- bool isMetaParameter,\r
- bool isAutomatableParameter,\r
- bool isDiscreteParameter,\r
- AudioProcessorParameter::Category category,\r
- bool isBooleanParameter)\r
-{\r
- return createAndAddParameter (std::make_unique<Parameter> (paramID,\r
- paramName,\r
- labelText,\r
- range,\r
- defaultVal,\r
- std::move (valueToTextFunction),\r
- std::move (textToValueFunction),\r
- isMetaParameter,\r
- isAutomatableParameter,\r
- isDiscreteParameter,\r
- category,\r
- isBooleanParameter));\r
-}\r
-\r
-RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (std::unique_ptr<RangedAudioParameter> param)\r
+AudioProcessorParameterWithID* AudioProcessorValueTreeState::createAndAddParameter (const String& paramID, const String& paramName,\r
+ const String& labelText, NormalisableRange<float> r,\r
+ float defaultVal, std::function<String (float)> valueToTextFunction,\r
+ std::function<float (const String&)> textToValueFunction,\r
+ bool isMetaParameter,\r
+ bool isAutomatableParameter,\r
+ bool isDiscreteParameter,\r
+ AudioProcessorParameter::Category category,\r
+ bool isBooleanParameter)\r
{\r
// All parameters must be created before giving this manager a ValueTree state!\r
jassert (! state.isValid());\r
\r
- if (getParameter (param->paramID) != nullptr)\r
- return nullptr;\r
-\r
- parameters.emplace_back (std::make_unique<ParameterAdapter> (*param));\r
- processor.addParameter (param.get());\r
-\r
- return param.release();\r
-}\r
-\r
-//==============================================================================\r
-AudioProcessorValueTreeState::ParameterAdapter* AudioProcessorValueTreeState::getParameterAdapter (StringRef paramID) const\r
-{\r
- auto it = find_if (std::begin (parameters), std::end (parameters),\r
- [&](const std::unique_ptr<ParameterAdapter>& p) { return p->getParameter().paramID == paramID; });\r
- return it == std::end (parameters) ? nullptr : it->get();\r
+ Parameter* p = new Parameter (*this, paramID, paramName, labelText, r,\r
+ defaultVal, valueToTextFunction, textToValueFunction,\r
+ isMetaParameter, isAutomatableParameter,\r
+ isDiscreteParameter, category, isBooleanParameter);\r
+ processor.addParameter (p);\r
+ return p;\r
}\r
\r
void AudioProcessorValueTreeState::addParameterListener (StringRef paramID, Listener* listener)\r
{\r
- if (auto* p = getParameterAdapter (paramID))\r
- p->addListener (listener);\r
+ if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+ p->listeners.add (listener);\r
}\r
\r
void AudioProcessorValueTreeState::removeParameterListener (StringRef paramID, Listener* listener)\r
{\r
- if (auto* p = getParameterAdapter (paramID))\r
- p->removeListener (listener);\r
+ if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+ p->listeners.remove (listener);\r
}\r
\r
Value AudioProcessorValueTreeState::getParameterAsValue (StringRef paramID) const\r
{\r
- auto v = getChildValueTree (paramID);\r
-\r
- if (v.isValid())\r
- return v.getPropertyAsValue (valuePropertyID, undoManager);\r
+ if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+ return p->state.getPropertyAsValue (valuePropertyID, undoManager);\r
\r
return {};\r
}\r
\r
NormalisableRange<float> AudioProcessorValueTreeState::getParameterRange (StringRef paramID) const noexcept\r
{\r
- if (auto* p = getParameterAdapter (paramID))\r
- return p->getRange();\r
+ if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+ return p->range;\r
\r
- return {};\r
+ return NormalisableRange<float>();\r
}\r
\r
-RangedAudioParameter* AudioProcessorValueTreeState::getParameter (StringRef paramID) const noexcept\r
+AudioProcessorParameterWithID* AudioProcessorValueTreeState::getParameter (StringRef paramID) const noexcept\r
{\r
- if (auto adapter = getParameterAdapter (paramID))\r
- return &adapter->getParameter();\r
-\r
- return nullptr;\r
+ return Parameter::getParameterForID (processor, paramID);\r
}\r
\r
float* AudioProcessorValueTreeState::getRawParameterValue (StringRef paramID) const noexcept\r
{\r
- if (auto* p = getParameterAdapter (paramID))\r
- return &p->getRawDenormalisedValue();\r
+ if (Parameter* p = Parameter::getParameterForID (processor, paramID))\r
+ return &(p->value);\r
\r
return nullptr;\r
}\r
ValueTree AudioProcessorValueTreeState::copyState()\r
{\r
ScopedLock lock (valueTreeChanging);\r
+\r
flushParameterValuesToValueTree();\r
+\r
return state.createCopy();\r
}\r
\r
undoManager->clearUndoHistory();\r
}\r
\r
-ValueTree AudioProcessorValueTreeState::getChildValueTree (const String& paramID) const\r
-{\r
- return { state.getChildWithProperty (idPropertyID, paramID) };\r
-}\r
-\r
ValueTree AudioProcessorValueTreeState::getOrCreateChildValueTree (const String& paramID)\r
{\r
- auto v = getChildValueTree (paramID);\r
+ ValueTree v (state.getChildWithProperty (idPropertyID, paramID));\r
\r
if (! v.isValid())\r
{\r
return v;\r
}\r
\r
-void AudioProcessorValueTreeState::setNewState (ParameterAdapter& p)\r
-{\r
- const auto tree = getOrCreateChildValueTree (p.getParameter().paramID);\r
- p.setDenormalisedValue (tree.getProperty (valuePropertyID, p.getDenormalisedDefaultValue()));\r
-}\r
-\r
void AudioProcessorValueTreeState::updateParameterConnectionsToChildTrees()\r
{\r
ScopedLock lock (valueTreeChanging);\r
\r
- for (const auto& p : parameters)\r
- setNewState (*p);\r
+ for (auto* param : processor.getParameters())\r
+ {\r
+ jassert (dynamic_cast<Parameter*> (param) != nullptr);\r
+ auto* p = static_cast<Parameter*> (param);\r
+\r
+ p->setNewState (getOrCreateChildValueTree (p->paramID));\r
+ }\r
}\r
\r
void AudioProcessorValueTreeState::valueTreePropertyChanged (ValueTree& tree, const Identifier& property)\r
{\r
- if (! (tree.hasType (valueType) && tree.getParent() == state))\r
- return;\r
-\r
- if (property == idPropertyID)\r
+ if (property == idPropertyID && tree.hasType (valueType) && tree.getParent() == state)\r
updateParameterConnectionsToChildTrees();\r
- else if (property == valuePropertyID)\r
- if (auto adapter = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
- adapter->setDenormalisedValue (tree.getProperty (valuePropertyID));\r
}\r
\r
void AudioProcessorValueTreeState::valueTreeChildAdded (ValueTree& parent, ValueTree& tree)\r
{\r
if (parent == state && tree.hasType (valueType))\r
- if (auto* param = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
- setNewState (*param);\r
+ if (auto* param = Parameter::getParameterForID (processor, tree.getProperty (idPropertyID).toString()))\r
+ param->setNewState (getOrCreateChildValueTree (param->paramID));\r
}\r
\r
void AudioProcessorValueTreeState::valueTreeChildRemoved (ValueTree& parent, ValueTree& tree, int)\r
{\r
if (parent == state && tree.hasType (valueType))\r
- if (auto* param = getParameterAdapter (tree.getProperty (idPropertyID).toString()))\r
- setNewState (*param);\r
+ if (auto* param = Parameter::getParameterForID (processor, tree.getProperty (idPropertyID).toString()))\r
+ param->setNewState (getOrCreateChildValueTree (param->paramID));\r
}\r
\r
void AudioProcessorValueTreeState::valueTreeRedirected (ValueTree& v)\r
{\r
ScopedLock lock (valueTreeChanging);\r
\r
- bool anyUpdated = false;\r
+ bool anythingUpdated = false;\r
+\r
+ for (auto* ap : processor.getParameters())\r
+ {\r
+ jassert (dynamic_cast<Parameter*> (ap) != nullptr);\r
+ auto* p = static_cast<Parameter*> (ap);\r
\r
- for (auto& p : parameters)\r
- anyUpdated |= p->flushToTree (getChildValueTree (p->getParameter().paramID),\r
- valuePropertyID,\r
- undoManager);\r
+ bool needsUpdateTestValue = true;\r
+\r
+ if (p->needsUpdate.compare_exchange_strong (needsUpdateTestValue, false))\r
+ {\r
+ p->copyValueToValueTree();\r
+ anythingUpdated = true;\r
+ }\r
+ }\r
\r
- return anyUpdated;\r
+ return anythingUpdated;\r
}\r
\r
void AudioProcessorValueTreeState::timerCallback()\r
: jlimit (50, 500, getTimerInterval() + 20));\r
}\r
\r
+AudioProcessorValueTreeState::Listener::Listener() {}\r
+AudioProcessorValueTreeState::Listener::~Listener() {}\r
+\r
//==============================================================================\r
struct AttachedControlBase : public AudioProcessorValueTreeState::Listener,\r
public AsyncUpdater\r
state.removeParameterListener (paramID, this);\r
}\r
\r
- void setNewDenormalisedValue (float newDenormalisedValue)\r
+ void setNewUnnormalisedValue (float newUnnormalisedValue)\r
{\r
- if (auto* p = state.getParameter (paramID))\r
+ if (AudioProcessorParameter* p = state.getParameter (paramID))\r
{\r
const float newValue = state.getParameterRange (paramID)\r
- .convertTo0to1 (newDenormalisedValue);\r
+ .convertTo0to1 (newUnnormalisedValue);\r
\r
if (p->getValue() != newValue)\r
p->setValueNotifyingHost (newValue);\r
\r
void sendInitialUpdate()\r
{\r
- if (auto* v = state.getRawParameterValue (paramID))\r
+ if (float* v = state.getRawParameterValue (paramID))\r
parameterChanged (paramID, *v);\r
}\r
\r
\r
void beginParameterChange()\r
{\r
- if (auto* p = state.getParameter (paramID))\r
+ if (AudioProcessorParameter* p = state.getParameter (paramID))\r
{\r
if (state.undoManager != nullptr)\r
state.undoManager->beginNewTransaction();\r
{\r
NormalisableRange<float> range (state.getParameterRange (paramID));\r
\r
- if (auto* param = state.getParameterAdapter (paramID))\r
- {\r
- slider.valueFromTextFunction = [param](const String& text) { return (double) param->getDenormalisedValueForText (text); };\r
- slider.textFromValueFunction = [param](double value) { return param->getTextForDenormalisedValue ((float) value); };\r
- slider.setDoubleClickReturnValue (true, range.convertFrom0to1 (param->getParameter().getDefaultValue()));\r
- }\r
-\r
- if (range.interval != 0.0f || range.skew != 1.0f)\r
+ if (range.interval != 0 || range.skew != 0)\r
{\r
slider.setRange (range.start, range.end, range.interval);\r
slider.setSkewFactor (range.skew, range.symmetricSkew);\r
}\r
else\r
{\r
- auto convertFrom0To1Function = [range](double currentRangeStart,\r
- double currentRangeEnd,\r
- double normalisedValue) mutable\r
+ auto convertFrom0To1Function = [range] (double currentRangeStart,\r
+ double currentRangeEnd,\r
+ double normalisedValue) mutable\r
{\r
range.start = (float) currentRangeStart;\r
range.end = (float) currentRangeEnd;\r
return (double) range.convertFrom0to1 ((float) normalisedValue);\r
};\r
\r
- auto convertTo0To1Function = [range](double currentRangeStart,\r
- double currentRangeEnd,\r
- double mappedValue) mutable\r
+ auto convertTo0To1Function = [range] (double currentRangeStart,\r
+ double currentRangeEnd,\r
+ double mappedValue) mutable\r
{\r
range.start = (float) currentRangeStart;\r
range.end = (float) currentRangeEnd;\r
return (double) range.convertTo0to1 ((float) mappedValue);\r
};\r
\r
- auto snapToLegalValueFunction = [range](double currentRangeStart,\r
- double currentRangeEnd,\r
- double valueToSnap) mutable\r
+ auto snapToLegalValueFunction = [range] (double currentRangeStart,\r
+ double currentRangeEnd,\r
+ double valueToSnap) mutable\r
{\r
range.start = (float) currentRangeStart;\r
range.end = (float) currentRangeEnd;\r
return (double) range.snapToLegalValue ((float) valueToSnap);\r
};\r
\r
- slider.setNormalisableRange ({ (double) range.start,\r
- (double) range.end,\r
+ slider.setNormalisableRange ({ (double) range.start, (double) range.end,\r
convertFrom0To1Function,\r
convertTo0To1Function,\r
snapToLegalValueFunction });\r
}\r
\r
+ if (auto* param = dynamic_cast<AudioProcessorValueTreeState::Parameter*> (state.getParameter (paramID)))\r
+ {\r
+ if (param->textToValueFunction != nullptr)\r
+ slider.valueFromTextFunction = [param] (const String& text) { return (double) param->textToValueFunction (text); };\r
+\r
+ if (param->valueToTextFunction != nullptr)\r
+ slider.textFromValueFunction = [param] (double value) { return param->valueToTextFunction ((float) value); };\r
+\r
+ slider.setDoubleClickReturnValue (true, range.convertFrom0to1 (param->getDefaultValue()));\r
+ }\r
+\r
sendInitialUpdate();\r
slider.addListener (this);\r
}\r
const ScopedLock selfCallbackLock (selfCallbackMutex);\r
\r
if ((! ignoreCallbacks) && (! ModifierKeys::currentModifiers.isRightButtonDown()))\r
- setNewDenormalisedValue ((float) s->getValue());\r
+ setNewUnnormalisedValue ((float) s->getValue());\r
}\r
\r
- void sliderDragStarted (Slider*) override { beginParameterChange(); }\r
- void sliderDragEnded (Slider*) override { endParameterChange(); }\r
+ void sliderDragStarted (Slider*) override { beginParameterChange(); }\r
+ void sliderDragEnded (Slider*) override { endParameterChange(); }\r
\r
Slider& slider;\r
bool ignoreCallbacks;\r
{\r
const ScopedLock selfCallbackLock (selfCallbackMutex);\r
\r
- if (state.getParameter (paramID) != nullptr)\r
{\r
- auto normValue = state.getParameterRange (paramID)\r
- .convertTo0to1 (newValue);\r
- auto index = roundToInt (normValue * (combo.getNumItems() - 1));\r
-\r
- if (index != combo.getSelectedItemIndex())\r
- {\r
- ScopedValueSetter<bool> svs (ignoreCallbacks, true);\r
- combo.setSelectedItemIndex (index, sendNotificationSync);\r
- }\r
+ ScopedValueSetter<bool> svs (ignoreCallbacks, true);\r
+ combo.setSelectedItemIndex (roundToInt (newValue), sendNotificationSync);\r
}\r
}\r
\r
- void comboBoxChanged (ComboBox*) override\r
+ void comboBoxChanged (ComboBox* comboBox) override\r
{\r
const ScopedLock selfCallbackLock (selfCallbackMutex);\r
\r
if (! ignoreCallbacks)\r
{\r
- if (auto* p = state.getParameter (paramID))\r
- {\r
- auto newValue = (float) combo.getSelectedItemIndex() / (combo.getNumItems() - 1);\r
-\r
- if (p->getValue() != newValue)\r
- {\r
- beginParameterChange();\r
- p->setValueNotifyingHost (newValue);\r
- endParameterChange();\r
- }\r
- }\r
+ beginParameterChange();\r
+ setNewUnnormalisedValue ((float) comboBox->getSelectedId() - 1.0f);\r
+ endParameterChange();\r
}\r
}\r
\r
if (! ignoreCallbacks)\r
{\r
beginParameterChange();\r
- setNewDenormalisedValue (b->getToggleState() ? 1.0f : 0.0f);\r
+ setNewUnnormalisedValue (b->getToggleState() ? 1.0f : 0.0f);\r
endParameterChange();\r
}\r
}\r
\r
AudioProcessorValueTreeState::ButtonAttachment::~ButtonAttachment() {}\r
\r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct ParameterAdapterTests final : public UnitTest\r
-{\r
- ParameterAdapterTests() : UnitTest ("Parameter Adapter") {}\r
-\r
- void runTest() override\r
- {\r
- beginTest ("The default value is returned correctly");\r
- {\r
- const auto test = [&] (NormalisableRange<float> range, float value)\r
- {\r
- AudioParameterFloat param ({}, {}, range, value, {});\r
-\r
- AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
- expectEquals (adapter.getDenormalisedDefaultValue(), value);\r
- };\r
-\r
- test ({ -100, 100 }, 0);\r
- test ({ -2.5, 12.5 }, 10);\r
- }\r
-\r
- beginTest ("Denormalised parameter values can be retrieved");\r
- {\r
- const auto test = [&](NormalisableRange<float> range, float value)\r
- {\r
- AudioParameterFloat param ({}, {}, range, {}, {});\r
- AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
- adapter.setDenormalisedValue (value);\r
-\r
- expectEquals (adapter.getDenormalisedValue(), value);\r
- expectEquals (adapter.getRawDenormalisedValue(), value);\r
- };\r
-\r
- test ({ -20, -10 }, -15);\r
- test ({ 0, 7.5 }, 2.5);\r
- }\r
-\r
- beginTest ("Floats can be converted to text");\r
- {\r
- const auto test = [&](NormalisableRange<float> range, float value, juce::String expected)\r
- {\r
- AudioParameterFloat param ({}, {}, range, {}, {});\r
- AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
- expectEquals (adapter.getTextForDenormalisedValue (value), expected);\r
- };\r
-\r
- test ({ -100, 100 }, 0, "0.0");\r
- test ({ -2.5, 12.5 }, 10, "10.0");\r
- test ({ -20, -10 }, -15, "-15.0");\r
- test ({ 0, 7.5 }, 2.5, "2.5");\r
- }\r
-\r
- beginTest ("Text can be converted to floats");\r
- {\r
- const auto test = [&](NormalisableRange<float> range, juce::String text, float expected)\r
- {\r
- AudioParameterFloat param ({}, {}, range, {}, {});\r
- AudioProcessorValueTreeState::ParameterAdapter adapter (param);\r
-\r
- expectEquals (adapter.getDenormalisedValueForText (text), expected);\r
- };\r
-\r
- test ({ -100, 100 }, "0.0", 0);\r
- test ({ -2.5, 12.5 }, "10.0", 10);\r
- test ({ -20, -10 }, "-15.0", -15);\r
- test ({ 0, 7.5 }, "2.5", 2.5);\r
- }\r
- }\r
-} parameterAdapterTests;\r
-\r
-namespace\r
-{\r
-template <typename ValueType>\r
-inline bool operator== (const NormalisableRange<ValueType>& a,\r
- const NormalisableRange<ValueType>& b)\r
-{\r
- return std::tie (a.start, a.end, a.interval, a.skew, a.symmetricSkew)\r
- == std::tie (b.start, b.end, b.interval, b.skew, b.symmetricSkew);\r
-}\r
-\r
-template <typename ValueType>\r
-inline bool operator!= (const NormalisableRange<ValueType>& a,\r
- const NormalisableRange<ValueType>& b)\r
-{\r
- return ! (a == b);\r
-}\r
-} // namespace\r
-\r
-static class AudioProcessorValueTreeStateTests final : public UnitTest\r
-{\r
-private:\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- using ParameterGroup = AudioProcessorParameterGroup;\r
- using ParameterLayout = AudioProcessorValueTreeState::ParameterLayout;\r
-\r
- class TestAudioProcessor : public AudioProcessor\r
- {\r
- public:\r
- TestAudioProcessor() = default;\r
-\r
- explicit TestAudioProcessor (ParameterLayout layout)\r
- : state (*this, nullptr, "state", std::move (layout)) {}\r
-\r
- const String getName() const override { return {}; }\r
- void prepareToPlay (double, int) override {}\r
- void releaseResources() override {}\r
- void processBlock (AudioBuffer<float>&, MidiBuffer&) override {}\r
- double getTailLengthSeconds() const override { return {}; }\r
- bool acceptsMidi() const override { return {}; }\r
- bool producesMidi() const override { return {}; }\r
- AudioProcessorEditor* createEditor() override { return {}; }\r
- bool hasEditor() const override { return {}; }\r
- int getNumPrograms() override { return 1; }\r
- int getCurrentProgram() override { return {}; }\r
- void setCurrentProgram (int) override {}\r
- const String getProgramName (int) override { return {}; }\r
- void changeProgramName (int, const String&) override {}\r
- void getStateInformation (MemoryBlock&) override {}\r
- void setStateInformation (const void*, int) override {}\r
-\r
- AudioProcessorValueTreeState state { *this, nullptr };\r
- };\r
-\r
- struct Listener final : public AudioProcessorValueTreeState::Listener\r
- {\r
- void parameterChanged (const String& idIn, float valueIn) override\r
- {\r
- id = idIn;\r
- value = valueIn;\r
- }\r
-\r
- String id;\r
- float value{};\r
- };\r
-\r
-public:\r
- AudioProcessorValueTreeStateTests() : UnitTest ("Audio Processor Value Tree State", "AudioProcessor parameters") {}\r
-\r
- void runTest() override\r
- {\r
- ScopedJuceInitialiser_GUI scopedJuceInitialiser_gui;\r
-\r
- beginTest ("After calling createAndAddParameter, the number of parameters increases by one");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- proc.state.createAndAddParameter (std::make_unique<Parameter> (String(), String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
-\r
- expectEquals (proc.getParameters().size(), 1);\r
- }\r
-\r
- beginTest ("After creating a normal named parameter, we can later retrieve that parameter");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
-\r
- expect (proc.state.getParameter (key) == param);\r
- }\r
-\r
- beginTest ("After construction, the value tree has the expected format");\r
- {\r
- TestAudioProcessor proc ({\r
- std::make_unique<AudioProcessorParameterGroup> ("", "", "",\r
- std::make_unique<AudioParameterBool> ("a", "", false),\r
- std::make_unique<AudioParameterFloat> ("b", "", NormalisableRange<float>{}, 0.0f)),\r
- std::make_unique<AudioProcessorParameterGroup> ("", "", "",\r
- std::make_unique<AudioParameterInt> ("c", "", 0, 1, 0),\r
- std::make_unique<AudioParameterChoice> ("d", "", StringArray { "foo", "bar" }, 0)) });\r
-\r
- const auto valueTree = proc.state.copyState();\r
-\r
- expectEquals (valueTree.getNumChildren(), 4);\r
-\r
- for (auto child : valueTree)\r
- {\r
- expect (child.hasType ("PARAM"));\r
- expect (child.hasProperty ("id"));\r
- expect (child.hasProperty ("value"));\r
- }\r
- }\r
-\r
- beginTest ("Meta parameters can be created");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr, true));\r
-\r
- expect (param->isMetaParameter());\r
- }\r
-\r
- beginTest ("Automatable parameters can be created");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr, false, true));\r
-\r
- expect (param->isAutomatable());\r
- }\r
-\r
- beginTest ("Discrete parameters can be created");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr, false, false, true));\r
-\r
- expect (param->isDiscrete());\r
- }\r
-\r
- beginTest ("Custom category parameters can be created");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr, false, false, false,\r
- AudioProcessorParameter::Category::inputMeter));\r
-\r
- expect (param->category == AudioProcessorParameter::Category::inputMeter);\r
- }\r
-\r
- beginTest ("Boolean parameters can be created");\r
- {\r
- TestAudioProcessor proc;\r
-\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr, false, false, false,\r
- AudioProcessorParameter::Category::genericParameter, true));\r
-\r
- expect (param->isBoolean());\r
- }\r
-\r
- beginTest ("After creating a custom named parameter, we can later retrieve that parameter");\r
- {\r
- const auto key = "id";\r
- auto param = std::make_unique<AudioParameterBool> (key, "", false);\r
- const auto paramPtr = param.get();\r
-\r
- TestAudioProcessor proc (std::move (param));\r
-\r
- expect (proc.state.getParameter (key) == paramPtr);\r
- }\r
-\r
- beginTest ("After adding a normal parameter that already exists, the AudioProcessor parameters are unchanged");\r
- {\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
-\r
- proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
-\r
- expectEquals (proc.getParameters().size(), 1);\r
- expect (proc.getParameters().getFirst() == param);\r
- }\r
-\r
- beginTest ("After setting a parameter value, that value is reflected in the state");\r
- {\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
-\r
- const auto value = 0.5f;\r
- param->setValueNotifyingHost (value);\r
-\r
- expectEquals (*proc.state.getRawParameterValue (key), value);\r
- }\r
-\r
- beginTest ("After adding an APVTS::Parameter, its value is the default value");\r
- {\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- const auto value = 5.0f;\r
-\r
- proc.state.createAndAddParameter (std::make_unique<Parameter> (\r
- key,\r
- String(),\r
- String(),\r
- juce::NormalisableRange<float> (0.0f, 100.0f, 10.0f),\r
- value,\r
- nullptr,\r
- nullptr));\r
-\r
- expectEquals (*proc.state.getRawParameterValue (key), value);\r
- }\r
-\r
- beginTest ("Listeners receive notifications when parameters change");\r
- {\r
- Listener listener;\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- const auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
- proc.state.addParameterListener (key, &listener);\r
-\r
- const auto value = 0.5f;\r
- param->setValueNotifyingHost (value);\r
-\r
- expectEquals (listener.id, String { key });\r
- expectEquals (listener.value, value);\r
- }\r
-\r
- beginTest ("Bool parameters have a range of 0-1");\r
- {\r
- const auto key = "id";\r
-\r
- TestAudioProcessor proc (std::make_unique<AudioParameterBool> (key, "", false));\r
-\r
- expect (proc.state.getParameterRange (key) == NormalisableRange<float> (0.0f, 1.0f, 1.0f));\r
- }\r
-\r
- beginTest ("Float parameters retain their specified range");\r
- {\r
- const auto key = "id";\r
- const auto range = NormalisableRange<float> { -100, 100, 0.7f, 0.2f, true };\r
-\r
- TestAudioProcessor proc (std::make_unique<AudioParameterFloat> (key, "", range, 0.0f));\r
-\r
- expect (proc.state.getParameterRange (key) == range);\r
- }\r
-\r
- beginTest ("Int parameters retain their specified range");\r
- {\r
- const auto key = "id";\r
- const auto min = -27;\r
- const auto max = 53;\r
-\r
- TestAudioProcessor proc (std::make_unique<AudioParameterInt> (key, "", min, max, 0));\r
-\r
- expect (proc.state.getParameterRange (key) == NormalisableRange<float> (float (min), float (max)));\r
- }\r
-\r
- beginTest ("Choice parameters retain their specified range");\r
- {\r
- const auto key = "id";\r
- const auto choices = StringArray { "", "", "" };\r
-\r
- TestAudioProcessor proc (std::make_unique<AudioParameterChoice> (key, "", choices, 0));\r
-\r
- expect (proc.state.getParameterRange (key) == NormalisableRange<float> (0.0f, (float) (choices.size() - 1)));\r
- expect (proc.state.getParameter (key)->getNumSteps() == choices.size());\r
- }\r
-\r
- beginTest ("When the parameter value is changed, normal parameter values are updated");\r
- {\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- auto param = proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
- proc.state.state = ValueTree { "state" };\r
-\r
- const auto newValue = 0.75f;\r
- auto value = proc.state.getParameterAsValue (key);\r
- value = newValue;\r
-\r
- expectEquals (param->getValue(), newValue);\r
- expectEquals (*proc.state.getRawParameterValue (key), newValue);\r
- }\r
-\r
- beginTest ("When the parameter value is changed, custom parameter values are updated");\r
- {\r
- const auto key = "id";\r
- const auto choices = StringArray ("foo", "bar", "baz");\r
- auto param = std::make_unique<AudioParameterChoice> (key, "", choices, 0);\r
- const auto paramPtr = param.get();\r
- TestAudioProcessor proc (std::move (param));\r
-\r
- const auto newValue = 2.0f;\r
- auto value = proc.state.getParameterAsValue (key);\r
- value = newValue;\r
-\r
- expectEquals (paramPtr->getCurrentChoiceName(), choices[int (newValue)]);\r
- expectEquals (*proc.state.getRawParameterValue (key), newValue);\r
- }\r
-\r
- beginTest ("When the parameter value is changed, listeners are notified");\r
- {\r
- Listener listener;\r
- TestAudioProcessor proc;\r
- const auto key = "id";\r
- proc.state.createAndAddParameter (std::make_unique<Parameter> (key, String(), String(), NormalisableRange<float>(),\r
- 0.0f, nullptr, nullptr));\r
- proc.state.addParameterListener (key, &listener);\r
- proc.state.state = ValueTree { "state" };\r
-\r
- const auto newValue = 0.75f;\r
- proc.state.getParameterAsValue (key) = newValue;\r
-\r
- expectEquals (listener.value, newValue);\r
- expectEquals (listener.id, String { key });\r
- }\r
-\r
- beginTest ("When the parameter value is changed, listeners are notified");\r
- {\r
- const auto key = "id";\r
- const auto choices = StringArray { "foo", "bar", "baz" };\r
- Listener listener;\r
- TestAudioProcessor proc (std::make_unique<AudioParameterChoice> (key, "", choices, 0));\r
- proc.state.addParameterListener (key, &listener);\r
-\r
- const auto newValue = 2.0f;\r
- proc.state.getParameterAsValue (key) = newValue;\r
-\r
- expectEquals (listener.value, newValue);\r
- expectEquals (listener.id, String (key));\r
- }\r
- }\r
-} audioProcessorValueTreeStateTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
{\r
\r
/**\r
- This class contains a ValueTree that is used to manage an AudioProcessor's entire state.\r
+ This class contains a ValueTree which is used to manage an AudioProcessor's entire state.\r
\r
- It has its own internal class of parameter object that is linked to values\r
+ It has its own internal class of parameter object which are linked to values\r
within its ValueTree, and which are each identified by a string ID.\r
\r
You can get access to the underlying ValueTree object via the state member variable,\r
It also provides some utility child classes for connecting parameters directly to\r
GUI controls like sliders.\r
\r
- The favoured constructor of this class takes a collection of RangedAudioParameters or\r
- AudioProcessorParameterGroups of RangedAudioParameters and adds them to the attached\r
- AudioProcessor directly.\r
-\r
- The deprecated way of using this class is as follows:\r
-\r
+ To use:\r
1) Create an AudioProcessorValueTreeState, and give it some parameters using createAndAddParameter().\r
2) Initialise the state member variable with a type name.\r
\r
- The deprecated constructor will be removed from the API in a future version of JUCE!\r
-\r
@tags{Audio}\r
*/\r
-class JUCE_API AudioProcessorValueTreeState : private Timer,\r
+class JUCE_API AudioProcessorValueTreeState : private Timer,\r
private ValueTree::Listener\r
{\r
public:\r
- //==============================================================================\r
- /** A class to contain a set of RangedAudioParameters and AudioProcessorParameterGroups\r
- containing RangedAudioParameters.\r
-\r
- This class is used in the AudioProcessorValueTreeState constructor to allow\r
- arbitrarily grouped RangedAudioParameters to be passed to an AudioProcessor.\r
- */\r
- class JUCE_API ParameterLayout final\r
- {\r
- private:\r
- //==============================================================================\r
- template <typename It>\r
- using ValidIfIterator = decltype (std::next (std::declval<It>()));\r
-\r
- public:\r
- //==============================================================================\r
- template <typename... Items>\r
- ParameterLayout (std::unique_ptr<Items>... items) { add (std::move (items)...); }\r
-\r
- template <typename It, typename = ValidIfIterator<It>>\r
- ParameterLayout (It begin, It end) { add (begin, end); }\r
-\r
- template <typename... Items>\r
- void add (std::unique_ptr<Items>... items)\r
- {\r
- parameters.reserve (parameters.size() + sizeof... (items));\r
-\r
- // We can replace this with some nicer code once generic lambdas become available. A\r
- // sequential context like an array initialiser is required to ensure we get the correct\r
- // order from the parameter pack.\r
- int unused[] { (parameters.emplace_back (MakeContents() (std::move (items))), 0)... };\r
- ignoreUnused (unused);\r
- }\r
-\r
- template <typename It, typename = ValidIfIterator<It>>\r
- void add (It begin, It end)\r
- {\r
- parameters.reserve (parameters.size() + std::size_t (std::distance (begin, end)));\r
- std::transform (std::make_move_iterator (begin),\r
- std::make_move_iterator (end),\r
- std::back_inserter (parameters),\r
- MakeContents());\r
- }\r
-\r
- ParameterLayout (const ParameterLayout& other) = delete;\r
- ParameterLayout (ParameterLayout&& other) noexcept { swap (other); }\r
-\r
- ParameterLayout& operator= (const ParameterLayout& other) = delete;\r
- ParameterLayout& operator= (ParameterLayout&& other) noexcept { swap (other); return *this; }\r
-\r
- void swap (ParameterLayout& other) noexcept { std::swap (other.parameters, parameters); }\r
+ /** Creates a state object for a given processor.\r
\r
- private:\r
- //==============================================================================\r
- struct Visitor\r
- {\r
- virtual ~Visitor() = default;\r
-\r
- // If you have a compiler error telling you that there is no matching\r
- // member function to call for 'visit', then you are probably attempting\r
- // to add a parameter that is not derived from RangedAudioParameter to\r
- // the AudioProcessorValueTreeState.\r
- virtual void visit (std::unique_ptr<RangedAudioParameter>) const = 0;\r
- virtual void visit (std::unique_ptr<AudioProcessorParameterGroup>) const = 0;\r
- };\r
-\r
- struct ParameterStorageBase\r
- {\r
- virtual ~ParameterStorageBase() = default;\r
- virtual void accept (const Visitor& visitor) = 0;\r
- };\r
-\r
- template <typename Contents>\r
- struct ParameterStorage : ParameterStorageBase\r
- {\r
- explicit ParameterStorage (std::unique_ptr<Contents> input) : contents (std::move (input)) {}\r
-\r
- void accept (const Visitor& visitor) override { visitor.visit (std::move (contents)); }\r
-\r
- std::unique_ptr<Contents> contents;\r
- };\r
-\r
- struct MakeContents final\r
- {\r
- template <typename Item>\r
- std::unique_ptr<ParameterStorageBase> operator() (std::unique_ptr<Item> item) const\r
- {\r
- return std::unique_ptr<ParameterStorageBase> (new ParameterStorage<Item> (std::move (item)));\r
- }\r
- };\r
-\r
- void add() {}\r
-\r
- friend class AudioProcessorValueTreeState;\r
-\r
- std::vector<std::unique_ptr<ParameterStorageBase>> parameters;\r
- };\r
-\r
- //==============================================================================\r
- /** Creates a state object for a given processor, and sets up all the parameters\r
- that will control that processor.\r
-\r
- You should *not* assign a new ValueTree to the state, or call\r
- createAndAddParameter, after using this constructor.\r
-\r
- Note that each AudioProcessorValueTreeState should be attached to only one\r
- processor, and must have the same lifetime as the processor, as they will\r
- have dependencies on each other.\r
-\r
- The ParameterLayout parameter has a set of constructors that allow you to\r
- add multiple RangedAudioParameters and AudioProcessorParameterGroups containing\r
- RangedAudioParameters to the AudioProcessorValueTreeState inside this constructor.\r
-\r
- @code\r
- YourAudioProcessor()\r
- : apvts (*this, &undoManager, "PARAMETERS",\r
- { std::make_unique<AudioParameterFloat> ("a", "Parameter A", NormalisableRange<float> (-100.0f, 100.0f), 0),\r
- std::make_unique<AudioParameterInt> ("b", "Parameter B", 0, 5, 2) })\r
- @endcode\r
-\r
- To add parameters programatically you can use the iterator-based ParameterLayout\r
- constructor:\r
-\r
- @code\r
- AudioProcessorValueTreeState::ParameterLayout createParameterLayout()\r
- {\r
- std::vector<std::unique_ptr<AudioParameterInt>> params;\r
-\r
- for (int i = 1; i < 9; ++i)\r
- params.push_back (std::make_unique<AudioParameterInt> (String (i), String (i), 0, i, 0));\r
-\r
- return { params.begin(), params.end() };\r
- }\r
-\r
- YourAudioProcessor()\r
- : apvts (*this, &undoManager, "PARAMETERS", createParameterLayout())\r
- {\r
- }\r
- @endcode\r
-\r
- @param processorToConnectTo The Processor that will be managed by this object\r
- @param undoManagerToUse An optional UndoManager to use; pass nullptr if no UndoManager is required\r
- @param valueTreeType The identifier used to initialise the internal ValueTree\r
- @param parameterLayout An object that holds all parameters and parameter groups that the\r
- AudioProcessor should use.\r
+ The UndoManager is optional and can be a nullptr.\r
+ After creating your state object, you should add parameters with the\r
+ createAndAddParameter() method. Note that each AudioProcessorValueTreeState\r
+ should be attached to only one processor, and must have the same lifetime as the\r
+ processor, as they will have dependencies on each other.\r
*/\r
AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo,\r
- UndoManager* undoManagerToUse,\r
- const juce::Identifier& valueTreeType,\r
- ParameterLayout parameterLayout);\r
-\r
- /** This constructor is discouraged and will be deprecated in a future version of JUCE!\r
- Use the other constructor instead.\r
-\r
- Creates a state object for a given processor.\r
-\r
- The UndoManager is optional and can be a nullptr. After creating your state object,\r
- you should add parameters with the createAndAddParameter() method. Note that each\r
- AudioProcessorValueTreeState should be attached to only one processor, and must have\r
- the same lifetime as the processor, as they will have dependencies on each other.\r
- */\r
- AudioProcessorValueTreeState (AudioProcessor& processorToConnectTo, UndoManager* undoManagerToUse);\r
+ UndoManager* undoManagerToUse);\r
\r
/** Destructor. */\r
~AudioProcessorValueTreeState();\r
\r
- //==============================================================================\r
- /** This function is deprecated and will be removed in a future version of JUCE!\r
-\r
- Previous calls to\r
-\r
- @code\r
- createAndAddParameter (paramID1, paramName1, ...);\r
- @endcode\r
-\r
- can be replaced with\r
-\r
- @code\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- createAndAddParameter (std::make_unique<Parameter> (paramID1, paramName1, ...));\r
- @endcode\r
-\r
- However, a much better approach is to use the AudioProcessorValueTreeState\r
- constructor directly\r
-\r
- @code\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- YourAudioProcessor()\r
- : apvts (*this, &undoManager, "PARAMETERS", { std::make_unique<Parameter> (paramID1, paramName1, ...),\r
- std::make_unique<Parameter> (paramID2, paramName2, ...),\r
- ... })\r
- @endcode\r
-\r
- @see AudioProcessorValueTreeState::AudioProcessorValueTreeState\r
-\r
- This function creates and returns a new parameter object for controlling a\r
- parameter with the given ID.\r
+ /** Creates and returns a new parameter object for controlling a parameter\r
+ with the given ID.\r
\r
Calling this will create and add a special type of AudioProcessorParameter to the\r
AudioProcessor to which this state is attached.\r
+\r
+ @param parameterID A unique string ID for the new parameter\r
+ @param parameterName The name that the parameter will return from AudioProcessorParameter::getName()\r
+ @param labelText The label that the parameter will return from AudioProcessorParameter::getLabel()\r
+ @param valueRange A mapping that will be used to determine the value range which this parameter uses\r
+ @param defaultValue A default value for the parameter (in non-normalised units)\r
+ @param valueToTextFunction A function that will convert a non-normalised value to a string for the\r
+ AudioProcessorParameter::getText() method. This can be nullptr to use the\r
+ default implementation\r
+ @param textToValueFunction The inverse of valueToTextFunction\r
+ @param isMetaParameter Set this value to true if this should be a meta parameter\r
+ @param isAutomatableParameter Set this value to false if this parameter should not be automatable\r
+ @param isDiscrete Set this value to true to make this parameter take discrete values in a host.\r
+ @see AudioProcessorParameter::isDiscrete\r
+ @param category Which category the parameter should use.\r
+ @see AudioProcessorParameter::Category\r
+ @param isBoolean Set this value to true to make this parameter appear as a boolean toggle in\r
+ a hosts view of your plug-ins parameters\r
+ @see AudioProcessorParameter::isBoolean\r
+\r
+ @returns the parameter object that was created\r
*/\r
- JUCE_DEPRECATED (RangedAudioParameter* createAndAddParameter (const String& parameterID,\r
- const String& parameterName,\r
- const String& labelText,\r
- NormalisableRange<float> valueRange,\r
- float defaultValue,\r
- std::function<String (float)> valueToTextFunction,\r
- std::function<float (const String&)> textToValueFunction,\r
- bool isMetaParameter = false,\r
- bool isAutomatableParameter = true,\r
- bool isDiscrete = false,\r
- AudioProcessorParameter::Category category = AudioProcessorParameter::genericParameter,\r
- bool isBoolean = false));\r
-\r
- /** This function adds a parameter to the attached AudioProcessor and that parameter will\r
- be managed by this AudioProcessorValueTreeState object.\r
- */\r
- RangedAudioParameter* createAndAddParameter (std::unique_ptr<RangedAudioParameter> parameter);\r
+ AudioProcessorParameterWithID* createAndAddParameter (const String& parameterID,\r
+ const String& parameterName,\r
+ const String& labelText,\r
+ NormalisableRange<float> valueRange,\r
+ float defaultValue,\r
+ std::function<String (float)> valueToTextFunction,\r
+ std::function<float (const String&)> textToValueFunction,\r
+ bool isMetaParameter = false,\r
+ bool isAutomatableParameter = true,\r
+ bool isDiscrete = false,\r
+ AudioProcessorParameter::Category category\r
+ = AudioProcessorParameter::genericParameter,\r
+ bool isBoolean = false);\r
\r
- //==============================================================================\r
/** Returns a parameter by its ID string. */\r
- RangedAudioParameter* getParameter (StringRef parameterID) const noexcept;\r
+ AudioProcessorParameterWithID* getParameter (StringRef parameterID) const noexcept;\r
\r
/** Returns a pointer to a floating point representation of a particular\r
parameter which a realtime process can read to find out its current value.\r
*/\r
float* getRawParameterValue (StringRef parameterID) const noexcept;\r
\r
- //==============================================================================\r
/** A listener class that can be attached to an AudioProcessorValueTreeState.\r
Use AudioProcessorValueTreeState::addParameterListener() to register a callback.\r
*/\r
struct JUCE_API Listener\r
{\r
- virtual ~Listener() = default;\r
+ Listener();\r
+ virtual ~Listener();\r
\r
/** This callback method is called by the AudioProcessorValueTreeState when a parameter changes. */\r
virtual void parameterChanged (const String& parameterID, float newValue) = 0;\r
/** Removes a callback that was previously added with addParameterCallback(). */\r
void removeParameterListener (StringRef parameterID, Listener* listener);\r
\r
- //==============================================================================\r
/** Returns a Value object that can be used to control a particular parameter. */\r
Value getParameterAsValue (StringRef parameterID) const;\r
\r
/** Returns the range that was set when the given parameter was created. */\r
NormalisableRange<float> getParameterRange (StringRef parameterID) const noexcept;\r
\r
- //==============================================================================\r
/** Returns a copy of the state value tree.\r
\r
The AudioProcessorValueTreeState's ValueTree is updated internally on the\r
*/\r
void replaceState (const ValueTree& newState);\r
\r
- //==============================================================================\r
/** A reference to the processor with which this state is associated. */\r
AudioProcessor& processor;\r
\r
/** Provides access to the undo manager that this object is using. */\r
UndoManager* const undoManager;\r
\r
- //==============================================================================\r
- /** A parameter class that maintains backwards compatibility with deprecated\r
- AudioProcessorValueTreeState functionality.\r
-\r
- Previous calls to\r
-\r
- @code\r
- createAndAddParameter (paramID1, paramName1, ...);\r
- @endcode\r
-\r
- can be replaced with\r
-\r
- @code\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- createAndAddParameter (std::make_unique<Parameter> (paramID1, paramName1, ...));\r
- @endcode\r
-\r
- However, a much better approach is to use the AudioProcessorValueTreeState\r
- constructor directly\r
-\r
- @code\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- YourAudioProcessor()\r
- : apvts (*this, &undoManager, "PARAMETERS", { std::make_unique<Parameter> (paramID1, paramName1, ...),\r
- std::make_unique<Parameter> (paramID2, paramName2, ...),\r
- ... })\r
- @endcode\r
- */\r
- class Parameter final : public AudioParameterFloat\r
- {\r
- public:\r
- Parameter (const String& parameterID,\r
- const String& parameterName,\r
- const String& labelText,\r
- NormalisableRange<float> valueRange,\r
- float defaultValue,\r
- std::function<String(float)> valueToTextFunction,\r
- std::function<float(const String&)> textToValueFunction,\r
- bool isMetaParameter = false,\r
- bool isAutomatableParameter = true,\r
- bool isDiscrete = false,\r
- AudioProcessorParameter::Category category = AudioProcessorParameter::genericParameter,\r
- bool isBoolean = false);\r
-\r
- float getDefaultValue() const override;\r
- int getNumSteps() const override;\r
-\r
- bool isMetaParameter() const override;\r
- bool isAutomatable() const override;\r
- bool isDiscrete() const override;\r
- bool isBoolean() const override;\r
-\r
- private:\r
- const float unsnappedDefault;\r
- const bool metaParameter, automatable, discrete, boolean;\r
- };\r
-\r
//==============================================================================\r
/** An object of this class maintains a connection between a Slider and a parameter\r
in an AudioProcessorValueTreeState.\r
\r
private:\r
struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SliderAttachment)\r
};\r
/** An object of this class maintains a connection between a ComboBox and a parameter\r
in an AudioProcessorValueTreeState.\r
\r
- Combobox items will be spaced linearly across the range of the parameter. For\r
- example if the range is specified by NormalisableRange<float> (-0.5f, 0.5f, 0.5f)\r
- and you add three items then the first will be mapped to a value of -0.5, the\r
- second to 0, and the third to 0.5.\r
-\r
During the lifetime of this ComboBoxAttachment object, it keeps the two things in\r
sync, making it easy to connect a combo box to a parameter. When this object is\r
deleted, the connection is broken. Make sure that your AudioProcessorValueTreeState\r
\r
private:\r
struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComboBoxAttachment)\r
};\r
\r
private:\r
struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonAttachment)\r
};\r
\r
private:\r
//==============================================================================\r
- /** This method was introduced to allow you to use AudioProcessorValueTreeState parameters in\r
- an AudioProcessorParameterGroup, but there is now a much nicer way to achieve this.\r
-\r
- Code that looks like this\r
- @code\r
- auto paramA = apvts.createParameter ("a", "Parameter A", {}, { -100, 100 }, ...);\r
- auto paramB = apvts.createParameter ("b", "Parameter B", {}, { 0, 5 }, ...);\r
- addParameterGroup (std::make_unique<AudioProcessorParameterGroup> ("g1", "Group 1", " | ", std::move (paramA), std::move (paramB)));\r
- apvts.state = ValueTree (Identifier ("PARAMETERS"));\r
- @endcode\r
- can instead create the APVTS like this, avoiding the two-step initialization process and leveraging one of JUCE's\r
- pre-built parameter types (or your own custom type derived from RangedAudioParameter)\r
- @code\r
- using Parameter = AudioProcessorValueTreeState::Parameter;\r
- YourAudioProcessor()\r
- : apvts (*this, &undoManager, "PARAMETERS",\r
- { std::make_unique<AudioProcessorParameterGroup> ("g1", "Group 1", " | ",\r
- std::make_unique<Parameter> ("a", "Parameter A", "", NormalisableRange<float> (-100, 100), ...),\r
- std::make_unique<Parameter> ("b", "Parameter B", "", NormalisableRange<float> (0, 5), ...)) })\r
- @endcode\r
- */\r
- JUCE_DEPRECATED (std::unique_ptr<RangedAudioParameter> createParameter (const String&, const String&, const String&, NormalisableRange<float>,\r
- float, std::function<String (float)>, std::function<float (const String&)>,\r
- bool, bool, bool, AudioProcessorParameter::Category, bool));\r
-\r
- //==============================================================================\r
- class ParameterAdapter;\r
+ struct Parameter;\r
+ friend struct Parameter;\r
\r
- #if JUCE_UNIT_TESTS\r
- friend struct ParameterAdapterTests;\r
- #endif\r
-\r
- ParameterAdapter* getParameterAdapter (StringRef) const;\r
-\r
- ValueTree getChildValueTree (const String&) const;\r
ValueTree getOrCreateChildValueTree (const String&);\r
bool flushParameterValuesToValueTree();\r
- void setNewState (ParameterAdapter&);\r
void timerCallback() override;\r
\r
void valueTreePropertyChanged (ValueTree&, const Identifier&) override;\r
void valueTreeRedirected (ValueTree&) override;\r
void updateParameterConnectionsToChildTrees();\r
\r
- const Identifier valueType { "PARAM" }, valuePropertyID { "value" }, idPropertyID { "id" };\r
-\r
- std::vector<std::unique_ptr<ParameterAdapter>> parameters;\r
+ Identifier valueType { "PARAM" },\r
+ valuePropertyID { "value" },\r
+ idPropertyID { "id" };\r
\r
CriticalSection valueTreeChanging;\r
\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-/**\r
- This abstract base class is used by some AudioProcessorParameter helper classes.\r
-\r
- @see AudioParameterFloat, AudioParameterInt, AudioParameterBool, AudioParameterChoice\r
-\r
- @tags{Audio}\r
-*/\r
-class JUCE_API RangedAudioParameter : public AudioProcessorParameterWithID\r
-{\r
-public:\r
- /** The creation of this object requires providing a name and ID which will be\r
- constant for its lifetime.\r
- */\r
- RangedAudioParameter (const String& parameterID,\r
- const String& name,\r
- const String& label = {},\r
- Category category = AudioProcessorParameter::genericParameter)\r
- : AudioProcessorParameterWithID (parameterID, name, label, category) {}\r
-\r
- /** Returns the range of values that the parameter can take. */\r
- virtual const NormalisableRange<float>& getNormalisableRange() const = 0;\r
-\r
- /** Returns the number of steps for this parameter based on the normalisable range's interval.\r
- If you are using lambda functions to define the normalisable range's snapping behaviour\r
- then you should override this function so that it returns the number of snapping points.\r
- */\r
- int getNumSteps() const override\r
- {\r
- const auto& range = getNormalisableRange();\r
-\r
- if (range.interval > 0)\r
- return (static_cast<int> ((range.end - range.start) / range.interval) + 1);\r
-\r
- return AudioProcessor::getDefaultNumParameterSteps();\r
- }\r
-\r
- /** Normalises and snaps a value based on the normalisable range. */\r
- float convertTo0to1 (float v) const noexcept\r
- {\r
- const auto& range = getNormalisableRange();\r
- return range.convertTo0to1 (range.snapToLegalValue (v));\r
- }\r
-\r
- /** Denormalises and snaps a value based on the normalisable range. */\r
- float convertFrom0to1 (float v) const noexcept\r
- {\r
- const auto& range = getNormalisableRange();\r
- return range.snapToLegalValue (range.convertFrom0to1 (jlimit (0.0f, 1.0f, v)));\r
- }\r
-};\r
-\r
-} // namespace juce\r
AudioCDBurner (const int deviceIndex);\r
\r
class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDBurner)\r
\r
if (usingCustomDeviceManager && xml == nullptr)\r
{\r
- auto setup = deviceManager.getAudioDeviceSetup();\r
+ AudioDeviceManager::AudioDeviceSetup setup;\r
+ deviceManager.getAudioDeviceSetup (setup);\r
\r
if (setup.inputChannels.countNumberOfSetBits() != numInputChannels\r
- || setup.outputChannels.countNumberOfSetBits() != numOutputChannels)\r
+ || setup.outputChannels.countNumberOfSetBits() != numOutputChannels)\r
{\r
setup.inputChannels.clear();\r
setup.outputChannels.clear();\r
\r
void updateConfig (bool updateOutputDevice, bool updateInputDevice, bool updateSampleRate, bool updateBufferSize)\r
{\r
- auto config = setup.manager->getAudioDeviceSetup();\r
+ AudioDeviceManager::AudioDeviceSetup config;\r
+ setup.manager->getAudioDeviceSetup (config);\r
String error;\r
\r
if (updateOutputDevice || updateInputDevice)\r
\r
auto item = items[row];\r
bool enabled = false;\r
- auto config = setup.manager->getAudioDeviceSetup();\r
+\r
+ AudioDeviceManager::AudioDeviceSetup config;\r
+ setup.manager->getAudioDeviceSetup (config);\r
\r
if (setup.useStereoPairs)\r
{\r
\r
if (isPositiveAndBelow (row, items.size()))\r
{\r
- auto config = setup.manager->getAudioDeviceSetup();\r
+ AudioDeviceManager::AudioDeviceSetup config;\r
+ setup.manager->getAudioDeviceSetup (config);\r
\r
if (setup.useStereoPairs)\r
{\r
const bool hideAdvancedOptionsWithButton;\r
\r
class MidiInputSelectorComponentListBox;\r
+ friend struct ContainerDeletePolicy<MidiInputSelectorComponentListBox>;\r
std::unique_ptr<MidiInputSelectorComponentListBox> midiInputsList;\r
std::unique_ptr<ComboBox> midiOutputSelector;\r
std::unique_ptr<Label> midiInputsLabel, midiOutputLabel;\r
//==============================================================================\r
bool AudioThumbnail::setDataSource (LevelDataSource* newSource)\r
{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
numSamplesFinished = 0;\r
\r
class ThumbData;\r
class CachedWindow;\r
\r
+ friend class LevelDataSource;\r
+ friend class ThumbData;\r
+ friend class CachedWindow;\r
+ friend struct ContainerDeletePolicy<LevelDataSource>;\r
+ friend struct ContainerDeletePolicy<ThumbData>;\r
+ friend struct ContainerDeletePolicy<CachedWindow>;\r
+\r
std::unique_ptr<LevelDataSource> source;\r
std::unique_ptr<CachedWindow> window;\r
OwnedArray<ThumbData> channels;\r
TimeSliceThread thread;\r
\r
class ThumbnailCacheEntry;\r
+ friend struct ContainerDeletePolicy<ThumbnailCacheEntry>;\r
OwnedArray<ThumbnailCacheEntry> thumbs;\r
CriticalSection lock;\r
int maxNumThumbsToStore;\r
\r
struct AudioVisualiserComponent::ChannelInfo\r
{\r
- ChannelInfo (AudioVisualiserComponent& o, int bufferSize) : owner (o)\r
+ ChannelInfo (AudioVisualiserComponent& o, int bufferSize)\r
+ : owner (o), nextSample (0), subSample (0)\r
{\r
setBufferSize (bufferSize);\r
clear();\r
\r
void clear() noexcept\r
{\r
- // VS2013 doesn't like {} here...\r
- for (auto& l : levels)\r
- l = Range<float>();\r
+ for (int i = 0; i < levels.size(); ++i)\r
+ levels.getReference(i) = Range<float>();\r
\r
- value = {};\r
+ value = Range<float>();\r
subSample = 0;\r
}\r
\r
- void pushSamples (const float* inputSamples, int num) noexcept\r
+ void pushSamples (const float* inputSamples, const int num) noexcept\r
{\r
for (int i = 0; i < num; ++i)\r
pushSample (inputSamples[i]);\r
}\r
\r
- void pushSample (float newSample) noexcept\r
+ void pushSample (const float newSample) noexcept\r
{\r
if (--subSample <= 0)\r
{\r
void setBufferSize (int newSize)\r
{\r
levels.removeRange (newSize, levels.size());\r
- levels.insertMultiple (-1, {}, newSize - levels.size());\r
+ levels.insertMultiple (-1, Range<float>(), newSize - levels.size());\r
\r
if (nextSample >= newSize)\r
nextSample = 0;\r
AudioVisualiserComponent& owner;\r
Array<Range<float>> levels;\r
Range<float> value;\r
- int nextSample = 0, subSample = 0;\r
+ int nextSample, subSample;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelInfo)\r
};\r
\r
//==============================================================================\r
-AudioVisualiserComponent::AudioVisualiserComponent (int initialNumChannels)\r
+AudioVisualiserComponent::AudioVisualiserComponent (const int initialNumChannels)\r
: numSamples (1024),\r
inputSamplesPerBlock (256),\r
backgroundColour (Colours::black),\r
{\r
}\r
\r
-void AudioVisualiserComponent::setNumChannels (int numChannels)\r
+void AudioVisualiserComponent::setNumChannels (const int numChannels)\r
{\r
channels.clear();\r
\r
{\r
numSamples = newNumSamples;\r
\r
- for (auto* c : channels)\r
- c->setBufferSize (newNumSamples);\r
+ for (int i = 0; i < channels.size(); ++i)\r
+ channels.getUnchecked(i)->setBufferSize (newNumSamples);\r
}\r
\r
void AudioVisualiserComponent::clear()\r
{\r
- for (auto* c : channels)\r
- c->clear();\r
+ for (int i = 0; i < channels.size(); ++i)\r
+ channels.getUnchecked(i)->clear();\r
}\r
\r
void AudioVisualiserComponent::pushBuffer (const float** d, int numChannels, int num)\r
\r
void AudioVisualiserComponent::pushBuffer (const AudioSourceChannelInfo& buffer)\r
{\r
- auto numChannels = jmin (buffer.buffer->getNumChannels(), channels.size());\r
+ const int numChannels = jmin (buffer.buffer->getNumChannels(), channels.size());\r
\r
for (int i = 0; i < numChannels; ++i)\r
channels.getUnchecked(i)->pushSamples (buffer.buffer->getReadPointer (i, buffer.startSample),\r
{\r
g.fillAll (backgroundColour);\r
\r
- auto r = getLocalBounds().toFloat();\r
- auto channelHeight = r.getHeight() / channels.size();\r
+ Rectangle<float> r (getLocalBounds().toFloat());\r
+ const float channelHeight = r.getHeight() / channels.size();\r
\r
g.setColour (waveformColour);\r
\r
- for (auto* c : channels)\r
+ for (int i = 0; i < channels.size(); ++i)\r
+ {\r
+ const ChannelInfo& c = *channels.getUnchecked(i);\r
+\r
paintChannel (g, r.removeFromTop (channelHeight),\r
- c->levels.begin(), c->levels.size(), c->nextSample);\r
+ c.levels.begin(), c.levels.size(), c.nextSample);\r
+ }\r
}\r
\r
-void AudioVisualiserComponent::getChannelAsPath (Path& path, const Range<float>* levels,\r
- int numLevels, int nextSample)\r
+void AudioVisualiserComponent::getChannelAsPath (Path& path, const Range<float>* levels, int numLevels, int nextSample)\r
{\r
path.preallocateSpace (4 * numLevels + 8);\r
\r
for (int i = 0; i < numLevels; ++i)\r
{\r
- auto level = -(levels[(nextSample + i) % numLevels].getEnd());\r
+ const float level = -(levels[(nextSample + i) % numLevels].getEnd());\r
\r
if (i == 0)\r
path.startNewSubPath (0.0f, level);\r
\r
private:\r
struct ChannelInfo;\r
+ friend struct ChannelInfo;\r
+ friend struct ContainerDeletePolicy<ChannelInfo>;\r
\r
OwnedArray<ChannelInfo> channels;\r
int numSamples, inputSamplesPerBlock;\r
owner.setLowestVisibleKey (note * 12);\r
}\r
\r
- void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+ void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
{\r
owner.drawUpDownButton (g, getWidth(), getHeight(),\r
- shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
+ isMouseOverButton, isButtonDown,\r
delta > 0);\r
}\r
\r
auto newNote = xyToNote (pos, mousePositionVelocity);\r
auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
- auto eventVelocity = useMousePositionForVelocity ? mousePositionVelocity * velocity : velocity;\r
+ auto eventVelocity = useMousePositionForVelocity ? mousePositionVelocity * velocity : 1.0f;\r
\r
if (oldNote != newNote)\r
{\r
\r
ID: juce_audio_utils\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE extra audio utility classes\r
description: Classes for audio-related GUI and miscellaneous tasks.\r
website: http://www.juce.com/juce\r
METHOD (getBluetoothDeviceStatus, "getBluetoothDeviceStatus", "(Ljava/lang/String;)I") \\r
METHOD (startStopScan, "startStopScan", "(Z)V")\r
\r
-DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager")\r
+DECLARE_JNI_CLASS (AndroidBluetoothManager, JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
}\r
}\r
\r
-void AudioProcessorPlayer::setMidiOutput (MidiOutput* midiOutputToUse)\r
-{\r
- if (midiOutput != midiOutputToUse)\r
- {\r
- const ScopedLock sl (lock);\r
- midiOutput = midiOutputToUse;\r
- }\r
-}\r
-\r
//==============================================================================\r
void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChannelData,\r
const int numInputChannels,\r
processor->processBlock (buffer, incomingMidi);\r
}\r
\r
- if (midiOutput != nullptr)\r
- midiOutput->sendBlockOfMessagesNow (incomingMidi);\r
-\r
return;\r
}\r
}\r
give it a processor to use by calling setProcessor().\r
\r
It's also a MidiInputCallback, so you can connect it to both an audio and midi\r
- input to send both streams through the processor. To set a MidiOutput for the processor,\r
- use the setMidiOutput() method.\r
+ input to send both streams through the processor.\r
\r
@see AudioProcessor, AudioProcessorGraph\r
\r
*/\r
MidiMessageCollector& getMidiMessageCollector() noexcept { return messageCollector; }\r
\r
- /** Sets the MIDI output that should be used, if required.\r
-\r
- The MIDI output will not be deleted or owned by this object. If the MIDI output is\r
- deleted, pass a nullptr to this method.\r
- */\r
- void setMidiOutput (MidiOutput* midiOutputToUse);\r
-\r
/** Switch between double and single floating point precisions processing.\r
-\r
- The audio IO callbacks will still operate in single floating point precision,\r
- however, all internal processing including the AudioProcessor will be processed in\r
- double floating point precision if the AudioProcessor supports it (see\r
- AudioProcessor::supportsDoublePrecisionProcessing()). Otherwise, the processing will\r
- remain single precision irrespective of the parameter doublePrecision.\r
- */\r
+ The audio IO callbacks will still operate in single floating point\r
+ precision, however, all internal processing including the\r
+ AudioProcessor will be processed in double floating point precision if\r
+ the AudioProcessor supports it (see\r
+ AudioProcessor::supportsDoublePrecisionProcessing()).\r
+ Otherwise, the processing will remain single precision irrespective of\r
+ the parameter doublePrecision. */\r
void setDoublePrecisionProcessing (bool doublePrecision);\r
\r
/** Returns true if this player processes internally processes the samples with\r
- double floating point precision.\r
- */\r
+ double floating point precision. */\r
inline bool getDoublePrecisionProcessing() { return isDoublePrecision; }\r
\r
//==============================================================================\r
\r
MidiBuffer incomingMidi;\r
MidiMessageCollector messageCollector;\r
- MidiOutput* midiOutput = nullptr;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorPlayer)\r
};\r
// This is an AudioTransportSource which will own it's assigned source\r
struct AudioSourceOwningTransportSource : public AudioTransportSource\r
{\r
- AudioSourceOwningTransportSource (PositionableAudioSource* s, double sr) : source (s)\r
+ AudioSourceOwningTransportSource (PositionableAudioSource* s, double sampleRate) : source (s)\r
{\r
- AudioTransportSource::setSource (s, 0, nullptr, sr);\r
+ AudioTransportSource::setSource (s, 0, nullptr, sampleRate);\r
}\r
\r
~AudioSourceOwningTransportSource()\r
\r
Block::~Block() {}\r
\r
-bool Block::isControlBlock() const\r
-{\r
- return isControlBlock (getType());\r
-}\r
-\r
-bool Block::isControlBlock (Block::Type type)\r
-{\r
- return type == Block::Type::liveBlock\r
- || type == Block::Type::loopBlock\r
- || type == Block::Type::touchBlock\r
- || type == Block::Type::developerControlBlock;\r
-}\r
-\r
void Block::addDataInputPortListener (DataInputPortListener* listener) { dataInputPortListeners.add (listener); }\r
void Block::removeDataInputPortListener (DataInputPortListener* listener) { dataInputPortListeners.remove (listener); }\r
\r
*/\r
virtual Type getType() const = 0;\r
\r
- /** Returns true if this a control block. **/\r
- bool isControlBlock() const;\r
-\r
- /** Returns true if Block::Type is a control block. */\r
- static bool isControlBlock (Block::Type);\r
-\r
/** Returns a human-readable description of this device type. */\r
virtual juce::String getDeviceDescription() const = 0;\r
\r
*/\r
virtual bool isMasterBlock() const = 0;\r
\r
- /** Returns the UID of the master block this block is connected to. */\r
- virtual UID getConnectedMasterUID() const = 0;\r
-\r
//==============================================================================\r
/** Returns the width of the device in logical device units. */\r
virtual int getWidth() const = 0;\r
/** Returns the length of one logical device unit as physical millimeters. */\r
virtual float getMillimetersPerUnit() const = 0;\r
\r
- /** Returns the area that this block covers within the layout of the group as a whole.\r
- The coordinates are in logical block units, and are relative to the origin, which is the master block's top-left corner.\r
- */\r
- virtual Rectangle<int> getBlockAreaWithinLayout() const = 0;\r
-\r
- /** Returns the rotation of this block relative to the master block in 90 degree steps clockwise. */\r
- virtual int getRotation() const = 0;\r
-\r
//==============================================================================\r
/** If this block has a grid of LEDs, this will return an object to control it.\r
Note that the pointer that is returned belongs to this object, and the caller must\r
neither delete it or use it after the lifetime of this Block object has finished.\r
If there are no LEDs, then this method will return nullptr.\r
*/\r
- virtual LEDRow* getLEDRow() = 0;\r
+ virtual LEDRow* getLEDRow() const = 0;\r
\r
/** If this block has any status LEDs, this will return an array of objects to control them.\r
Note that the objects in the array belong to this Block object, and the caller must\r
/** Returns the LittleFoot program to execute on the BLOCKS device. */\r
virtual juce::String getLittleFootProgram() = 0;\r
\r
- /** Returns an array of search paths to use when resolving includes. **/\r
- virtual juce::Array<juce::File> getSearchPaths() { return {}; }\r
-\r
Block& block;\r
};\r
\r
virtual void removeProgramEventListener (ProgramEventListener*);\r
\r
//==============================================================================\r
- /** Returns the overall memory of the block. */\r
- virtual uint32 getMemorySize() = 0;\r
-\r
/** Returns the size of the data block that setDataByte and other functions can write to. */\r
- virtual uint32 getHeapMemorySize() = 0;\r
+ virtual uint32 getMemorySize() = 0;\r
\r
/** Sets a single byte on the littlefoot heap. */\r
virtual void setDataByte (size_t offset, uint8 value) = 0;\r
{\r
static constexpr int32 numOptionNames = 8;\r
\r
- enum class ConfigType\r
- {\r
- integer,\r
- floating,\r
- boolean,\r
- colour,\r
- options\r
- };\r
-\r
ConfigMetaData() {}\r
\r
// Constructor to work around VS2015 bugs...\r
juce::Range<int32> rangeToUse,\r
bool active,\r
const char* itemName,\r
- ConfigType itemType,\r
+ uint32 itemType,\r
const char* options[ConfigMetaData::numOptionNames],\r
const char* groupName)\r
: item (itemIndex),\r
juce::Range<int32> range;\r
bool isActive = false;\r
juce::String name;\r
- ConfigType type = ConfigType::integer;\r
+ uint32 type = 0;\r
juce::String optionNames[numOptionNames] = {};\r
juce::String group;\r
};\r
/** Provides a callback that will be called when a config changes. */\r
virtual void setConfigChangedCallback (std::function<void(Block&, const ConfigMetaData&, uint32)>) = 0;\r
\r
- /** Provides a callback that will be called when a prgoram has been loaded. */\r
- virtual void setProgramLoadedCallback (std::function<void(Block&)> programLoaded) = 0;\r
-\r
//==============================================================================\r
/** Interface for objects listening to input data port. */\r
struct DataInputPortListener\r
\r
using namespace BlocksProtocol;\r
\r
-using ConfigType = Block::ConfigMetaData::ConfigType;\r
-\r
/** Manages the configuration of blocks\r
\r
@tags{Blocks}\r
void setDeviceIndex (TopologyIndex newDeviceIndex) { deviceIndex = newDeviceIndex; }\r
void setDeviceComms (PhysicalTopologySource::DeviceConnection* newConn) { deviceConnection = newConn; }\r
\r
- static constexpr uint32 numConfigItems = 64;\r
+ enum ConfigType\r
+ {\r
+ integer,\r
+ floating,\r
+ boolean,\r
+ colour,\r
+ options\r
+ };\r
+\r
+ static constexpr uint32 numConfigItems = 61;\r
\r
/** Structure describing a configuration */\r
struct ConfigDescription\r
\r
Block::ConfigMetaData toConfigMetaData() const\r
{\r
- return Block::ConfigMetaData ((uint32) item, value, { min, max }, isActive, name, type, (const char**) optionNames, group);\r
+ return Block::ConfigMetaData ((uint32) item, value, { min, max }, isActive, name, (uint32) type, (const char**) optionNames, group);\r
}\r
};\r
\r
{\r
{ midiStartChannel, 2, 1, 16, false, "MIDI Start Channel", ConfigType::integer, {}, "MIDI Settings" },\r
{ midiEndChannel, 16, 1, 16, false, "MIDI End Channel", ConfigType::integer, {}, "MIDI Settings" },\r
- { midiUseMPE, 1, 0, 2, false, "MIDI Mode", ConfigType::options, { "Multi Channel",\r
- "MPE",\r
- "Single Channel" }, "MIDI Settings" },\r
+ { midiUseMPE, 1, 0, 1, false, "Use MPE", ConfigType::boolean, {}, "MIDI Settings" },\r
{ pitchBendRange, 48, 1, 96, false, "Pitch Bend Range", ConfigType::integer, {}, "MIDI Settings" },\r
- { midiChannelRange, 15, 1, 15, false, "No. MIDI Channels", ConfigType::integer, {}, "MIDI Settings" },\r
- { MPEZone, 0, 0, 1, false, "MPE Zone", ConfigType::options, { "Lower Zone",\r
- "Upper Zone"}, "MIDI Settings" },\r
{ octave, 0, -4, 6, false, "Octave", ConfigType::integer, {}, "Pitch" },\r
{ transpose, 0, -11, 11, false, "Transpose", ConfigType::integer, {}, "Pitch" },\r
{ slideCC, 74, 0, 127, false, "Slide CC", ConfigType::integer, {}, "Play mode" },\r
{ chord, 0, 0, 127, false, "Chord", ConfigType::integer, {}, "Play mode" }, // NOTE: Should be options\r
{ arpPattern, 0, 0, 127, false, "Arp Pattern", ConfigType::integer, {}, "Play mode" },\r
{ tempo, 120, 1, 300, false, "Tempo", ConfigType::integer, {}, "Rhythm" },\r
- { xTrackingMode, 1, 1, 4, false, "Glide Tracking Mode", ConfigType::options, { "Multi-Channel",\r
+ { xTrackingMode, 1, 0, 4, false, "Glide Tracking Mode", ConfigType::options, { "Multi-Channel",\r
"Last Played",\r
"Highest",\r
"Lowest",\r
"Disabled" }, "Play mode" },\r
- { yTrackingMode, 1, 1, 4, false, "Slide Tracking Mode", ConfigType::options, { "Multi-Channel",\r
+ { yTrackingMode, 1, 0, 4, false, "Slide Tracking Mode", ConfigType::options, { "Multi-Channel",\r
"Last Played",\r
"Highest",\r
"Lowest",\r
// Set Block Configuration\r
void setBlockConfig (ConfigItemId item, int32 value)\r
{\r
- buildAndSendPacket ([item, value] (HostPacketBuilder<32>& p) { p.addConfigSetMessage (item, value); });\r
+ HostPacketBuilder<32> packet;\r
+\r
+ packet.writePacketSysexHeaderBytes (deviceIndex);\r
+ packet.addConfigSetMessage (item, value);\r
+ packet.writePacketSysexFooter();\r
+\r
+ if (deviceConnection != nullptr)\r
+ deviceConnection->sendMessageToDevice (packet.getData(), (size_t) packet.size());\r
}\r
\r
void requestBlockConfig (ConfigItemId item)\r
{\r
- buildAndSendPacket ([item] (HostPacketBuilder<32>& p) { p.addRequestMessage (item); });\r
+ HostPacketBuilder<32> packet;\r
+\r
+ packet.writePacketSysexHeaderBytes (deviceIndex);\r
+ packet.addRequestMessage (item);\r
+ packet.writePacketSysexFooter();\r
+\r
+ if (deviceConnection != nullptr)\r
+ deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
}\r
\r
void requestFactoryConfigSync()\r
{\r
- buildAndSendPacket ([] (HostPacketBuilder<32>& p) { p.addRequestFactorySyncMessage(); });\r
+ HostPacketBuilder<32> packet;\r
+\r
+ packet.writePacketSysexHeaderBytes(deviceIndex);\r
+ packet.addRequestFactorySyncMessage();\r
+ packet.writePacketSysexFooter();\r
+\r
+ if (deviceConnection != nullptr)\r
+ deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
}\r
\r
void requestUserConfigSync()\r
{\r
- buildAndSendPacket ([] (HostPacketBuilder<32>& p) { p.addRequestUserSyncMessage(); });\r
+ HostPacketBuilder<32> packet;\r
+\r
+ packet.writePacketSysexHeaderBytes(deviceIndex);\r
+ packet.addRequestUserSyncMessage();\r
+ packet.writePacketSysexFooter();\r
+\r
+ if (deviceConnection != nullptr)\r
+ deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());\r
}\r
\r
void handleConfigUpdateMessage (int32 item, int32 value, int32 min, int32 max)\r
return false;\r
}\r
\r
- template<typename PacketBuildFn>\r
- void buildAndSendPacket (PacketBuildFn buildFn)\r
- {\r
- if (deviceConnection == nullptr)\r
- return;\r
-\r
- HostPacketBuilder<32> packet;\r
- packet.writePacketSysexHeaderBytes (deviceIndex);\r
- buildFn (packet);\r
- packet.writePacketSysexFooter();\r
- deviceConnection->sendMessageToDevice (packet.getData(), (size_t) packet.size());\r
- }\r
-\r
- TopologyIndex deviceIndex {};\r
- PhysicalTopologySource::DeviceConnection* deviceConnection {};\r
+ TopologyIndex deviceIndex;\r
+ PhysicalTopologySource::DeviceConnection* deviceConnection;\r
};\r
\r
} // namespace juce\r
@param value the value within the source range to map\r
@param sourceMin the minimum value of the source range\r
@param sourceMax the maximum value of the source range\r
- @param destMin the minimum value of the destination range\r
+ @param destMin the minumum value of the destination range\r
@param destMax the maximum value of the destination range\r
@returns the original value mapped to the destination range\r
*/\r
*/\r
void handleButtonUp (int index);\r
\r
-/** Call this when a control block button is pressed to trigger the buttons default behaviour.\r
+/** Called when a control block button is pressed.\r
\r
@param buttonIndex the index of the button\r
\r
@note Requires >= 0.2.5 firmware\r
@note Only valid with a control block\r
-\r
- @see initControl onControlRelease\r
*/\r
void onControlPress (int buttonIndex);\r
\r
-/** Call this when a control block button is released to trigger the buttons default behaviour.\r
+/** Called when a control block button is released.\r
\r
@param buttonIndex the index of the button\r
\r
@note Requires >= 0.2.5 firmware\r
@note Only valid with a control block\r
-\r
- @see initControl onControlPress\r
*/\r
void onControlRelease (int buttonIndex);\r
\r
#endif\r
#else\r
\r
-namespace juce\r
-{\r
- #include "littlefoot/juce_LittleFootRemoteHeap.h"\r
-}\r
-\r
#include "protocol/juce_BitPackingUtilities.h"\r
#include "protocol/juce_BlocksProtocolDefinitions.h"\r
#include "protocol/juce_HostPacketDecoder.h"\r
\r
ID: juce_blocks_basics\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: Provides low-level control over ROLI BLOCKS devices\r
description: JUCE wrapper for low-level control over ROLI BLOCKS devices.\r
website: http://developer.roli.com\r
{\r
#include "littlefoot/juce_LittleFootRunner.h"\r
#include "littlefoot/juce_LittleFootCompiler.h"\r
+ #include "littlefoot/juce_LittleFootRemoteHeap.h"\r
}\r
\r
#endif\r
If there's an error, this returns it, otherwise the compiled bytecode is\r
placed in the compiledObjectCode member.\r
*/\r
- Result compile (const String& sourceCode, uint32 defaultHeapSize, const Array<File>& searchPaths = {})\r
+ Result compile (const String& sourceCode, uint32 defaultHeapSize)\r
{\r
try\r
{\r
- SyntaxTreeBuilder stb (sourceCode, nativeFunctions, defaultHeapSize, searchPaths);\r
+ SyntaxTreeBuilder stb (sourceCode, nativeFunctions, defaultHeapSize);\r
stb.compile();\r
stb.simplify();\r
\r
\r
struct Statement;\r
struct Expression;\r
- struct Variable;\r
struct BlockStatement;\r
struct Function;\r
struct AllocatedObject { virtual ~AllocatedObject() noexcept {} };\r
//==============================================================================\r
struct CodeLocation\r
{\r
- CodeLocation (const String& code, const File& srcFile) noexcept : program (code), location (program.getCharPointer()), sourceFile (srcFile) {}\r
- CodeLocation (const CodeLocation& other) noexcept : program (other.program), location (other.location), sourceFile (other.sourceFile) {}\r
+ CodeLocation (const String& code) noexcept : program (code), location (program.getCharPointer()) {}\r
+ CodeLocation (const CodeLocation& other) noexcept : program (other.program), location (other.location) {}\r
\r
[[noreturn]] void throwError (const String& message) const\r
{\r
if (*i == '\n') { col = 1; ++line; }\r
}\r
\r
- auto filePath = sourceFile == File() ? String() : (sourceFile.getFullPathName() + ": ");\r
- throw filePath + "Line " + String (line) + ", column " + String (col) + " : " + message;\r
+ throw "Line " + String (line) + ", column " + String (col) + " : " + message;\r
}\r
\r
String program;\r
String::CharPointerType location;\r
- File sourceFile;\r
};\r
\r
//==============================================================================\r
struct TokenIterator\r
{\r
- TokenIterator (const String& code) : location (code, {}), p (code.getCharPointer()) { skip(); }\r
+ TokenIterator (const String& code) : location (code), p (code.getCharPointer()) { skip(); }\r
\r
TokenType skip()\r
{\r
bool matchesAny (TokenType t1, Args... others) const noexcept { return currentType == t1 || matchesAny (others...); }\r
bool matchesAny (TokenType t1) const noexcept { return currentType == t1; }\r
\r
- void throwErrorExpecting (const String& expected) { location.throwError ("Found " + getTokenDescription (currentType) + " when expecting " + expected); }\r
-\r
CodeLocation location;\r
TokenType currentType;\r
var currentValue;\r
\r
- protected:\r
- String::CharPointerType p;\r
+ void throwErrorExpecting (const String& expected) { location.throwError ("Found " + getTokenDescription (currentType) + " when expecting " + expected); }\r
\r
private:\r
+ String::CharPointerType p;\r
+\r
static bool isIdentifierStart (juce_wchar c) noexcept { return CharacterFunctions::isLetter (c) || c == '_'; }\r
static bool isIdentifierBody (juce_wchar c) noexcept { return CharacterFunctions::isLetterOrDigit (c) || c == '_'; }\r
\r
//==============================================================================\r
struct SyntaxTreeBuilder : private TokenIterator\r
{\r
- SyntaxTreeBuilder (const String& code, const Array<NativeFunction>& nativeFns, uint32 defaultHeapSize, const Array<File>& searchPathsToUse)\r
- : TokenIterator (code), searchPaths (searchPathsToUse), nativeFunctions (nativeFns), heapSizeRequired (defaultHeapSize) {}\r
+ SyntaxTreeBuilder (const String& code, const Array<NativeFunction>& nativeFns, uint32 defaultHeapSize)\r
+ : TokenIterator (code), nativeFunctions (nativeFns), heapSizeRequired (defaultHeapSize) {}\r
\r
void compile()\r
{\r
blockBeingParsed = allocate<BlockStatement> (location, nullptr, nullptr, false);\r
- parseCode();\r
- heapSizeRequired += arrayHeapSize;\r
- }\r
-\r
- void parseCode()\r
- {\r
- const auto programHash = location.program.hashCode64();\r
-\r
- if (includedSourceCode.contains (programHash))\r
- return;\r
-\r
- includedSourceCode.add (programHash);\r
\r
while (currentType != Token::eof)\r
{\r
//==============================================================================\r
BlockPtr blockBeingParsed = nullptr;\r
Array<Function*> functions;\r
- Array<File> searchPaths;\r
- Array<int64> includedSourceCode;\r
const Array<NativeFunction>& nativeFunctions;\r
uint32 heapSizeRequired;\r
- uint32 arrayHeapSize = 0;\r
\r
template <typename Type, typename... Args>\r
Type* allocate (Args... args) { auto o = new Type (args...); allAllocatedObjects.add (o); return o; }\r
{\r
match (Token::colon);\r
heapSizeRequired = (((uint32) parseIntegerLiteral()) + 3) & ~3u;\r
- }\r
- else if (name == "include")\r
- {\r
- parseIncludeDirective();\r
- }\r
- else\r
- {\r
- location.throwError ("Unknown compiler directive");\r
- }\r
- }\r
-\r
- void parseIncludeDirective()\r
- {\r
- match (Token::literal);\r
-\r
- if (! currentValue.isString())\r
- {\r
- location.throwError ("Expected file path");\r
return;\r
}\r
\r
- juce::File fileToInclude = resolveIncludePath (currentValue.toString());\r
-\r
- if (fileToInclude == File())\r
- return;\r
-\r
- searchPaths.add (fileToInclude);\r
- auto codeToInclude = fileToInclude.loadFileAsString();\r
-\r
- auto locationToRestore = location;\r
- auto currentTypeToRestore = currentType;\r
- auto currentValueToRestore = currentValue;\r
- auto pToRestore = p;\r
-\r
- location = CodeLocation (codeToInclude, fileToInclude);\r
- p = codeToInclude.getCharPointer();\r
- skip();\r
-\r
- parseCode();\r
-\r
- location = locationToRestore;\r
- currentType = currentTypeToRestore;\r
- currentValue = currentValueToRestore;\r
- p = pToRestore;\r
+ location.throwError ("Unknown compiler directive");\r
}\r
\r
- File resolveIncludePath (String include)\r
+ void parseGlobalVariableDeclaraion (bool isConst, Type type, String name)\r
{\r
- if (include.substring (include.length() - 11) != ".littlefoot")\r
- {\r
- location.throwError ("File extension must be .littlefoot");\r
- return {};\r
- }\r
-\r
- if (File::isAbsolutePath (include) && File (include).existsAsFile())\r
- return { include };\r
-\r
- auto fileName = include.fromLastOccurrenceOf ("/", false, false);\r
-\r
- for (auto path : searchPaths)\r
+ for (;;)\r
{\r
- if (path == File())\r
- continue;\r
+ int arraySize = matchIf (Token::openBracket) ? parseIntegerLiteral() : 0;\r
\r
- if (! path.isDirectory())\r
- path = path.getParentDirectory();\r
+ if (arraySize > 0)\r
+ location.throwError ("Arrays not yet implemented!");\r
\r
- if (path.getChildFile (include).existsAsFile())\r
- return path.getChildFile (include);\r
-\r
- if (path.getChildFile (fileName).existsAsFile())\r
- return path.getChildFile (fileName);\r
- }\r
+ var constantInitialiser;\r
\r
- location.throwError ("File not found: " + include);\r
- }\r
+ if (isConst)\r
+ constantInitialiser = parseConstantExpressionInitialiser (type);\r
\r
- //TODO: should there be a max array size?\r
- void parseGlobalVariableDeclaraion (bool isConst, Type type, String name)\r
- {\r
- for (;;)\r
- {\r
- if (matchIf (Token::openBracket))\r
- {\r
- int arraySize = 0;\r
- parseGlobalArray (arraySize, type, name, nullptr);\r
- arrayHeapSize += uint32 (arraySize * 4);\r
- }\r
- else\r
- {\r
- parseGlobalVariable (isConst, type, name);\r
- }\r
+ blockBeingParsed->addVariable ({ name, type, true, isConst, constantInitialiser }, location);\r
\r
if (matchIf (Token::comma))\r
{\r
}\r
}\r
\r
- void parseGlobalArray (int& arraySize, Type type, const String& name, Variable* parent)\r
- {\r
- const auto value = parseIntegerLiteral();\r
- match (Token::closeBracket);\r
-\r
- blockBeingParsed->addVariable ({ {}, type, true, false, {}, value, parent }, location);\r
-\r
- auto& newArray = blockBeingParsed->arrays.getReference (blockBeingParsed->arrays.size() - 1);\r
-\r
- if (parent != nullptr)\r
- parent->nextArray = &newArray;\r
-\r
- if (matchIf (Token::openBracket))\r
- {\r
- parseGlobalArray (arraySize, type, name, &newArray);\r
- arraySize *= value;\r
- }\r
- else\r
- {\r
- newArray.name = name;\r
- arraySize = value;\r
- }\r
- }\r
-\r
- void parseGlobalVariable (bool isConst, Type type, String name)\r
- {\r
- var constantInitialiser;\r
-\r
- if (isConst)\r
- constantInitialiser = parseConstantExpressionInitialiser (type);\r
-\r
- blockBeingParsed->addVariable ({ name, type, true, isConst, constantInitialiser, 0 }, location);\r
- }\r
-\r
var parseConstantExpressionInitialiser (Type expectedType)\r
{\r
var result;\r
if (matchIf (Token::assign))\r
{\r
auto loc = location;\r
- return allocate<Assignment> (loc, blockBeingParsed, lhs, parseExpression(), false);\r
+ return allocate<Assignment> (loc, blockBeingParsed, getIdentifierFromExpression (lhs), parseExpression(), false);\r
}\r
\r
return lhs;\r
return {};\r
}\r
\r
- if (matchIf (Token::openBracket)) return parseArraySubscript (input);\r
- if (matchIf (Token::plusplus)) return parsePostIncDec (input, Token::plus);\r
- if (matchIf (Token::minusminus)) return parsePostIncDec (input, Token::minus);\r
-\r
- return input;\r
- }\r
-\r
- ExpPtr parseArraySubscript (ExpPtr input)\r
- {\r
- auto s = allocate<ArraySubscript> (location, blockBeingParsed);\r
- s->object = input;\r
- s->index = parseExpression();\r
- match (Token::closeBracket);\r
-\r
if (matchIf (Token::openBracket))\r
- return parseArraySubscript (s);\r
+ {\r
+ auto s = allocate<ArraySubscript> (location, blockBeingParsed);\r
+ s->object = input;\r
+ s->index = parseExpression();\r
+ match (Token::closeBracket);\r
+ return parseSuffixes (s);\r
+ }\r
\r
- return s;\r
+ if (matchIf (Token::plusplus)) return parsePostIncDec (input, Token::plus);\r
+ if (matchIf (Token::minusminus)) return parsePostIncDec (input, Token::minus);\r
+\r
+ return input;\r
}\r
\r
ExpPtr parseInPlaceOpExpression (ExpPtr lhs, TokenType opType)\r
{\r
auto loc = location;\r
auto rhs = parseExpression();\r
- return allocate<Assignment> (loc, blockBeingParsed, lhs,\r
+ return allocate<Assignment> (loc, blockBeingParsed, getIdentifierFromExpression (lhs),\r
allocate<BinaryOperator> (location, blockBeingParsed, lhs, rhs, opType), false);\r
}\r
\r
{\r
auto lhs = parseFactor();\r
auto one = allocate<LiteralValue> (location, blockBeingParsed, (int) 1);\r
- return allocate<Assignment> (location, blockBeingParsed, lhs,\r
+ return allocate<Assignment> (location, blockBeingParsed, getIdentifierFromExpression (lhs),\r
allocate<BinaryOperator> (location, blockBeingParsed, lhs, one, opType), false);\r
}\r
\r
ExpPtr parsePostIncDec (ExpPtr lhs, TokenType opType)\r
{\r
auto one = allocate<LiteralValue> (location, blockBeingParsed, (int) 1);\r
- return allocate<Assignment> (location, blockBeingParsed, lhs,\r
+ return allocate<Assignment> (location, blockBeingParsed, getIdentifierFromExpression (lhs),\r
allocate<BinaryOperator> (location, blockBeingParsed, lhs, one, opType), true);\r
}\r
\r
\r
for (StatementPtr result = nullptr;;)\r
{\r
- auto identifier = allocate<Identifier> (location, blockBeingParsed, parseIdentifier());\r
+ auto name = parseIdentifier();\r
auto loc = location;\r
\r
if (isConst)\r
{\r
auto constantValue = parseConstantExpressionInitialiser (type);\r
- blockBeingParsed->addVariable ({ identifier->getIdentifier(), type, false, true, constantValue }, loc);\r
+ blockBeingParsed->addVariable ({ name, type, false, true, constantValue }, loc);\r
}\r
else\r
{\r
- blockBeingParsed->addVariable ({ identifier->getIdentifier(), type, false, false, {} }, loc);\r
+ blockBeingParsed->addVariable ({ name, type, false, false, {} }, loc);\r
\r
auto assignedValue = matchIf (Token::assign) ? parseExpression() : nullptr;\r
\r
if (assignedValue == nullptr)\r
assignedValue = allocate<LiteralValue> (loc, blockBeingParsed, (int) 0);\r
\r
- auto assignment = allocate<Assignment> (loc, blockBeingParsed, identifier, assignedValue, false);\r
+ auto assignment = allocate<Assignment> (loc, blockBeingParsed, name, assignedValue, false);\r
\r
if (result == nullptr)\r
{\r
return name;\r
}\r
\r
+ String getIdentifierFromExpression (ExpPtr e)\r
+ {\r
+ if (auto i = dynamic_cast<Identifier*> (e))\r
+ return i->name;\r
+\r
+ location.throwError ("This operator requires an assignable variable");\r
+ return {};\r
+ }\r
+\r
ExpPtr parseFunctionCall (const String& name)\r
{\r
auto call = allocate<FunctionCall> (location, blockBeingParsed);\r
//==============================================================================\r
struct CodeGenerator\r
{\r
- CodeGenerator (Array<uint8>& output, SyntaxTreeBuilder& stb)\r
+ CodeGenerator (Array<uint8>& output, const SyntaxTreeBuilder& stb)\r
: outputCode (output), syntaxTree (stb) {}\r
\r
void generateCode (BlockPtr outerBlock, uint32 heapSizeBytesRequired)\r
\r
//==============================================================================\r
Array<uint8>& outputCode;\r
- SyntaxTreeBuilder& syntaxTree;\r
+ const SyntaxTreeBuilder& syntaxTree;\r
\r
struct Marker { int index = 0; };\r
struct MarkerAndAddress { Marker marker; int address; };\r
\r
emitCast (sourceType, requiredType, location);\r
}\r
-\r
- void emitArrayElementIndex (const Expression* target, BlockPtr parentBlock,\r
- int stackDepth, const CodeLocation& errorLocation)\r
- {\r
- if (auto currentSubscript = dynamic_cast<const ArraySubscript*> (target))\r
- {\r
- const auto identifier = currentSubscript->getIdentifier();\r
- auto array = parentBlock->getArray (identifier, errorLocation);\r
-\r
- ExpPtr elementIndent = nullptr;\r
- auto currentArray = &array;\r
-\r
- while (currentSubscript != nullptr && currentArray != nullptr)\r
- {\r
- auto lhs = syntaxTree.allocate<LiteralValue> (errorLocation, parentBlock, parentBlock->getArrayElementSizeInBytes (*currentArray));\r
- ExpPtr subscriptIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, lhs, currentSubscript->index, Token::times);\r
-\r
- if (elementIndent == nullptr)\r
- elementIndent = subscriptIndent;\r
- else\r
- elementIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, elementIndent, subscriptIndent, Token::plus);\r
-\r
- currentSubscript = dynamic_cast<ArraySubscript*> (currentSubscript->object);\r
- currentArray = currentArray->previousArray;\r
- }\r
-\r
- auto arrayStart = (int) (syntaxTree.heapSizeRequired - syntaxTree.arrayHeapSize) + parentBlock->getArrayStart (identifier, errorLocation);\r
- auto lhs = syntaxTree.allocate<LiteralValue> (errorLocation, parentBlock, arrayStart);\r
- elementIndent = syntaxTree.allocate<BinaryOperator> (errorLocation, parentBlock, lhs, elementIndent, Token::plus);\r
-\r
- elementIndent = elementIndent->simplify (syntaxTree);\r
- elementIndent->emit (*this, Type::int_, stackDepth);\r
- }\r
- else\r
- {\r
- errorLocation.throwError ("Cannot cast Expression to ArraySubscript");\r
- }\r
- }\r
};\r
\r
//==============================================================================\r
Expression (const CodeLocation& l, BlockPtr parent) noexcept : Statement (l, parent) {}\r
virtual Type getType (CodeGenerator&) const = 0;\r
virtual ExpPtr simplify (SyntaxTreeBuilder&) override { return this; }\r
- virtual String getIdentifier() const { location.throwError ("This operator requires an assignable variable"); return {}; }\r
};\r
\r
struct Variable\r
{\r
- // VS2015 requires a constructor to avoid aggregate initialization\r
- Variable (const String& n, Type t, bool isGlobalVar, bool isConstVar, const var& cv,\r
- int nElements = 0, Variable* pArray = nullptr, Variable* nArray = nullptr)\r
- : name (n), type (t), isGlobal (isGlobalVar), isConst (isConstVar), constantValue (cv),\r
- numElements (nElements), previousArray (pArray), nextArray (nArray)\r
- {\r
- }\r
-\r
String name;\r
Type type;\r
bool isGlobal, isConst;\r
var constantValue;\r
- int numElements = 0;\r
- Variable* previousArray = nullptr;\r
- Variable* nextArray = nullptr;\r
};\r
\r
//==============================================================================\r
// returns -ve values for globals\r
int getVariableDepth (const String& name, const CodeLocation& locationForError) const\r
{\r
- auto index = indexOf (variables, name);\r
-\r
+ int index = indexOf (variables, name);\r
if (index >= 0)\r
return getNumVariablesInParentBlocks() + index;\r
\r
if (! isMainBlockOfFunction)\r
return parentBlock->getVariableDepth (name, locationForError);\r
\r
- if (function != nullptr)\r
- for (int i = function->arguments.size(); --i >= 0;)\r
- if (function->arguments.getReference(i).name == name)\r
- return i + 1 + function->getNumLocals();\r
+ for (int i = function->arguments.size(); --i >= 0;)\r
+ if (function->arguments.getReference(i).name == name)\r
+ return i + 1 + function->getNumLocals();\r
\r
index = indexOf (getGlobalVariables(), name);\r
-\r
if (index >= 0)\r
return -(index + 1);\r
\r
locationForError.throwError ("Unknown variable '" + name + "'");\r
- }\r
-\r
- Variable getArray (const String& name, const CodeLocation& locationForError) const\r
- {\r
- for (const auto& array : getGlobalArrays())\r
- if (array.name == name)\r
- return array;\r
-\r
- locationForError.throwError ("Unknown array '" + name + "'");\r
- }\r
-\r
- int getArraySizeInBytes (const Variable& array) const\r
- {\r
- return array.numElements * getArrayElementSizeInBytes (array);\r
- }\r
-\r
- int getArrayElementSizeInBytes (const Variable& array) const\r
- {\r
- if (array.nextArray != nullptr)\r
- return getArraySizeInBytes (*array.nextArray);\r
-\r
- return numBytesInType;\r
- }\r
-\r
- int getArrayStart (const String& name, const CodeLocation& locationForError) const\r
- {\r
- int start = 0;\r
-\r
- for (const auto& array : getGlobalArrays())\r
- {\r
- if (array.name == name)\r
- return start;\r
-\r
- if (array.name.isNotEmpty())\r
- start += getArraySizeInBytes (array);\r
- }\r
-\r
- locationForError.throwError ("Unknown array '" + name + "'");\r
+ return 0;\r
}\r
\r
int getNumVariablesInParentBlocks() const noexcept\r
\r
const Array<Variable>& getGlobalVariables() const noexcept { return parentBlock != nullptr ? parentBlock->getGlobalVariables() : variables; }\r
const Array<Variable>& getGlobalConstants() const noexcept { return parentBlock != nullptr ? parentBlock->getGlobalConstants() : constants; }\r
- const Array<Variable>& getGlobalArrays() const noexcept { return parentBlock != nullptr ? parentBlock->getGlobalArrays() : arrays; }\r
\r
const Variable& getVariable (const String& name, const CodeLocation& locationForError) const\r
{\r
if (v.name == name)\r
return v;\r
\r
- if (! isMainBlockOfFunction && parentBlock != nullptr)\r
+ if (! isMainBlockOfFunction)\r
return parentBlock->getVariable (name, locationForError);\r
\r
- if (function != nullptr)\r
- for (auto& v : function->arguments)\r
- if (v.name == name)\r
- return v;\r
-\r
- for (auto& v : getGlobalConstants())\r
+ for (auto& v : function->arguments)\r
if (v.name == name)\r
return v;\r
\r
- for (auto& v : getGlobalVariables())\r
+ for (auto& v : getGlobalConstants())\r
if (v.name == name)\r
return v;\r
\r
- for (auto& v : getGlobalArrays())\r
+ for (auto& v : getGlobalVariables())\r
if (v.name == name)\r
return v;\r
\r
\r
void addVariable (Variable v, const CodeLocation& locationForError)\r
{\r
- if (v.name.isNotEmpty() && (indexOf (variables, v.name) >= 0 || indexOf (constants, v.name) >= 0 || indexOf (arrays, v.name) >= 0))\r
+ if (indexOf (variables, v.name) >= 0 || indexOf (constants, v.name) >= 0)\r
locationForError.throwError ("Variable '" + v.name + "' already exists");\r
\r
- (v.numElements == 0 ? (v.isConst ? constants : variables) : arrays).add (v);\r
+ (v.isConst ? constants : variables).add (v);\r
}\r
\r
static int indexOf (const Array<Variable>& vars, const String& name) noexcept\r
\r
Function* function;\r
Array<StatementPtr> statements;\r
- Array<Variable> variables, constants, arrays;\r
+ Array<Variable> variables, constants;\r
bool isMainBlockOfFunction;\r
};\r
\r
return this;\r
}\r
\r
- String getIdentifier() const override\r
- {\r
- return name;\r
- }\r
-\r
String name;\r
};\r
\r
\r
struct Assignment : public Expression\r
{\r
- Assignment (const CodeLocation& l, BlockPtr parent, ExpPtr dest, ExpPtr source, bool isPost) noexcept\r
+ Assignment (const CodeLocation& l, BlockPtr parent, const String& dest, ExpPtr source, bool isPost) noexcept\r
: Expression (l, parent), target (dest), newValue (source), isPostAssignment (isPost) {}\r
\r
void emit (CodeGenerator& cg, Type requiredType, int stackDepth) const override\r
\r
if (isPostAssignment && requiredType != Type::void_)\r
{\r
- target->emit (cg, requiredType, stackDepth);\r
+ cg.emitVariableRead (variableType, requiredType, stackDepth,\r
+ parentBlock->getVariableDepth (target, location), location);\r
++stackDepth;\r
requiredType = Type::void_;\r
}\r
\r
newValue->emit (cg, variableType, stackDepth);\r
+ auto index = parentBlock->getVariableDepth (target, location);\r
+\r
+ if (requiredType != Type::void_)\r
+ {\r
+ cg.emit (OpCode::dup);\r
+ ++stackDepth;\r
+ }\r
\r
- if (auto a = dynamic_cast<ArraySubscript*> (target))\r
+ if (index < 0)\r
{\r
- cg.emitArrayElementIndex (a, parentBlock, stackDepth, location);\r
- cg.emit (OpCode::setHeapInt);\r
+ cg.emit (OpCode::dropToGlobal, (int16) ((-index) - 1));\r
}\r
else\r
{\r
- auto index = parentBlock->getVariableDepth (target->getIdentifier(), location);\r
-\r
- if (requiredType != Type::void_)\r
- {\r
- cg.emit (OpCode::dup);\r
- ++stackDepth;\r
- }\r
+ index += stackDepth;\r
\r
- if (index < 0)\r
- {\r
- cg.emit (OpCode::dropToGlobal, (int16) ((-index) - 1));\r
- }\r
+ if (index >= 128)\r
+ cg.emit (OpCode::dropToStack16, (int16) index);\r
else\r
- {\r
- index += stackDepth;\r
-\r
- if (index >= 128)\r
- cg.emit (OpCode::dropToStack16, (int16) index);\r
- else\r
- cg.emit (OpCode::dropToStack, (int8) index);\r
- }\r
-\r
- if (requiredType != Type::void_)\r
- cg.emitCast (variableType, requiredType, location);\r
+ cg.emit (OpCode::dropToStack, (int8) index);\r
}\r
+\r
+ if (requiredType != Type::void_)\r
+ cg.emitCast (variableType, requiredType, location);\r
}\r
\r
Type getType (CodeGenerator&) const override\r
{\r
- return parentBlock->getVariable (target->getIdentifier(), location).type;\r
+ return parentBlock->getVariable (target, location).type;\r
}\r
\r
void visitSubStatements (Statement::Visitor& visit) const override\r
return this;\r
}\r
\r
- ExpPtr target, newValue;\r
+ String target;\r
+ ExpPtr newValue;\r
bool isPostAssignment;\r
};\r
\r
{\r
ArraySubscript (const CodeLocation& l, BlockPtr parent) noexcept : Expression (l, parent) {}\r
\r
- void emit (CodeGenerator& cg, Type /*requiredType*/, int stackDepth) const override\r
+ void emit (CodeGenerator&, Type /*requiredType*/, int /*stackDepth*/) const override\r
{\r
- cg.emitArrayElementIndex (this, parentBlock, stackDepth, location);\r
- cg.emit (OpCode::getHeapInt);\r
+ location.throwError ("Arrays are not implemented yet!");\r
}\r
\r
void visitSubStatements (Statement::Visitor& visit) const override\r
return object->getType (cg);\r
}\r
\r
- String getIdentifier() const override\r
- {\r
- if (auto i = dynamic_cast<Identifier*> (object))\r
- return i->name;\r
-\r
- if (auto s = dynamic_cast<ArraySubscript*> (object))\r
- return s->getIdentifier();\r
-\r
- location.throwError ("This operator requires an assignable variable");\r
- return {};\r
- }\r
-\r
ExpPtr object, index;\r
};\r
\r
==============================================================================\r
*/\r
\r
-#define JUCE_DUMP_LITTLEFOOT_HEAP_STATUS 0\r
-\r
namespace littlefoot\r
{\r
\r
for (uint32 j = 0; j < blockSize; ++j)\r
deviceState[j] = m.resultDataState[j];\r
\r
- programStateKnown = false;\r
messagesSent.removeRange (0, i + 1);\r
dumpStatus();\r
sendChanges (bi, false);\r
\r
void dumpStatus()\r
{\r
- #if JUCE_DUMP_LITTLEFOOT_HEAP_STATUS\r
+ #if DUMP_LITTLEFOOT_HEAP_STATUS\r
int differences = 0;\r
constexpr int diffLen = 50;\r
char areas[diffLen + 1] = { 0 };\r
float_ = 'f'\r
};\r
\r
-const int numBytesInType = 4;\r
-\r
//==============================================================================\r
/** Defines a native function that the program can call.\r
\r
The format of nameAndArgumentTypes is "name/[return type][arg1][arg2..]"\r
So for example "int foobar (float, bool)" would be "foobar/ifb"\r
*/\r
- NativeFunction (const char* nameAndArgumentTypes, ImplementationFunction fn)\r
+ NativeFunction (const char* nameAndArgumentTypes, ImplementationFunction fn) noexcept\r
: nameAndArguments (nameAndArgumentTypes), function (fn),\r
functionID (createID (nameAndArgumentTypes)), returnType(), numArgs()\r
{\r
- auto slash = indexOfSlash (nameAndArgumentTypes);\r
+ const int slash = indexOfSlash (nameAndArgumentTypes);\r
\r
if (slash > 0)\r
{\r
uint8 numArgs; /**< The number of arguments that the function takes. */\r
\r
/** Converts a function signature to its hashed ID. */\r
- static FunctionID createID (const char* nameAndArgTypes)\r
+ static FunctionID createID (const char* nameAndArgTypes) noexcept\r
{\r
- auto slash = indexOfSlash (nameAndArgTypes);\r
+ jassert (nameAndArgTypes != nullptr && nameAndArgTypes[0] != 0); // the name cannot be an empty string!\r
+ int hash = 0, i = 0;\r
+ const int slash = indexOfSlash (nameAndArgTypes);\r
\r
jassert (slash > 0); // The slash can't be the first character in this string!\r
jassert (nameAndArgTypes[slash + 1] != 0); // The slash must be followed by a return type character\r
jassert (juce::String (nameAndArgTypes).substring (slash + 1).containsOnly ("vifb"));\r
jassert (juce::String (nameAndArgTypes).substring (slash + 2).containsOnly ("ifb")); // arguments must only be of these types\r
\r
- uint32 hash = 0, i = 0;\r
-\r
for (; nameAndArgTypes[i] != 0; ++i)\r
- if (i != (uint32) (slash + 1))\r
- hash = hash * 31u + (uint32) nameAndArgTypes[i];\r
+ if (i != slash + 1)\r
+ hash = hash * 31 + nameAndArgTypes[i];\r
\r
return static_cast<FunctionID> (hash + i);\r
}\r
private:\r
static int indexOfSlash (const char* nameAndArgs) noexcept\r
{\r
- jassert (nameAndArgs != nullptr && nameAndArgs[0] != 0); // the name cannot be an empty string!\r
-\r
for (int i = 0; nameAndArgs[i] != 0; ++i)\r
if (nameAndArgs[i] == '/')\r
return i;\r
uint16 calculateChecksum() const noexcept\r
{\r
auto size = getProgramSize();\r
- auto n = (uint16) size;\r
+ uint16 n = (uint16) size;\r
\r
for (uint32 i = 2; i < size; ++i)\r
n += (n * 2) + programStart[i];\r
\r
//==============================================================================\r
static constexpr uint32 programHeaderSize = 10;\r
- const uint8* programStart = nullptr;\r
+ const uint8* programStart = 0;\r
const uint32 maxProgramSize;\r
\r
private:\r
message should be delivered, or from which it originated. The 0x40 bit of this will be set
to indicate that it's a device->host message, or clear for host->device
\r
-The next 32 bits are a timestamp, in milliseconds since the source device was booted.
+The next 32 bits are a timestamp, in milliseconds since the source device was booted.
If sending from the host to the device, or for types of packet \r
where the timestamp is irrelevant, this can be 0.\r
\r
10 bits - device firmware version\r
6 bits - battery status\r
\r
-Next follows by a series of connection-info blocks of the form:\r
+Next follows by a series of connection-info blocks of ths form:\r
\r
7 bits - device 1 index (i.e. index in the list of devices sent above)\r
5 bits - device 1 port type\r
firmwareUpdateACK = 0x03,\r
deviceTopologyExtend = 0x04,\r
deviceTopologyEnd = 0x05,\r
- deviceVersion = 0x06,\r
- deviceName = 0x07,\r
+ deviceVersionList = 0x06,\r
+ deviceNameList = 0x07,\r
\r
touchStart = 0x10,\r
touchMove = 0x11,\r
slideCC = 6,\r
slideMode = 7,\r
octaveTopology = 8,\r
- midiChannelRange = 9,\r
- MPEZone = 40,\r
// Touch\r
velocitySensitivity = 10,\r
glideSensitivity = 11,\r
updateUserConfig = 0x05, // As above but contains user config metadata\r
setConfigState = 0x06, // Set config activation state and whether it is saved in flash\r
factorySyncEnd = 0x07,\r
- clusterConfigSync = 0x08,\r
- factorySyncReset = 0x09\r
+ clusterConfigSync = 0x08\r
};\r
\r
using ConfigCommand = IntegerWithBitSize<4>;\r
if (! data.hasCapacity (MessageType::bits))\r
return false;\r
\r
- writeMessageType (MessageFromHost::factoryReset);\r
+ writeMessageType(MessageFromHost::factoryReset);\r
return true;\r
}\r
\r
if (! data.hasCapacity (MessageType::bits))\r
return false;\r
\r
- writeMessageType (MessageFromHost::blockReset);\r
+ writeMessageType(MessageFromHost::blockReset);\r
return true;\r
}\r
\r
auto packetTimestamp = reader.read<PacketTimestamp>();\r
deviceIndex &= 63; // top bit is used as a direction indicator\r
\r
- for (;;)\r
- {\r
- auto nextMessageType = getMessageType (reader);\r
-\r
- if (nextMessageType == 0)\r
- break;\r
-\r
- if (! processNextMessage (handler, reader, (MessageFromDevice) nextMessageType, deviceIndex, packetTimestamp))\r
- break;\r
- }\r
+ while (processNextMessage (handler, reader, deviceIndex, packetTimestamp))\r
+ {}\r
}\r
}\r
\r
- static uint32 getMessageType (Packed7BitArrayReader& reader)\r
+ static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,\r
+ TopologyIndex deviceIndex, PacketTimestamp packetTimestamp)\r
{\r
if (reader.getRemainingBits() < MessageType::bits)\r
- return 0;\r
+ return false;\r
\r
- return reader.read<MessageType>().get();\r
- }\r
+ auto messageType = reader.read<MessageType>().get();\r
\r
- static bool processNextMessage (Handler& handler, Packed7BitArrayReader& reader,\r
- MessageFromDevice messageType, TopologyIndex deviceIndex,\r
- PacketTimestamp packetTimestamp)\r
- {\r
- switch (messageType)\r
+ if (messageType == 0)\r
+ return false;\r
+\r
+ switch ((MessageFromDevice) messageType)\r
{\r
case MessageFromDevice::deviceTopology: return handleTopology (handler, reader, true);\r
case MessageFromDevice::deviceTopologyExtend: return handleTopology (handler, reader, false);\r
case MessageFromDevice::deviceTopologyEnd: return handleTopologyEnd (handler, reader);\r
- case MessageFromDevice::deviceVersion: return handleVersion (handler, reader);\r
- case MessageFromDevice::deviceName: return handleName (handler, reader);\r
+ case MessageFromDevice::deviceVersionList: return handleVersion (handler, reader);\r
+ case MessageFromDevice::deviceNameList: return handleName (handler, reader);\r
case MessageFromDevice::touchStart: return handleTouch (handler, reader, deviceIndex, packetTimestamp, true, false);\r
case MessageFromDevice::touchMove: return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, false);\r
case MessageFromDevice::touchEnd: return handleTouch (handler, reader, deviceIndex, packetTimestamp, false, true);\r
return false;\r
}\r
\r
- auto ackCode = reader.read<FirmwareUpdateACKCode>();\r
- auto ackDetail = reader.read<FirmwareUpdateACKDetail>();\r
-\r
- handler.handleFirmwareUpdateACK (deviceIndex, ackCode, ackDetail);\r
+ handler.handleFirmwareUpdateACK (deviceIndex, reader.read<FirmwareUpdateACKCode>(), reader.read<FirmwareUpdateACKDetail>());\r
return true;\r
}\r
\r
handler.handleConfigFactorySyncEndMessage (deviceIndex);\r
}\r
\r
- if (type == factorySyncReset)\r
- {\r
- handler.handleConfigFactorySyncResetMessage (deviceIndex);\r
- }\r
-\r
return true;\r
}\r
\r
namespace juce\r
{\r
\r
-//==============================================================================\r
-/** These can be useful when debugging the topology. */\r
-#define LOG_BLOCKS_CONNECTIVITY 0\r
-#define LOG_BLOCKS_PINGS 0\r
-#define DUMP_BANDWIDTH_STATS 0\r
-\r
-#define TOPOLOGY_LOG(text) \\r
- JUCE_BLOCK_WITH_FORCED_SEMICOLON (juce::String buf ("Topology Src: "); \\r
- juce::Logger::outputDebugString (buf << text);)\r
-\r
-#if LOG_BLOCKS_CONNECTIVITY\r
- #define LOG_CONNECTIVITY(text) TOPOLOGY_LOG(text)\r
-#else\r
- #define LOG_CONNECTIVITY(text)\r
-#endif\r
-\r
-#if LOG_BLOCKS_PINGS\r
- #define LOG_PING(text) TOPOLOGY_LOG(text)\r
-#else\r
- #define LOG_PING(text)\r
-#endif\r
+#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
+ jassert (juce::MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
#if DUMP_BANDWIDTH_STATS\r
namespace\r
}\r
#endif\r
\r
+\r
//==============================================================================\r
struct PhysicalTopologySource::Internal\r
{\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MIDIDeviceConnection)\r
};\r
\r
- //==============================================================================\r
struct MIDIDeviceDetector : public DeviceDetector\r
{\r
MIDIDeviceDetector() {}\r
\r
if (dev->lockAgainstOtherProcesses (pair.inputName, pair.outputName))\r
{\r
- lockedFromOutside = false;\r
-\r
dev->midiInput.reset (juce::MidiInput::openDevice (pair.inputIndex, dev.get()));\r
dev->midiOutput.reset (juce::MidiOutput::openDevice (pair.outputIndex));\r
\r
return dev.release();\r
}\r
}\r
- else\r
- {\r
- lockedFromOutside = true;\r
- }\r
}\r
\r
return nullptr;\r
}\r
\r
- bool isLockedFromOutside() const override\r
- {\r
- return lockedFromOutside && ! findDevices().isEmpty();\r
- }\r
-\r
static bool isBlocksMidiDeviceName (const juce::String& name)\r
{\r
return name.indexOf (" BLOCK") > 0 || name.indexOf (" Block") > 0;\r
return result;\r
}\r
\r
- private:\r
- bool lockedFromOutside = true;\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MIDIDeviceDetector)\r
};\r
\r
//==============================================================================\r
struct DeviceInfo\r
{\r
- // VS2015 requires a constructor to avoid aggregate initialization\r
- DeviceInfo (Block::UID buid, BlocksProtocol::TopologyIndex tidx, BlocksProtocol::BlockSerialNumber s,\r
- BlocksProtocol::VersionNumber v, BlocksProtocol::BlockName n, bool master = false)\r
- : uid (buid), index (tidx), serial (s), version (v), name (n), isMaster (master)\r
- {\r
- }\r
-\r
- Block::UID uid {};\r
+ Block::UID uid;\r
BlocksProtocol::TopologyIndex index;\r
BlocksProtocol::BlockSerialNumber serial;\r
BlocksProtocol::VersionNumber version;\r
BlocksProtocol::BlockName name;\r
- bool isMaster {};\r
+ bool isMaster;\r
};\r
\r
- static juce::String getVersionString (const BlocksProtocol::VersionNumber& v)\r
- {\r
- return juce::String (reinterpret_cast<const char*> (v.version),\r
- std::min (sizeof (v.version), static_cast<size_t> (v.length)));\r
- }\r
-\r
- static juce::String getNameString (const BlocksProtocol::BlockName& n)\r
- {\r
- return juce::String (reinterpret_cast<const char*> (n.name),\r
- std::min (sizeof (n.name), static_cast<size_t> (n.length)));\r
- }\r
-\r
static Block::Timestamp deviceTimestampToHost (uint32 timestamp) noexcept\r
{\r
return static_cast<Block::Timestamp> (timestamp);\r
static juce::Array<DeviceInfo> getArrayOfDeviceInfo (const juce::Array<BlocksProtocol::DeviceStatus>& devices)\r
{\r
juce::Array<DeviceInfo> result;\r
- bool isFirst = true; // TODO: First block not always master block! Assumption violated.\r
+ bool isFirst = true;\r
\r
for (auto& device : devices)\r
{\r
return result;\r
}\r
\r
+ static bool containsBlockWithUID (const juce::Array<DeviceInfo>& devices, Block::UID uid) noexcept\r
+ {\r
+ for (auto&& d : devices)\r
+ if (d.uid == uid)\r
+ return true;\r
+\r
+ return false;\r
+ }\r
+\r
static bool containsBlockWithUID (const Block::Array& blocks, Block::UID uid) noexcept\r
{\r
for (auto&& block : blocks)\r
return false;\r
}\r
\r
- static bool versionNumberChanged (const DeviceInfo& device, juce::String version) noexcept\r
+ static bool versionNumberAddedToBlock (const juce::Array<DeviceInfo>& devices, Block::UID uid, juce::String version) noexcept\r
{\r
- auto deviceVersion = getVersionString (device.version);\r
- return deviceVersion != version && deviceVersion.isNotEmpty();\r
+ for (auto&& d : devices)\r
+ {\r
+ String deviceVersion (reinterpret_cast<const char*> (d.version.version),\r
+ jmin (static_cast<size_t> (d.version.length), sizeof (d.version.version)));\r
+\r
+ if (d.uid == uid && deviceVersion != version && deviceVersion.isNotEmpty())\r
+ return true;\r
+ }\r
+\r
+ return false;\r
}\r
\r
- static bool nameIsValid (const DeviceInfo& device)\r
+ static bool nameAddedToBlock (const juce::Array<DeviceInfo>& devices, Block::UID uid) noexcept\r
{\r
- return device.name.length > 0;\r
+ for (auto&& d : devices)\r
+ if (d.uid == uid && d.name.length)\r
+ return true;\r
+\r
+ return false;\r
}\r
\r
- static void setVersionNumberForBlock (const DeviceInfo& deviceInfo, Block& block) noexcept\r
+ static void setVersionNumberForBlock (const juce::Array<DeviceInfo>& devices, Block& block) noexcept\r
{\r
- jassert (deviceInfo.uid == block.uid);\r
- block.versionNumber = getVersionString (deviceInfo.version);\r
+ for (auto&& d : devices)\r
+ if (d.uid == block.uid)\r
+ block.versionNumber = juce::String ((const char*) d.version.version, d.version.length);\r
}\r
\r
- static void setNameForBlock (const DeviceInfo& deviceInfo, Block& block)\r
+ static void setNameForBlock (const juce::Array<DeviceInfo>& devices, Block& block) noexcept\r
{\r
- jassert (deviceInfo.uid == block.uid);\r
- block.name = getNameString (deviceInfo.name);\r
+ for (auto&& d : devices)\r
+ if (d.uid == block.uid)\r
+ block.name = juce::String ((const char*) d.name.name, d.name.length);\r
}\r
\r
//==============================================================================\r
ConnectedDeviceGroup (Detector& d, const juce::String& name, DeviceConnection* connection)\r
: detector (d), deviceName (name), deviceConnection (connection)\r
{\r
+ lastGlobalPingTime = juce::Time::getCurrentTime();\r
+\r
deviceConnection->handleMessageFromDevice = [this] (const void* data, size_t dataSize)\r
{\r
this->handleIncomingMessage (data, dataSize);\r
bool isStillConnected (const juce::StringArray& detectedDevices) const noexcept\r
{\r
return detectedDevices.contains (deviceName)\r
- && ! failedToGetTopology();\r
+ && ! failedToGetTopology()\r
+ && lastGlobalPingTime > juce::Time::getCurrentTime() - juce::RelativeTime::seconds (pingTimeoutSeconds);\r
+ }\r
+\r
+ Block::UID getDeviceIDFromIndex (BlocksProtocol::TopologyIndex index) const noexcept\r
+ {\r
+ for (auto& d : currentDeviceInfo)\r
+ if (d.index == index)\r
+ return d.uid;\r
+\r
+ return {};\r
}\r
\r
int getIndexFromDeviceID (Block::UID uid) const noexcept\r
return nullptr;\r
}\r
\r
- void notifyBlockIsRestarting (Block::UID deviceID)\r
+ //==============================================================================\r
+ juce::Time lastTopologyRequestTime, lastTopologyReceiveTime;\r
+ int numTopologyRequestsSent = 0;\r
+\r
+ void sendTopologyRequest()\r
+ {\r
+ ++numTopologyRequestsSent;\r
+ lastTopologyRequestTime = juce::Time::getCurrentTime();\r
+ sendCommandMessage (0, BlocksProtocol::requestTopologyMessage);\r
+ }\r
+\r
+ void scheduleNewTopologyRequest()\r
{\r
- forceApiDisconnected (deviceID);\r
+ numTopologyRequestsSent = 0;\r
+ lastTopologyReceiveTime = juce::Time();\r
+ }\r
+\r
+ bool failedToGetTopology() const noexcept\r
+ {\r
+ return numTopologyRequestsSent > 4 && lastTopologyReceiveTime == juce::Time();\r
+ }\r
+\r
+ bool hasAnyBlockStoppedPinging() const noexcept\r
+ {\r
+ auto now = juce::Time::getCurrentTime();\r
+\r
+ for (auto& ping : blockPings)\r
+ if (ping.lastPing < now - juce::RelativeTime::seconds (pingTimeoutSeconds))\r
+ return true;\r
+\r
+ return false;\r
+ }\r
+\r
+ void timerCallback() override\r
+ {\r
+ auto now = juce::Time::getCurrentTime();\r
+\r
+ if ((now > lastTopologyReceiveTime + juce::RelativeTime::seconds (30.0) || hasAnyBlockStoppedPinging())\r
+ && now > lastTopologyRequestTime + juce::RelativeTime::seconds (1.0)\r
+ && numTopologyRequestsSent < 4)\r
+ sendTopologyRequest();\r
}\r
\r
//==============================================================================\r
currentDeviceInfo = getArrayOfDeviceInfo (incomingTopologyDevices);\r
currentDeviceConnections = getArrayOfConnections (incomingTopologyConnections);\r
currentTopologyDevices = incomingTopologyDevices;\r
- lastTopologyReceiveTime = juce::Time::getCurrentTime();\r
-\r
- const int numRemoved = blockPings.removeIf ([this] (auto& ping)\r
- {\r
- for (auto& info : currentDeviceInfo)\r
- if (info.uid == ping.blockUID)\r
- return false;\r
-\r
- LOG_CONNECTIVITY ("API Disconnected by topology update " << ping.blockUID);\r
- return true;\r
- });\r
+ currentTopologyConnections = incomingTopologyConnections;\r
+ detector.handleTopologyChange();\r
\r
- if (numRemoved > 0)\r
- detector.handleTopologyChange();\r
+ lastTopologyReceiveTime = juce::Time::getCurrentTime();\r
+ blockPings.clear();\r
}\r
\r
void handleVersion (BlocksProtocol::DeviceVersion version)\r
{\r
- for (auto& d : currentDeviceInfo)\r
- if (d.index == version.index && version.version.length > 1)\r
- d.version = version.version;\r
+ for (auto i = 0; i < currentDeviceInfo.size(); ++i)\r
+ {\r
+ if (currentDeviceInfo[i].index == version.index && version.version.length > 1)\r
+ {\r
+ if (memcmp (currentDeviceInfo.getReference (i).version.version, version.version.version, sizeof (version.version)))\r
+ {\r
+ currentDeviceInfo.getReference(i).version = version.version;\r
+ detector.handleTopologyChange();\r
+ }\r
+ }\r
+ }\r
}\r
\r
void handleName (BlocksProtocol::DeviceName name)\r
{\r
- for (auto& d : currentDeviceInfo)\r
- if (d.index == name.index && name.name.length > 1)\r
- d.name = name.name;\r
+ for (auto i = 0; i < currentDeviceInfo.size(); ++i)\r
+ {\r
+ if (currentDeviceInfo[i].index == name.index && name.name.length > 1)\r
+ {\r
+ if (memcmp (currentDeviceInfo.getReference (i).name.name, name.name.name, sizeof (name.name)))\r
+ {\r
+ currentDeviceInfo.getReference (i).name = name.name;\r
+ detector.handleTopologyChange();\r
+ }\r
+ }\r
+ }\r
}\r
\r
void handleControlButtonUpDown (BlocksProtocol::TopologyIndex deviceIndex, uint32 timestamp,\r
touch.startY = startPos.y;\r
}\r
\r
- void handlePacketACK (BlocksProtocol::TopologyIndex deviceIndex,\r
- BlocksProtocol::PacketCounter counter)\r
+ void handlePacketACK (BlocksProtocol::TopologyIndex deviceIndex, BlocksProtocol::PacketCounter counter)\r
{\r
if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
- {\r
detector.handleSharedDataACK (deviceID, counter);\r
- updateApiPing (deviceID);\r
- }\r
}\r
\r
- void handleFirmwareUpdateACK (BlocksProtocol::TopologyIndex deviceIndex,\r
- BlocksProtocol::FirmwareUpdateACKCode resultCode,\r
- BlocksProtocol::FirmwareUpdateACKDetail resultDetail)\r
+ void handleFirmwareUpdateACK (BlocksProtocol::TopologyIndex deviceIndex, BlocksProtocol::FirmwareUpdateACKCode resultCode, BlocksProtocol::FirmwareUpdateACKDetail resultDetail)\r
{\r
if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
- {\r
detector.handleFirmwareUpdateACK (deviceID, (uint8) resultCode.get(), (uint32) resultDetail.get());\r
- updateApiPing (deviceID);\r
- }\r
}\r
\r
- void handleConfigUpdateMessage (BlocksProtocol::TopologyIndex deviceIndex,\r
- int32 item, int32 value, int32 min, int32 max)\r
+ void handleConfigUpdateMessage (BlocksProtocol::TopologyIndex deviceIndex, int32 item, int32 value, int32 min, int32 max)\r
{\r
if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
detector.handleConfigUpdateMessage (deviceID, item, value, min, max);\r
}\r
\r
- void handleConfigSetMessage (BlocksProtocol::TopologyIndex deviceIndex,\r
- int32 item, int32 value)\r
+ void handleConfigSetMessage (BlocksProtocol::TopologyIndex deviceIndex, int32 item, int32 value)\r
{\r
if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
detector.handleConfigSetMessage (deviceID, item, value);\r
detector.handleConfigFactorySyncEndMessage (deviceID);\r
}\r
\r
- void handleConfigFactorySyncResetMessage (BlocksProtocol::TopologyIndex deviceIndex)\r
- {\r
- if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
- detector.handleConfigFactorySyncResetMessage (deviceID);\r
- }\r
-\r
void handleLogMessage (BlocksProtocol::TopologyIndex deviceIndex, const String& message)\r
{\r
if (auto deviceID = getDeviceIDFromMessageIndex (deviceIndex))\r
return false;\r
}\r
\r
- DeviceConnection* getDeviceConnection()\r
+ bool sendCommandMessage (BlocksProtocol::TopologyIndex deviceIndex, uint32 commandID) const\r
{\r
- return deviceConnection.get();\r
+ BlocksProtocol::HostPacketBuilder<64> p;\r
+ p.writePacketSysexHeaderBytes (deviceIndex);\r
+ p.deviceControlMessage (commandID);\r
+ p.writePacketSysexFooter();\r
+ return sendMessageToDevice (p);\r
}\r
\r
- juce::Array<DeviceInfo> getCurrentDeviceInfo()\r
+ bool broadcastCommandMessage (uint32 commandID) const\r
{\r
- auto blocks = currentDeviceInfo;\r
- blocks.removeIf ([this] (DeviceInfo& info) { return ! isApiConnected (info.uid); });\r
- return blocks;\r
+ return sendCommandMessage (BlocksProtocol::topologyIndexForBroadcast, commandID);\r
}\r
\r
- juce::Array<BlockDeviceConnection> getCurrentDeviceConnections()\r
+ DeviceConnection* getDeviceConnection()\r
{\r
- auto connections = currentDeviceConnections;\r
- connections.removeIf ([this] (BlockDeviceConnection& c) { return ! isApiConnected (c.device1) || ! isApiConnected (c.device2); });\r
- return connections;\r
+ return deviceConnection.get();\r
}\r
\r
Detector& detector;\r
juce::String deviceName;\r
\r
+ juce::Array<DeviceInfo> currentDeviceInfo;\r
+ juce::Array<BlockDeviceConnection> currentDeviceConnections;\r
+\r
static constexpr double pingTimeoutSeconds = 6.0;\r
\r
private:\r
//==============================================================================\r
- juce::Array<DeviceInfo> currentDeviceInfo;\r
- juce::Array<BlockDeviceConnection> currentDeviceConnections;\r
std::unique_ptr<DeviceConnection> deviceConnection;\r
\r
juce::Array<BlocksProtocol::DeviceStatus> incomingTopologyDevices, currentTopologyDevices;\r
- juce::Array<BlocksProtocol::DeviceConnection> incomingTopologyConnections;\r
+ juce::Array<BlocksProtocol::DeviceConnection> incomingTopologyConnections, currentTopologyConnections;\r
\r
juce::CriticalSection incomingPacketLock;\r
juce::Array<juce::MemoryBlock> incomingPackets;\r
\r
- struct TouchStart { float x, y; };\r
- TouchList<TouchStart> touchStartPositions;\r
-\r
- //==============================================================================\r
- juce::Time lastTopologyRequestTime, lastTopologyReceiveTime;\r
- int numTopologyRequestsSent = 0;\r
-\r
- void scheduleNewTopologyRequest()\r
- {\r
- numTopologyRequestsSent = 0;\r
- lastTopologyReceiveTime = juce::Time();\r
- lastTopologyRequestTime = juce::Time::getCurrentTime();\r
- }\r
-\r
- void sendTopologyRequest()\r
- {\r
- ++numTopologyRequestsSent;\r
- lastTopologyRequestTime = juce::Time::getCurrentTime();\r
- sendCommandMessage (0, BlocksProtocol::requestTopologyMessage);\r
- }\r
-\r
- void timerCallback() override\r
+ struct TouchStart\r
{\r
- const auto now = juce::Time::getCurrentTime();\r
-\r
- if ((now > lastTopologyReceiveTime + juce::RelativeTime::seconds (30.0))\r
- && now > lastTopologyRequestTime + juce::RelativeTime::seconds (1.0)\r
- && numTopologyRequestsSent < 4)\r
- sendTopologyRequest();\r
-\r
- checkApiTimeouts (now);\r
- startApiModeOnConnectedBlocks();\r
- }\r
+ float x, y;\r
+ };\r
\r
- bool failedToGetTopology() const noexcept\r
- {\r
- return numTopologyRequestsSent > 4 && lastTopologyReceiveTime == juce::Time();\r
- }\r
+ TouchList<TouchStart> touchStartPositions;\r
\r
- bool sendCommandMessage (BlocksProtocol::TopologyIndex deviceIndex, uint32 commandID) const\r
- {\r
- BlocksProtocol::HostPacketBuilder<64> p;\r
- p.writePacketSysexHeaderBytes (deviceIndex);\r
- p.deviceControlMessage (commandID);\r
- p.writePacketSysexFooter();\r
- return sendMessageToDevice (p);\r
- }\r
+ juce::Time lastGlobalPingTime;\r
\r
- //==============================================================================\r
struct BlockPingTime\r
{\r
Block::UID blockUID;\r
\r
juce::Array<BlockPingTime> blockPings;\r
\r
- void updateApiPing (Block::UID uid)\r
+ Block::UID getDeviceIDFromMessageIndex (BlocksProtocol::TopologyIndex index) noexcept\r
{\r
- const auto now = juce::Time::getCurrentTime();\r
+ auto uid = getDeviceIDFromIndex (index);\r
\r
- if (auto* ping = getPing (uid))\r
+ if (uid == Block::UID())\r
{\r
- LOG_PING ("Ping: " << uid << " " << now.formatted ("%Mm %Ss"));\r
- ping->lastPing = now;\r
+ scheduleNewTopologyRequest(); // force a re-request of the topology when we\r
+ // get an event from a block that we don't know about\r
}\r
else\r
{\r
- LOG_CONNECTIVITY ("API Connected " << uid);\r
- blockPings.add ({ uid, now });\r
- detector.handleTopologyChange();\r
- }\r
- }\r
+ auto now = juce::Time::getCurrentTime();\r
\r
- BlockPingTime* getPing (Block::UID uid)\r
- {\r
- for (auto& ping : blockPings)\r
- if (uid == ping.blockUID)\r
- return &ping;\r
-\r
- return nullptr;\r
- }\r
-\r
- void removeDeviceInfo (Block::UID uid)\r
- {\r
- currentDeviceInfo.removeIf ([uid] (DeviceInfo& info) { return uid == info.uid; });\r
- }\r
-\r
- bool isApiConnected (Block::UID uid)\r
- {\r
- return getPing (uid) != nullptr;\r
- }\r
-\r
- void forceApiDisconnected (Block::UID uid)\r
- {\r
- if (isApiConnected (uid))\r
- {\r
- // Clear all known API connections and broadcast an empty topology,\r
- // as DNA blocks connected to the restarting block may be offline.\r
- LOG_CONNECTIVITY ("API Disconnected " << uid << ", re-probing topology");\r
- currentDeviceInfo.clearQuick();\r
- blockPings.clearQuick();\r
- detector.handleTopologyChange();\r
- scheduleNewTopologyRequest();\r
- }\r
- }\r
-\r
- void checkApiTimeouts (juce::Time now)\r
- {\r
- const auto timedOut = [this, now] (BlockPingTime& ping)\r
- {\r
- if (ping.lastPing >= now - juce::RelativeTime::seconds (pingTimeoutSeconds))\r
- return false;\r
-\r
- LOG_CONNECTIVITY ("Ping timeout: " << ping.blockUID);\r
- removeDeviceInfo (ping.blockUID);\r
- return true;\r
- };\r
-\r
- if (blockPings.removeIf (timedOut) > 0)\r
- {\r
- scheduleNewTopologyRequest();\r
- detector.handleTopologyChange();\r
- }\r
- }\r
-\r
- void startApiModeOnConnectedBlocks()\r
- {\r
- for (auto& info : currentDeviceInfo)\r
- {\r
- if (! isApiConnected (info.uid))\r
+ for (auto& ping : blockPings)\r
{\r
- LOG_CONNECTIVITY ("API Try " << info.uid);\r
- sendCommandMessage (info.index, BlocksProtocol::endAPIMode);\r
- sendCommandMessage (info.index, BlocksProtocol::beginAPIMode);\r
+ if (ping.blockUID == uid)\r
+ {\r
+ ping.lastPing = now;\r
+ return uid;\r
+ }\r
}\r
- }\r
- }\r
-\r
- //==============================================================================\r
- Block::UID getDeviceIDFromIndex (BlocksProtocol::TopologyIndex index) const noexcept\r
- {\r
- for (auto& d : currentDeviceInfo)\r
- if (d.index == index)\r
- return d.uid;\r
-\r
- return {};\r
- }\r
-\r
- Block::UID getDeviceIDFromMessageIndex (BlocksProtocol::TopologyIndex index) noexcept\r
- {\r
- const auto uid = getDeviceIDFromIndex (index);\r
\r
- // re-request topology if we get an event from an unknown block\r
- if (uid == Block::UID())\r
- scheduleNewTopologyRequest();\r
+ blockPings.add ({ uid, now });\r
+ }\r
\r
return uid;\r
}\r
BlockDeviceConnection dc;\r
dc.device1 = getDeviceIDFromIndex (c.device1);\r
dc.device2 = getDeviceIDFromIndex (c.device2);\r
-\r
- if (dc.device1 <= 0 || dc.device2 <= 0)\r
- continue;\r
-\r
dc.connectionPortOnDevice1 = convertConnectionPort (dc.device1, c.port1);\r
dc.connectionPortOnDevice2 = convertConnectionPort (dc.device2, c.port2);\r
\r
BlocksProtocol::HostPacketDecoder<ConnectedDeviceGroup>\r
::processNextPacket (*this, *data, data + 1, (int) packet.getSize() - 1);\r
}\r
+\r
+ lastGlobalPingTime = juce::Time::getCurrentTime();\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectedDeviceGroup)\r
{\r
Detector() : defaultDetector (new MIDIDeviceDetector()), deviceDetector (*defaultDetector)\r
{\r
+ topologyBroadcastThrottle.detector = this;\r
startTimer (10);\r
}\r
\r
Detector (DeviceDetector& dd) : deviceDetector (dd)\r
{\r
+ topologyBroadcastThrottle.detector = this;\r
startTimer (10);\r
}\r
\r
~Detector()\r
{\r
jassert (activeTopologySources.isEmpty());\r
+ jassert (activeControlButtons.isEmpty());\r
}\r
\r
using Ptr = juce::ReferenceCountedObjectPtr<Detector>;\r
bi->sendCommandMessage (BlocksProtocol::endAPIMode);\r
\r
currentTopology = {};\r
- lastTopology = {};\r
+ topologyBroadcastThrottle.lastTopology = {};\r
\r
auto& d = getDefaultDetectorPointer();\r
\r
\r
for (auto d : connectedDeviceGroups)\r
{\r
- newDeviceInfo.addArray (d->getCurrentDeviceInfo());\r
- newDeviceConnections.addArray (d->getCurrentDeviceConnections());\r
+ newDeviceInfo.addArray (d->currentDeviceInfo);\r
+ newDeviceConnections.addArray (d->currentDeviceConnections);\r
}\r
\r
for (int i = currentTopology.blocks.size(); --i >= 0;)\r
{\r
- auto currentBlock = currentTopology.blocks.getUnchecked (i);\r
-\r
- auto newDeviceIter = std::find_if (newDeviceInfo.begin(), newDeviceInfo.end(),\r
- [&] (DeviceInfo& info) { return info.uid == currentBlock->uid; });\r
-\r
- auto* blockImpl = BlockImplementation::getFrom (*currentBlock);\r
+ auto block = currentTopology.blocks.getUnchecked (i);\r
\r
- if (newDeviceIter == newDeviceInfo.end())\r
+ if (! containsBlockWithUID (newDeviceInfo, block->uid))\r
{\r
- if (blockImpl != nullptr)\r
- blockImpl->markDisconnected();\r
+ if (auto bi = BlockImplementation::getFrom (*block))\r
+ bi->invalidate();\r
\r
- disconnectedBlocks.addIfNotAlreadyThere (currentTopology.blocks.removeAndReturn (i).get());\r
+ currentTopology.blocks.remove (i);\r
}\r
else\r
{\r
- if (blockImpl != nullptr && blockImpl->wasPowerCycled())\r
- {\r
- blockImpl->resetPowerCycleFlag();\r
- blockImpl->markReconnected (newDeviceIter->version, newDeviceIter->name, newDeviceIter->isMaster);\r
- }\r
+ if (versionNumberAddedToBlock (newDeviceInfo, block->uid, block->versionNumber))\r
+ setVersionNumberForBlock (newDeviceInfo, *block);\r
\r
- updateCurrentBlockInfo (currentBlock, *newDeviceIter);\r
+ if (nameAddedToBlock (newDeviceInfo, block->uid))\r
+ setNameForBlock (newDeviceInfo, *block);\r
}\r
}\r
\r
- static const int maxBlocksToSave = 100;\r
-\r
- if (disconnectedBlocks.size() > maxBlocksToSave)\r
- disconnectedBlocks.removeRange (0, 2 * (disconnectedBlocks.size() - maxBlocksToSave));\r
-\r
for (auto& info : newDeviceInfo)\r
- if (info.serial.isValid() && ! containsBlockWithUID (currentTopology.blocks, getBlockUIDFromSerialNumber (info.serial)))\r
- addBlock (info);\r
+ if (info.serial.isValid())\r
+ if (! containsBlockWithUID (currentTopology.blocks, getBlockUIDFromSerialNumber (info.serial)))\r
+ currentTopology.blocks.add (new BlockImplementation (info.serial, *this, info.version, info.name, info.isMaster));\r
\r
currentTopology.connections.swapWith (newDeviceConnections);\r
}\r
\r
- broadcastTopology();\r
- }\r
-\r
- void notifyBlockIsRestarting (Block::UID deviceID)\r
- {\r
- for (auto& group : connectedDeviceGroups)\r
- group->notifyBlockIsRestarting (deviceID);\r
+ topologyBroadcastThrottle.scheduleTopologyChangeCallback();\r
}\r
\r
void handleSharedDataACK (Block::UID deviceID, uint32 packetCounter) const\r
{\r
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->handleSharedDataACK (packetCounter);\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ bi->handleSharedDataACK (packetCounter);\r
}\r
\r
void handleFirmwareUpdateACK (Block::UID deviceID, uint8 resultCode, uint32 resultDetail)\r
{\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->handleFirmwareUpdateACK (resultCode, resultDetail);\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ bi->handleFirmwareUpdateACK (resultCode, resultDetail);\r
}\r
\r
void handleConfigUpdateMessage (Block::UID deviceID, int32 item, int32 value, int32 min, int32 max)\r
{\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->handleConfigUpdateMessage (item, value, min, max);\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ bi->handleConfigUpdateMessage (item, value, min, max);\r
}\r
\r
void notifyBlockOfConfigChange (BlockImplementation& bi, uint32 item)\r
\r
void handleConfigSetMessage (Block::UID deviceID, int32 item, int32 value)\r
{\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
+ for (auto&& b : currentTopology.blocks)\r
{\r
- bi->handleConfigSetMessage (item, value);\r
- notifyBlockOfConfigChange (*bi, uint32 (item));\r
+ if (b->uid == deviceID)\r
+ {\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ {\r
+ bi->handleConfigSetMessage (item, value);\r
+ notifyBlockOfConfigChange (*bi, uint32 (item));\r
+ }\r
+ }\r
}\r
}\r
\r
void handleConfigFactorySyncEndMessage (Block::UID deviceID)\r
{\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- notifyBlockOfConfigChange (*bi, bi->getMaxConfigIndex());\r
- }\r
-\r
- void handleConfigFactorySyncResetMessage (Block::UID deviceID)\r
- {\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->resetConfigListActiveStatus();\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ notifyBlockOfConfigChange (*bi, bi->getMaxConfigIndex());\r
}\r
\r
void handleLogMessage (Block::UID deviceID, const String& message) const\r
{\r
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->handleLogMessage (message);\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ bi->handleLogMessage (message);\r
}\r
\r
void handleButtonChange (Block::UID deviceID, Block::Timestamp timestamp, uint32 buttonIndex, bool isDown) const\r
{\r
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
+ for (auto b : activeControlButtons)\r
{\r
- bi->pingFromDevice();\r
+ if (b->block.uid == deviceID)\r
+ {\r
+ if (auto bi = BlockImplementation::getFrom (b->block))\r
+ {\r
+ bi->pingFromDevice();\r
\r
- if (isPositiveAndBelow (buttonIndex, bi->getButtons().size()))\r
- if (auto* cbi = dynamic_cast<ControlButtonImplementation*> (bi->getButtons().getUnchecked (int (buttonIndex))))\r
- cbi->broadcastButtonChange (timestamp, bi->modelData.buttons[(int) buttonIndex].type, isDown);\r
+ if (buttonIndex < (uint32) bi->modelData.buttons.size())\r
+ b->broadcastButtonChange (timestamp, bi->modelData.buttons[(int) buttonIndex].type, isDown);\r
+ }\r
+ }\r
}\r
}\r
\r
{\r
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
- auto block = currentTopology.getBlockWithUID (deviceID);\r
- if (block != nullptr)\r
+ for (auto t : activeTouchSurfaces)\r
{\r
- if (auto* surface = dynamic_cast<TouchSurfaceImplementation*> (block->getTouchSurface()))\r
+ if (t->block.uid == deviceID)\r
{\r
TouchSurface::Touch scaledEvent (touchEvent);\r
\r
- scaledEvent.x *= block->getWidth();\r
- scaledEvent.y *= block->getHeight();\r
- scaledEvent.startX *= block->getWidth();\r
- scaledEvent.startY *= block->getHeight();\r
+ scaledEvent.x *= t->block.getWidth();\r
+ scaledEvent.y *= t->block.getHeight();\r
+ scaledEvent.startX *= t->block.getWidth();\r
+ scaledEvent.startY *= t->block.getHeight();\r
\r
- surface->broadcastTouchChange (scaledEvent);\r
+ t->broadcastTouchChange (scaledEvent);\r
}\r
}\r
}\r
\r
void cancelAllActiveTouches() noexcept\r
{\r
- for (auto& block : currentTopology.blocks)\r
- if (auto* surface = block->getTouchSurface())\r
- surface->cancelAllActiveTouches();\r
+ for (auto surface : activeTouchSurfaces)\r
+ surface->cancelAllActiveTouches();\r
}\r
\r
void handleCustomMessage (Block::UID deviceID, Block::Timestamp timestamp, const int32* data)\r
{\r
- if (auto* bi = getBlockImplementationWithUID (deviceID))\r
- bi->handleCustomMessage (timestamp, data);\r
+ for (auto&& b : currentTopology.blocks)\r
+ if (b->uid == deviceID)\r
+ if (auto bi = BlockImplementation::getFrom (*b))\r
+ bi->handleCustomMessage (timestamp, data);\r
}\r
\r
//==============================================================================\r
static Detector* getFrom (Block& b) noexcept\r
{\r
if (auto* bi = BlockImplementation::getFrom (b))\r
- return (bi->detector);\r
+ return &(bi->detector);\r
\r
jassertfalse;\r
return nullptr;\r
{\r
for (const auto& d : connectedDeviceGroups)\r
{\r
- for (const auto& info : d->getCurrentDeviceInfo())\r
- {\r
- if (info.uid == b.uid)\r
- return d->getDeviceConnection();\r
- }\r
- }\r
-\r
- return nullptr;\r
- }\r
-\r
- const DeviceConnection* getDeviceConnectionFor (const Block& b) const\r
- {\r
- for (const auto& d : connectedDeviceGroups)\r
- {\r
- for (const auto& info : d->getCurrentDeviceInfo())\r
+ for (const auto& info : d->currentDeviceInfo)\r
{\r
if (info.uid == b.uid)\r
return d->getDeviceConnection();\r
DeviceDetector& deviceDetector;\r
\r
juce::Array<PhysicalTopologySource*> activeTopologySources;\r
+ juce::Array<ControlButtonImplementation*> activeControlButtons;\r
+ juce::Array<TouchSurfaceImplementation*> activeTouchSurfaces;\r
\r
- BlockTopology currentTopology, lastTopology;\r
- juce::ReferenceCountedArray<Block, CriticalSection> disconnectedBlocks;\r
+ BlockTopology currentTopology;\r
\r
private:\r
void timerCallback() override\r
\r
if (anyDevicesRemoved)\r
handleTopologyChange();\r
- }\r
-\r
- void handleDevicesAdded (const juce::StringArray& detectedDevices)\r
- {\r
- for (const auto& devName : detectedDevices)\r
- {\r
- if (! hasDeviceFor (devName))\r
- {\r
- if (auto d = deviceDetector.openDevice (detectedDevices.indexOf (devName)))\r
- {\r
- connectedDeviceGroups.add (new ConnectedDeviceGroup (*this, devName, d));\r
- }\r
- }\r
- }\r
- }\r
-\r
- bool hasDeviceFor (const juce::String& devName) const\r
- {\r
- for (auto d : connectedDeviceGroups)\r
- if (d->deviceName == devName)\r
- return true;\r
-\r
- return false;\r
- }\r
-\r
- void addBlock (DeviceInfo info)\r
- {\r
- if (! reactivateBlockIfKnown (info))\r
- addNewBlock (info);\r
- }\r
-\r
- bool reactivateBlockIfKnown (DeviceInfo info)\r
- {\r
- const auto uid = getBlockUIDFromSerialNumber (info.serial);\r
-\r
- for (int i = disconnectedBlocks.size(); --i >= 0;)\r
- {\r
- if (uid != disconnectedBlocks.getUnchecked (i)->uid)\r
- continue;\r
-\r
- auto block = disconnectedBlocks.removeAndReturn (i);\r
-\r
- if (auto* blockImpl = BlockImplementation::getFrom (*block))\r
- {\r
- blockImpl->markReconnected (info.version, info.name, info.isMaster);\r
- currentTopology.blocks.add (block);\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
-\r
- void addNewBlock (DeviceInfo info)\r
- {\r
- currentTopology.blocks.add (new BlockImplementation (info.serial, *this, info.version,\r
- info.name, info.isMaster));\r
- }\r
-\r
- void updateCurrentBlockInfo (Block::Ptr blockToUpdate, DeviceInfo& updatedInfo)\r
- {\r
- if (versionNumberChanged (updatedInfo, blockToUpdate->versionNumber))\r
- setVersionNumberForBlock (updatedInfo, *blockToUpdate);\r
-\r
- if (nameIsValid (updatedInfo))\r
- setNameForBlock (updatedInfo, *blockToUpdate);\r
-\r
- if (updatedInfo.isMaster != blockToUpdate->isMasterBlock())\r
- BlockImplementation::getFrom (*blockToUpdate)->setToMaster (updatedInfo.isMaster);\r
- }\r
-\r
- BlockImplementation* getBlockImplementationWithUID (Block::UID deviceID) const noexcept\r
- {\r
- if (auto&& block = currentTopology.getBlockWithUID (deviceID))\r
- return BlockImplementation::getFrom (*block);\r
-\r
- return nullptr;\r
- }\r
-\r
- juce::OwnedArray<ConnectedDeviceGroup> connectedDeviceGroups;\r
-\r
- //==============================================================================\r
- void broadcastTopology()\r
- {\r
- if (currentTopology != lastTopology)\r
- {\r
- lastTopology = currentTopology;\r
-\r
- BlocksTraverser traverser;\r
- traverser.traverseBlockArray (currentTopology);\r
-\r
- for (auto* d : activeTopologySources)\r
- d->listeners.call ([] (TopologySource::Listener& l) { l.topologyChanged(); });\r
-\r
- #if DUMP_TOPOLOGY\r
- dumpTopology (lastTopology);\r
- #endif\r
- }\r
- }\r
-\r
- JUCE_DECLARE_WEAK_REFERENCEABLE (Detector)\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Detector)\r
- };\r
+ }\r
\r
- //==============================================================================\r
- /** This is a friend of the BlocksImplementation that will scan and set the\r
- physical positions of the blocks */\r
- struct BlocksTraverser\r
- {\r
- void traverseBlockArray (const BlockTopology& topology)\r
+ void handleDevicesAdded (const juce::StringArray& detectedDevices)\r
{\r
- juce::Array<Block::UID> visited;\r
+ bool anyDevicesAdded = false;\r
\r
- for (auto& block : topology.blocks)\r
+ for (const auto& devName : detectedDevices)\r
{\r
- if (block->isMasterBlock() && ! visited.contains (block->uid))\r
+ if (! hasDeviceFor (devName))\r
{\r
- if (auto* bi = dynamic_cast<BlockImplementation*> (block))\r
+ if (auto d = deviceDetector.openDevice (detectedDevices.indexOf (devName)))\r
{\r
- bi->masterUID = {};\r
- bi->position = {};\r
- bi->rotation = 0;\r
+ connectedDeviceGroups.add (new ConnectedDeviceGroup (*this, devName, d));\r
+ anyDevicesAdded = true;\r
}\r
-\r
- layoutNeighbours (*block, topology, block->uid, visited);\r
}\r
}\r
+\r
+ if (anyDevicesAdded)\r
+ handleTopologyChange();\r
}\r
\r
- // returns the distance from corner clockwise\r
- int getUnitForIndex (Block::Ptr block, Block::ConnectionPort::DeviceEdge edge, int index)\r
+ bool hasDeviceFor (const juce::String& devName) const\r
{\r
- if (block->getType() == Block::seaboardBlock)\r
- {\r
- if (edge == Block::ConnectionPort::DeviceEdge::north)\r
- {\r
- if (index == 0) return 1;\r
- if (index == 1) return 4;\r
- }\r
- else if (edge != Block::ConnectionPort::DeviceEdge::south)\r
- {\r
- return 1;\r
- }\r
- }\r
-\r
- if (edge == Block::ConnectionPort::DeviceEdge::south)\r
- return block->getWidth() - (index + 1);\r
-\r
- if (edge == Block::ConnectionPort::DeviceEdge::west)\r
- return block->getHeight() - (index + 1);\r
+ for (auto d : connectedDeviceGroups)\r
+ if (d->deviceName == devName)\r
+ return true;\r
\r
- return index;\r
+ return false;\r
}\r
\r
- // returns how often north needs to rotate by 90 degrees\r
- int getRotationForEdge (Block::ConnectionPort::DeviceEdge edge)\r
+ juce::OwnedArray<ConnectedDeviceGroup> connectedDeviceGroups;\r
+\r
+ //==============================================================================\r
+ /** Flurries of topology messages sometimes arrive due to loose connections.\r
+ Avoid informing listeners until they've stabilised.\r
+ */\r
+ struct TopologyBroadcastThrottle : private juce::Timer\r
{\r
- switch (edge)\r
+ TopologyBroadcastThrottle() = default;\r
+\r
+ void scheduleTopologyChangeCallback()\r
{\r
- case Block::ConnectionPort::DeviceEdge::north: return 0;\r
- case Block::ConnectionPort::DeviceEdge::east: return 1;\r
- case Block::ConnectionPort::DeviceEdge::south: return 2;\r
- case Block::ConnectionPort::DeviceEdge::west: return 3;\r
+ #ifdef JUCE_BLOCKS_TOPOLOGY_BROADCAST_THROTTLE_TIME\r
+ startTimer (JUCE_BLOCKS_TOPOLOGY_BROADCAST_THROTTLE_TIME);\r
+ #else\r
+ startTimer (750);\r
+ #endif\r
}\r
\r
- jassertfalse;\r
- return 0;\r
- }\r
-\r
- void layoutNeighbours (Block::Ptr block, const BlockTopology& topology,\r
- Block::UID masterUid, juce::Array<Block::UID>& visited)\r
- {\r
- visited.add (block->uid);\r
-\r
- for (auto& connection : topology.connections)\r
+ void timerCallback() override\r
{\r
- if ((connection.device1 == block->uid && ! visited.contains (connection.device2))\r
- || (connection.device2 == block->uid && ! visited.contains (connection.device1)))\r
+ if (detector->currentTopology != lastTopology)\r
{\r
- const auto theirUid = connection.device1 == block->uid ? connection.device2 : connection.device1;\r
- const auto neighbourPtr = topology.getBlockWithUID (theirUid);\r
+ lastTopology = detector->currentTopology;\r
\r
- if (auto* neighbour = dynamic_cast<BlockImplementation*> (neighbourPtr.get()))\r
- {\r
- const auto myBounds = block->getBlockAreaWithinLayout();\r
- const auto& myPort = connection.device1 == block->uid ? connection.connectionPortOnDevice1 : connection.connectionPortOnDevice2;\r
- const auto& theirPort = connection.device1 == block->uid ? connection.connectionPortOnDevice2 : connection.connectionPortOnDevice1;\r
- const auto myOffset = getUnitForIndex (block, myPort.edge, myPort.index);\r
- const auto theirOffset = getUnitForIndex (neighbourPtr, theirPort.edge, theirPort.index);\r
+ for (auto* d : detector->activeTopologySources)\r
+ d->listeners.call ([] (TopologySource::Listener& l) { l.topologyChanged(); });\r
\r
- neighbour->masterUID = masterUid;\r
- neighbour->rotation = (2 + block->getRotation()\r
- + getRotationForEdge (myPort.edge)\r
- - getRotationForEdge (theirPort.edge)) % 4;\r
+ #if DUMP_TOPOLOGY\r
+ dumpTopology (lastTopology);\r
+ #endif\r
+ }\r
\r
- Point<int> delta;\r
- const auto theirBounds = neighbour->getBlockAreaWithinLayout();\r
+ stopTimer();\r
+ }\r
\r
- switch ((block->getRotation() + getRotationForEdge (myPort.edge)) % 4)\r
- {\r
- case 0: // over me\r
- delta = { myOffset - (theirBounds.getWidth() - (theirOffset + 1)), -theirBounds.getHeight() };\r
- break;\r
- case 1: // right of me\r
- delta = { myBounds.getWidth(), myOffset - (theirBounds.getHeight() - (theirOffset + 1)) };\r
- break;\r
- case 2: // under me\r
- delta = { (myBounds.getWidth() - (myOffset + 1)) - theirOffset, myBounds.getHeight() };\r
- break;\r
- case 3: // left of me\r
- delta = { -theirBounds.getWidth(), (myBounds.getHeight() - (myOffset + 1)) - theirOffset };\r
- break;\r
- }\r
+ Detector* detector = nullptr;\r
+ BlockTopology lastTopology;\r
+ };\r
\r
- neighbour->position = myBounds.getPosition() + delta;\r
- }\r
+ TopologyBroadcastThrottle topologyBroadcastThrottle;\r
\r
- layoutNeighbours (neighbourPtr, topology, masterUid, visited);\r
- }\r
- }\r
- }\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Detector)\r
};\r
\r
//==============================================================================\r
private MIDIDeviceConnection::Listener,\r
private Timer\r
{\r
- BlockImplementation (const BlocksProtocol::BlockSerialNumber& serial,\r
- Detector& detectorToUse,\r
- BlocksProtocol::VersionNumber version,\r
- BlocksProtocol::BlockName blockName,\r
- bool isMasterBlock)\r
- : Block (juce::String ((const char*) serial.serial, sizeof (serial.serial)),\r
+ BlockImplementation (const BlocksProtocol::BlockSerialNumber& serial, Detector& detectorToUse, BlocksProtocol::VersionNumber version, BlocksProtocol::BlockName name, bool master)\r
+ : Block (juce::String ((const char*) serial.serial, sizeof (serial.serial)),\r
juce::String ((const char*) version.version, version.length),\r
- juce::String ((const char*) blockName.name, blockName.length)),\r
+ juce::String ((const char*) name.name, name.length)),\r
modelData (serial),\r
remoteHeap (modelData.programAndHeapSize),\r
- detector (&detectorToUse),\r
- isMaster (isMasterBlock)\r
+ detector (detectorToUse),\r
+ isMaster (master)\r
{\r
+ sendCommandMessage (BlocksProtocol::beginAPIMode);\r
+\r
if (modelData.hasTouchSurface)\r
touchSurface.reset (new TouchSurfaceImplementation (*this));\r
\r
int i = 0;\r
-\r
for (auto&& b : modelData.buttons)\r
controlButtons.add (new ControlButtonImplementation (*this, i++, b));\r
\r
for (auto&& s : modelData.statusLEDs)\r
statusLights.add (new StatusLightImplementation (*this, s));\r
\r
- updateMidiConnectionListener();\r
+ if (modelData.numLEDRowLEDs > 0)\r
+ ledRow.reset (new LEDRowImplementation (*this));\r
+\r
+ listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this));\r
+\r
+ if (listenerToMidiConnection != nullptr)\r
+ listenerToMidiConnection->addListener (this);\r
+\r
+ config.setDeviceComms (listenerToMidiConnection);\r
}\r
\r
~BlockImplementation()\r
}\r
}\r
\r
- void markDisconnected()\r
- {\r
- if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))\r
- surface->disableTouchSurface();\r
- }\r
-\r
- void markReconnected (BlocksProtocol::VersionNumber newVersion, BlocksProtocol::BlockName newName, bool master)\r
- {\r
- versionNumber = getVersionString (newVersion);\r
- name = getNameString (newName);\r
- isMaster = master;\r
-\r
- setProgram (nullptr);\r
- remoteHeap.resetDeviceStateToUnknown();\r
-\r
- if (auto surface = dynamic_cast<TouchSurfaceImplementation*> (touchSurface.get()))\r
- surface->activateTouchSurface();\r
-\r
- updateMidiConnectionListener();\r
- }\r
-\r
- void setToMaster (bool shouldBeMaster)\r
+ void invalidate()\r
{\r
- isMaster = shouldBeMaster;\r
- }\r
-\r
- void updateMidiConnectionListener()\r
- {\r
- if (detector == nullptr)\r
- return;\r
-\r
- listenerToMidiConnection = dynamic_cast<MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this));\r
-\r
- if (listenerToMidiConnection != nullptr)\r
- listenerToMidiConnection->addListener (this);\r
-\r
- config.setDeviceComms (listenerToMidiConnection);\r
+ isStillConnected = false;\r
}\r
\r
Type getType() const override { return modelData.apiType; }\r
float getMillimetersPerUnit() const override { return 47.0f; }\r
bool isHardwareBlock() const override { return true; }\r
juce::Array<Block::ConnectionPort> getPorts() const override { return modelData.ports; }\r
- bool isConnected() const override { return detector && detector->isConnected (uid); }\r
+ bool isConnected() const override { return isStillConnected && detector.isConnected (uid); }\r
bool isMasterBlock() const override { return isMaster; }\r
- Block::UID getConnectedMasterUID() const override { return masterUID; }\r
- int getRotation() const override { return rotation; }\r
-\r
- Rectangle<int> getBlockAreaWithinLayout() const override\r
- {\r
- if (rotation % 2 == 0)\r
- return { position.getX(), position.getY(), modelData.widthUnits, modelData.heightUnits };\r
-\r
- return { position.getX(), position.getY(), modelData.heightUnits, modelData.widthUnits };\r
- }\r
\r
TouchSurface* getTouchSurface() const override { return touchSurface.get(); }\r
LEDGrid* getLEDGrid() const override { return ledGrid.get(); }\r
-\r
- LEDRow* getLEDRow() override\r
- {\r
- if (ledRow == nullptr && modelData.numLEDRowLEDs > 0)\r
- ledRow.reset (new LEDRowImplementation (*this));\r
-\r
- return ledRow.get();\r
- }\r
+ LEDRow* getLEDRow() const override { return ledRow.get(); }\r
\r
juce::Array<ControlButton*> getButtons() const override\r
{\r
\r
float getBatteryLevel() const override\r
{\r
- if (detector == nullptr)\r
- return 0.0f;\r
-\r
- if (auto status = detector->getLastStatus (uid))\r
+ if (auto status = detector.getLastStatus (uid))\r
return status->batteryLevel.toUnipolarFloat();\r
\r
return 0.0f;\r
\r
bool isBatteryCharging() const override\r
{\r
- if (detector == nullptr)\r
- return false;\r
-\r
- if (auto status = detector->getLastStatus (uid))\r
+ if (auto status = detector.getLastStatus (uid))\r
return status->batteryCharging.get() != 0;\r
\r
return false;\r
\r
int getDeviceIndex() const noexcept\r
{\r
- if (detector == nullptr)\r
- return -1;\r
-\r
- return isConnected() ? detector->getIndexFromDeviceID (uid) : -1;\r
+ return isConnected() ? detector.getIndexFromDeviceID (uid) : -1;\r
}\r
\r
template <typename PacketBuilder>\r
bool sendMessageToDevice (const PacketBuilder& builder)\r
{\r
- if (detector != nullptr)\r
- {\r
- lastMessageSendTime = juce::Time::getCurrentTime();\r
- return detector->sendMessageToDevice (uid, builder);\r
- }\r
-\r
- return false;\r
+ lastMessageSendTime = juce::Time::getCurrentTime();\r
+ return detector.sendMessageToDevice (uid, builder);\r
}\r
\r
bool sendCommandMessage (uint32 commandID)\r
{\r
- return buildAndSendPacket<64> ([commandID] (BlocksProtocol::HostPacketBuilder<64>& p)\r
- { return p.deviceControlMessage (commandID); });\r
+ int index = getDeviceIndex();\r
+\r
+ if (index < 0)\r
+ return false;\r
+\r
+ BlocksProtocol::HostPacketBuilder<64> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+ p.deviceControlMessage (commandID);\r
+ p.writePacketSysexFooter();\r
+\r
+ return sendMessageToDevice (p);\r
}\r
\r
void handleCustomMessage (Block::Timestamp, const int32* data)\r
\r
static BlockImplementation* getFrom (Block& b) noexcept\r
{\r
- jassert (dynamic_cast<BlockImplementation*> (&b) != nullptr);\r
- return dynamic_cast<BlockImplementation*> (&b);\r
+ if (auto bi = dynamic_cast<BlockImplementation*> (&b))\r
+ return bi;\r
+\r
+ jassertfalse;\r
+ return nullptr;\r
+ }\r
+\r
+ bool isControlBlock() const\r
+ {\r
+ auto type = getType();\r
+\r
+ return type == Block::Type::liveBlock\r
+ || type == Block::Type::loopBlock\r
+ || type == Block::Type::touchBlock\r
+ || type == Block::Type::developerControlBlock;\r
}\r
\r
//==============================================================================\r
//==============================================================================\r
juce::Result setProgram (Program* newProgram) override\r
{\r
- if (newProgram != nullptr && program.get() == newProgram)\r
- {\r
- jassertfalse;\r
- return juce::Result::ok();\r
- }\r
-\r
- stopTimer();\r
-\r
+ if (newProgram == nullptr || program.get() != newProgram)\r
{\r
- std::unique_ptr<Program> p (newProgram);\r
-\r
- if (program != nullptr\r
- && newProgram != nullptr\r
- && program->getLittleFootProgram() == newProgram->getLittleFootProgram())\r
- return juce::Result::ok();\r
-\r
- std::swap (program, p);\r
- }\r
+ {\r
+ std::unique_ptr<Program> p (newProgram);\r
\r
- programSize = 0;\r
- isProgramLoaded = shouldSaveProgramAsDefault = false;\r
+ if (program != nullptr\r
+ && newProgram != nullptr\r
+ && program->getLittleFootProgram() == newProgram->getLittleFootProgram())\r
+ return juce::Result::ok();\r
\r
- if (program == nullptr)\r
- {\r
- remoteHeap.clear();\r
- return juce::Result::ok();\r
- }\r
+ stopTimer();\r
+ std::swap (program, p);\r
+ }\r
\r
- littlefoot::Compiler compiler;\r
- compiler.addNativeFunctions (PhysicalTopologySource::getStandardLittleFootFunctions());\r
+ stopTimer();\r
+ programSize = 0;\r
\r
- const auto err = compiler.compile (program->getLittleFootProgram(), 512, program->getSearchPaths());\r
+ if (program != nullptr)\r
+ {\r
+ littlefoot::Compiler compiler;\r
+ compiler.addNativeFunctions (PhysicalTopologySource::getStandardLittleFootFunctions());\r
\r
- if (err.failed())\r
- return err;\r
+ auto err = compiler.compile (program->getLittleFootProgram(), 512);\r
\r
- DBG ("Compiled littlefoot program, space needed: "\r
- << (int) compiler.getCompiledProgram().getTotalSpaceNeeded() << " bytes");\r
+ if (err.failed())\r
+ return err;\r
\r
- if (compiler.getCompiledProgram().getTotalSpaceNeeded() > getMemorySize())\r
- return Result::fail ("Program too large!");\r
+ DBG ("Compiled littlefoot program, space needed: "\r
+ << (int) compiler.getCompiledProgram().getTotalSpaceNeeded() << " bytes");\r
\r
- const auto size = (size_t) compiler.compiledObjectCode.size();\r
- programSize = (uint32) size;\r
+ if (compiler.getCompiledProgram().getTotalSpaceNeeded() > getMemorySize())\r
+ return Result::fail ("Program too large!");\r
\r
- remoteHeap.resetDataRangeToUnknown (0, remoteHeap.blockSize);\r
- remoteHeap.clear();\r
- remoteHeap.sendChanges (*this, true);\r
+ auto size = (size_t) compiler.compiledObjectCode.size();\r
+ programSize = (uint32) size;\r
\r
- remoteHeap.resetDataRangeToUnknown (0, (uint32) size);\r
- remoteHeap.setBytes (0, compiler.compiledObjectCode.begin(), size);\r
- remoteHeap.sendChanges (*this, true);\r
+ remoteHeap.resetDataRangeToUnknown (0, remoteHeap.blockSize);\r
+ remoteHeap.clear();\r
+ remoteHeap.sendChanges (*this, true);\r
\r
- this->resetConfigListActiveStatus();\r
+ remoteHeap.resetDataRangeToUnknown (0, (uint32) size);\r
+ remoteHeap.setBytes (0, compiler.compiledObjectCode.begin(), size);\r
+ remoteHeap.sendChanges (*this, true);\r
\r
- if (auto changeCallback = this->configChangedCallback)\r
- changeCallback (*this, {}, this->getMaxConfigIndex());\r
+ this->resetConfigListActiveStatus();\r
\r
- startTimer (20);\r
+ if (auto changeCallback = this->configChangedCallback)\r
+ changeCallback (*this, {}, this->getMaxConfigIndex());\r
+ }\r
+ else\r
+ {\r
+ remoteHeap.clear();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
\r
return juce::Result::ok();\r
}\r
\r
if (remoteHeap.isProgramLoaded())\r
{\r
- buildAndSendPacket<128> ([&message] (BlocksProtocol::HostPacketBuilder<128>& p)\r
- { return p.addProgramEventMessage (message.values); });\r
+ auto index = getDeviceIndex();\r
+\r
+ if (index >= 0)\r
+ {\r
+ BlocksProtocol::HostPacketBuilder<128> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+ if (p.addProgramEventMessage (message.values))\r
+ {\r
+ p.writePacketSysexFooter();\r
+ sendMessageToDevice (p);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
}\r
}\r
\r
{\r
if (remoteHeap.isFullySynced() && remoteHeap.isProgramLoaded())\r
{\r
- isProgramLoaded = true;\r
stopTimer();\r
-\r
- if (shouldSaveProgramAsDefault)\r
- doSaveProgramAsDefault();\r
-\r
- if (programLoadedCallback != nullptr)\r
- programLoadedCallback (*this);\r
+ sendCommandMessage (BlocksProtocol::saveProgramAsDefault);\r
}\r
else\r
{\r
\r
void saveProgramAsDefault() override\r
{\r
- shouldSaveProgramAsDefault = true;\r
-\r
- if (! isTimerRunning() && isProgramLoaded)\r
- doSaveProgramAsDefault();\r
+ startTimer (10);\r
}\r
\r
uint32 getMemorySize() override\r
return modelData.programAndHeapSize;\r
}\r
\r
- uint32 getHeapMemorySize() override\r
- {\r
- jassert (isPositiveAndNotGreaterThan (programSize, modelData.programAndHeapSize));\r
- return modelData.programAndHeapSize - programSize;\r
- }\r
-\r
void setDataByte (size_t offset, uint8 value) override\r
{\r
remoteHeap.setByte (programSize + offset, value);\r
{\r
firmwarePacketAckCallback = {};\r
\r
- if (buildAndSendPacket<256> ([data, size] (BlocksProtocol::HostPacketBuilder<256>& p)\r
- { return p.addFirmwareUpdatePacket (data, size); }))\r
+ auto index = getDeviceIndex();\r
+\r
+ if (index >= 0)\r
{\r
- firmwarePacketAckCallback = callback;\r
- return true;\r
+ BlocksProtocol::HostPacketBuilder<256> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+ if (p.addFirmwareUpdatePacket (data, size))\r
+ {\r
+ p.writePacketSysexFooter();\r
+\r
+ if (sendMessageToDevice (p))\r
+ {\r
+ firmwarePacketAckCallback = callback;\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
}\r
\r
return false;\r
\r
void handleTimerTick()\r
{\r
+ if (++resetMessagesSent < 3)\r
+ {\r
+ if (resetMessagesSent == 1)\r
+ sendCommandMessage (BlocksProtocol::endAPIMode);\r
+\r
+ sendCommandMessage (BlocksProtocol::beginAPIMode);\r
+ return;\r
+ }\r
+\r
if (ledGrid != nullptr)\r
if (auto renderer = ledGrid->getRenderer())\r
renderer->renderLEDGrid (*ledGrid);\r
\r
void setConfigChangedCallback (std::function<void(Block&, const ConfigMetaData&, uint32)> configChanged) override\r
{\r
- configChangedCallback = std::move (configChanged);\r
+ configChangedCallback = configChanged;\r
}\r
\r
- void setProgramLoadedCallback (std::function<void(Block&)> programLoaded) override\r
+ void factoryReset() override\r
{\r
- programLoadedCallback = std::move (programLoaded);\r
- }\r
+ auto index = getDeviceIndex();\r
\r
- bool setName (const juce::String& newName) override\r
- {\r
- return buildAndSendPacket<128> ([&newName] (BlocksProtocol::HostPacketBuilder<128>& p)\r
- { return p.addSetBlockName (newName); });\r
+ if (index >= 0)\r
+ {\r
+ BlocksProtocol::HostPacketBuilder<32> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+ p.addFactoryReset();\r
+ p.writePacketSysexFooter();\r
+ sendMessageToDevice (p);\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
}\r
\r
- void factoryReset() override\r
+ void blockReset() override\r
{\r
- buildAndSendPacket<32> ([] (BlocksProtocol::HostPacketBuilder<32>& p)\r
- { return p.addFactoryReset(); });\r
+ auto index = getDeviceIndex();\r
+\r
+ if (index >= 0)\r
+ {\r
+ BlocksProtocol::HostPacketBuilder<32> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+ p.addBlockReset();\r
+ p.writePacketSysexFooter();\r
+ sendMessageToDevice (p);\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
+ }\r
}\r
\r
- void blockReset() override\r
+ bool setName (const juce::String& newName) override\r
{\r
- if (buildAndSendPacket<32> ([] (BlocksProtocol::HostPacketBuilder<32>& p)\r
- { return p.addBlockReset(); }))\r
+ auto index = getDeviceIndex();\r
+\r
+ if (index >= 0)\r
{\r
- hasBeenPowerCycled = true;\r
+ BlocksProtocol::HostPacketBuilder<128> p;\r
+ p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
+\r
+ if (p.addSetBlockName (newName))\r
+ {\r
+ p.writePacketSysexFooter();\r
\r
- if (detector != nullptr)\r
- detector->notifyBlockIsRestarting (uid);\r
+ if (sendMessageToDevice (p))\r
+ return true;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ jassertfalse;\r
}\r
- }\r
\r
- bool wasPowerCycled() const { return hasBeenPowerCycled; }\r
- void resetPowerCycleFlag() { hasBeenPowerCycled = false; }\r
+ return false;\r
+ }\r
\r
//==============================================================================\r
std::unique_ptr<TouchSurface> touchSurface;\r
using RemoteHeapType = littlefoot::LittleFootRemoteHeap<BlockImplementation>;\r
RemoteHeapType remoteHeap;\r
\r
- WeakReference<Detector> detector;\r
+ Detector& detector;\r
juce::Time lastMessageSendTime, lastMessageReceiveTime;\r
\r
BlockConfigManager config;\r
std::function<void(Block&, const ConfigMetaData&, uint32)> configChangedCallback;\r
\r
- std::function<void(Block&)> programLoadedCallback;\r
-\r
private:\r
std::unique_ptr<Program> program;\r
uint32 programSize = 0;\r
\r
std::function<void(uint8, uint32)> firmwarePacketAckCallback;\r
\r
+ uint32 resetMessagesSent = 0;\r
+ bool isStillConnected = true;\r
bool isMaster = false;\r
- Block::UID masterUID = {};\r
-\r
- Point<int> position;\r
- int rotation = 0;\r
- friend BlocksTraverser;\r
-\r
- bool isProgramLoaded = false;\r
- bool shouldSaveProgramAsDefault = false;\r
- bool hasBeenPowerCycled = false;\r
\r
void initialiseDeviceIndexAndConnection()\r
{\r
\r
const juce::MidiInput* getMidiInput() const\r
{\r
- if (detector != nullptr)\r
- if (auto c = dynamic_cast<const MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this)))\r
- return c->midiInput.get();\r
+ if (auto c = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this)))\r
+ return c->midiInput.get();\r
\r
jassertfalse;\r
return nullptr;\r
\r
const juce::MidiOutput* getMidiOutput() const\r
{\r
- if (detector != nullptr)\r
- if (auto c = dynamic_cast<const MIDIDeviceConnection*> (detector->getDeviceConnectionFor (*this)))\r
- return c->midiOutput.get();\r
+ if (auto c = dynamic_cast<MIDIDeviceConnection*> (detector.getDeviceConnectionFor (*this)))\r
+ return c->midiOutput.get();\r
\r
jassertfalse;\r
return nullptr;\r
config.setDeviceComms (nullptr);\r
}\r
\r
- void doSaveProgramAsDefault()\r
- {\r
- sendCommandMessage (BlocksProtocol::saveProgramAsDefault);\r
- }\r
-\r
- template<int packetBytes, typename PacketBuilderFn>\r
- bool buildAndSendPacket (PacketBuilderFn buildFn)\r
- {\r
- auto index = getDeviceIndex();\r
-\r
- if (index < 0)\r
- {\r
- jassertfalse;\r
- return false;\r
- }\r
-\r
- BlocksProtocol::HostPacketBuilder<packetBytes> p;\r
- p.writePacketSysexHeaderBytes ((BlocksProtocol::TopologyIndex) index);\r
-\r
- if (! buildFn (p))\r
- return false;\r
-\r
- p.writePacketSysexFooter();\r
- return sendMessageToDevice (p);\r
- }\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BlockImplementation)\r
};\r
\r
{\r
TouchSurfaceImplementation (BlockImplementation& b) : TouchSurface (b), blockImpl (b)\r
{\r
- activateTouchSurface();\r
- }\r
-\r
- ~TouchSurfaceImplementation()\r
- {\r
- disableTouchSurface();\r
- }\r
+ if (auto det = Detector::getFrom (block))\r
+ det->activeTouchSurfaces.add (this);\r
\r
- void activateTouchSurface()\r
- {\r
startTimer (500);\r
}\r
\r
- void disableTouchSurface()\r
+ ~TouchSurfaceImplementation()\r
{\r
- stopTimer();\r
+ if (auto det = Detector::getFrom (block))\r
+ det->activeTouchSurfaces.removeFirstMatchingValue (this);\r
}\r
\r
int getNumberOfKeywaves() const noexcept override\r
ControlButtonImplementation (BlockImplementation& b, int index, BlocksProtocol::BlockDataSheet::ButtonInfo info)\r
: ControlButton (b), blockImpl (b), buttonInfo (info), buttonIndex (index)\r
{\r
+ if (auto det = Detector::getFrom (block))\r
+ det->activeControlButtons.add (this);\r
}\r
\r
~ControlButtonImplementation()\r
{\r
+ if (auto det = Detector::getFrom (block))\r
+ det->activeControlButtons.removeFirstMatchingValue (this);\r
}\r
\r
ButtonFunction getType() const override { return buttonInfo.type; }\r
};\r
\r
//==============================================================================\r
-PhysicalTopologySource::PhysicalTopologySource (bool startDetached)\r
+PhysicalTopologySource::PhysicalTopologySource()\r
+ : detector (new DetectorHolder (*this))\r
{\r
- if (! startDetached)\r
- setActive (true);\r
+ detector->detector->activeTopologySources.add (this);\r
}\r
\r
-PhysicalTopologySource::PhysicalTopologySource (DeviceDetector& detectorToUse, bool startDetached)\r
- : customDetector (&detectorToUse)\r
+PhysicalTopologySource::PhysicalTopologySource (DeviceDetector& detectorToUse)\r
+ : detector (new DetectorHolder (*this, detectorToUse))\r
{\r
- if (! startDetached)\r
- setActive (true);\r
+ detector->detector->activeTopologySources.add (this);\r
}\r
\r
PhysicalTopologySource::~PhysicalTopologySource()\r
{\r
- setActive (false);\r
-}\r
-\r
-void PhysicalTopologySource::setActive (bool shouldBeActive)\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
- if (isActive() == shouldBeActive)\r
- return;\r
-\r
- if (shouldBeActive)\r
- {\r
- if (customDetector == nullptr)\r
- detector = std::make_unique<DetectorHolder>(*this);\r
- else\r
- detector = std::make_unique<DetectorHolder>(*this, *customDetector);\r
-\r
- detector->detector->activeTopologySources.add (this);\r
- }\r
- else\r
- {\r
- detector->detector->detach (this);\r
- detector.reset();\r
- }\r
-\r
- listeners.call ([](TopologySource::Listener& l){ l.topologyChanged(); });\r
-}\r
-\r
-bool PhysicalTopologySource::isActive() const\r
-{\r
- return detector != nullptr;\r
-}\r
-\r
-bool PhysicalTopologySource::isLockedFromOutside() const\r
-{\r
- if (detector != nullptr && detector->detector != nullptr)\r
- return detector->detector->deviceDetector.isLockedFromOutside();\r
-\r
- return false;\r
+ detector->detector->detach (this);\r
+ detector = nullptr;\r
}\r
\r
BlockTopology PhysicalTopologySource::getCurrentTopology() const\r
{\r
JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED // This method must only be called from the message thread!\r
\r
- if (detector != nullptr)\r
- return detector->detector->currentTopology;\r
-\r
- return {};\r
+ return detector->detector->currentTopology;\r
}\r
\r
void PhysicalTopologySource::cancelAllActiveTouches() noexcept\r
{\r
- if (detector != nullptr)\r
- detector->detector->cancelAllActiveTouches();\r
+ detector->detector->cancelAllActiveTouches();\r
}\r
\r
bool PhysicalTopologySource::hasOwnServiceTimer() const { return false; }\r
-void PhysicalTopologySource::handleTimerTick()\r
-{\r
- if (detector != nullptr)\r
- detector->handleTimerTick();\r
-}\r
+void PhysicalTopologySource::handleTimerTick() { detector->handleTimerTick(); }\r
\r
PhysicalTopologySource::DeviceConnection::DeviceConnection() {}\r
PhysicalTopologySource::DeviceConnection::~DeviceConnection() {}\r
{\r
public:\r
/** Constructor. */\r
- PhysicalTopologySource (bool startDetached = false);\r
+ PhysicalTopologySource();\r
\r
/** Destructor. */\r
~PhysicalTopologySource();\r
/** Reset all touches */\r
void cancelAllActiveTouches() noexcept override;\r
\r
- /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
- void setActive (bool shouldBeActive) override;\r
-\r
- /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
- bool isActive() const override;\r
-\r
- /** This method will tell, if an other PhysicalTopologySource has locked the Midi connection */\r
- bool isLockedFromOutside() const;\r
\r
//==========================================================================\r
/** For custom transport systems, this represents a connected device */\r
\r
virtual juce::StringArray scanForDevices() = 0;\r
virtual DeviceConnection* openDevice (int index) = 0;\r
- virtual bool isLockedFromOutside() const { return false; }\r
};\r
\r
/** Constructor for custom transport systems. */\r
- PhysicalTopologySource (DeviceDetector& detectorToUse, bool startDetached = false);\r
+ PhysicalTopologySource (DeviceDetector& detectorToUse);\r
\r
static const char* const* getStandardLittleFootFunctions() noexcept;\r
\r
\r
private:\r
//==========================================================================\r
- DeviceDetector* customDetector = nullptr;\r
struct Internal;\r
struct DetectorHolder;\r
std::unique_ptr<DetectorHolder> detector;\r
}\r
}\r
\r
- void setActive (bool shouldBeActive)\r
- {\r
- detector.setActive (shouldBeActive);\r
- }\r
-\r
- bool isActive() const\r
- {\r
- return detector.isActive();\r
- }\r
-\r
RuleBasedTopologySource& owner;\r
TopologySource& detector;\r
\r
void RuleBasedTopologySource::clearRules() { internal->clearRules(); }\r
void RuleBasedTopologySource::addRule (Rule* r) { internal->addRule (r); }\r
\r
-void RuleBasedTopologySource::setActive (bool shouldBeActive)\r
-{\r
- internal->setActive (shouldBeActive);\r
-}\r
-\r
-bool RuleBasedTopologySource::isActive() const\r
-{\r
- return internal->isActive();\r
-}\r
-\r
} // namespace juce\r
\r
//==========================================================================\r
/** Returns the currently active topology. */\r
- BlockTopology getCurrentTopology() const override;\r
+ BlockTopology getCurrentTopology() const;\r
\r
/** A rule that can transform parts of a topology. */\r
struct Rule\r
*/\r
void addRule (Rule*);\r
\r
- /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
- void setActive (bool shouldBeActive) override;\r
-\r
- /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
- bool isActive() const override;\r
-\r
private:\r
//==========================================================================\r
struct Internal;\r
\r
bool operator== (const BlockTopology&) const noexcept;\r
bool operator!= (const BlockTopology&) const noexcept;\r
-\r
- Block::Ptr getBlockWithUID (Block::UID deviceID)\r
- {\r
- for (auto&& block : blocks)\r
- if (block->uid == deviceID)\r
- return block;\r
-\r
- return {};\r
- }\r
-\r
- const Block::Ptr getBlockWithUID (Block::UID deviceID) const\r
- {\r
- for (auto&& block : blocks)\r
- if (block->uid == deviceID)\r
- return block;\r
-\r
- return {};\r
- }\r
};\r
\r
} // namespace juce\r
/** Returns the current topology that this object manages. */\r
virtual BlockTopology getCurrentTopology() const = 0;\r
\r
- /** Sets the TopologySource as active, occupying the midi port and trying to connect to the block devices */\r
- virtual void setActive (bool shouldBeActive) = 0;\r
-\r
- /** Returns true, if the TopologySource is currently trying to connect the block devices */\r
- virtual bool isActive() const = 0;\r
-\r
//==========================================================================\r
/** Used to receive callbacks for topology changes */\r
struct Listener\r
m_nodeCapacity = 16;\r
m_nodeCount = 0;\r
m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode));\r
- memset((void*)m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\r
+ memset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode));\r
\r
// Build a linked list for the free list.\r
for (int32 i = 0; i < m_nodeCapacity - 1; ++i)\r
#pragma clang diagnostic push\r
#pragma clang diagnostic ignored "-Wsign-conversion"\r
#pragma clang diagnostic ignored "-Wfloat-conversion"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
#elif defined (__GNUC__)\r
#pragma GCC diagnostic push\r
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"\r
\r
ID: juce_box2d\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE wrapper for the Box2D physics engine\r
description: The Box2D physics engine and some utility classes.\r
website: http://www.juce.com/juce\r
#ifdef __GNUC__\r
#pragma GCC diagnostic push\r
#pragma GCC diagnostic ignored "-Wconversion"\r
- #if defined (__clang__)\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
- #endif\r
#endif\r
\r
#include <climits>\r
public:\r
//==============================================================================\r
/** Creates an empty array. */\r
- Array() = default;\r
+ Array() noexcept\r
+ {\r
+ }\r
\r
/** Creates a copy of another array.\r
@param other the array to copy\r
*/\r
- Array (const Array& other)\r
+ Array (const Array<ElementType, TypeOfCriticalSectionToUse>& other)\r
{\r
const ScopedLockType lock (other.getLock());\r
- values.addArray (other.values.begin(), other.values.size());\r
+ numUsed = other.numUsed;\r
+ data.setAllocatedSize (other.numUsed);\r
+\r
+ for (int i = 0; i < numUsed; ++i)\r
+ new (data.elements + i) ElementType (other.data.elements[i]);\r
}\r
\r
- Array (Array&& other) noexcept\r
- : values (std::move (other.values))\r
+ Array (Array<ElementType, TypeOfCriticalSectionToUse>&& other) noexcept\r
+ : data (static_cast<ArrayAllocationBase<ElementType, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+ numUsed (other.numUsed)\r
{\r
+ other.numUsed = 0;\r
}\r
\r
/** Initalises from a null-terminated raw array of values.\r
- @param data the data to copy from\r
+ @param values the array to copy from\r
*/\r
template <typename TypeToCreateFrom>\r
- explicit Array (const TypeToCreateFrom* data)\r
+ explicit Array (const TypeToCreateFrom* values)\r
{\r
while (*values != TypeToCreateFrom())\r
- add (*data++);\r
+ add (*values++);\r
}\r
\r
/** Initalises from a raw array of values.\r
- @param data the data to copy from\r
+ @param values the array to copy from\r
@param numValues the number of values in the array\r
*/\r
template <typename TypeToCreateFrom>\r
- Array (const TypeToCreateFrom* data, int numValues)\r
+ Array (const TypeToCreateFrom* values, int numValues) : numUsed (numValues)\r
{\r
- values.addArray (data, numValues);\r
+ data.setAllocatedSize (numValues);\r
+\r
+ for (int i = 0; i < numValues; ++i)\r
+ new (data.elements + i) ElementType (values[i]);\r
}\r
\r
/** Initalises an Array of size 1 containing a single element. */\r
/** Initalises an Array of size 1 containing a single element. */\r
Array (ElementType&& singleElementToAdd)\r
{\r
- add (std::move (singleElementToAdd));\r
+ add (static_cast<ElementType&&> (singleElementToAdd));\r
}\r
\r
/** Initalises an Array from a list of items. */\r
template <typename... OtherElements>\r
Array (const ElementType& firstNewElement, OtherElements... otherElements)\r
{\r
- values.add (firstNewElement, otherElements...);\r
+ data.setAllocatedSize (1 + (int) sizeof... (otherElements));\r
+ addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
}\r
\r
/** Initalises an Array from a list of items. */\r
template <typename... OtherElements>\r
Array (ElementType&& firstNewElement, OtherElements... otherElements)\r
{\r
- values.add (std::move (firstNewElement), otherElements...);\r
+ data.setAllocatedSize (1 + (int) sizeof... (otherElements));\r
+ addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement), otherElements...);\r
}\r
\r
template <typename TypeToCreateFrom>\r
}\r
\r
/** Destructor. */\r
- ~Array() = default;\r
+ ~Array()\r
+ {\r
+ deleteAllElements();\r
+ }\r
\r
/** Copies another array.\r
@param other the array to copy\r
Array& operator= (Array&& other) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values = std::move (other.values);\r
+ deleteAllElements();\r
+ data = static_cast<ArrayAllocationBase<ElementType, TypeOfCriticalSectionToUse>&&> (other.data);\r
+ numUsed = other.numUsed;\r
+ other.numUsed = 0;\r
return *this;\r
}\r
\r
{\r
const ScopedLockType lock (getLock());\r
const typename OtherArrayType::ScopedLockType lock2 (other.getLock());\r
- return values == other;\r
+\r
+ if (numUsed != other.numUsed)\r
+ return false;\r
+\r
+ for (int i = numUsed; --i >= 0;)\r
+ if (! (data.elements[i] == other.data.elements[i]))\r
+ return false;\r
+\r
+ return true;\r
}\r
\r
/** Compares this array to another one.\r
void clear()\r
{\r
const ScopedLockType lock (getLock());\r
- clearQuick();\r
- values.setAllocatedSize (0);\r
+ deleteAllElements();\r
+ data.setAllocatedSize (0);\r
+ numUsed = 0;\r
}\r
\r
/** Removes all elements from the array without freeing the array's allocated storage.\r
void clearQuick()\r
{\r
const ScopedLockType lock (getLock());\r
- values.clear();\r
+ deleteAllElements();\r
+ numUsed = 0;\r
}\r
\r
/** Fills the Array with the provided value. */\r
/** Returns the current number of elements in the array. */\r
inline int size() const noexcept\r
{\r
- const ScopedLockType lock (getLock());\r
- return values.size();\r
+ return numUsed;\r
}\r
\r
/** Returns true if the array is empty, false otherwise. */\r
inline bool isEmpty() const noexcept\r
{\r
- return size() == 0;\r
+ return numUsed == 0;\r
}\r
\r
/** Returns one of the elements in the array.\r
@param index the index of the element being requested (0 is the first element in the array)\r
@see getUnchecked, getFirst, getLast\r
*/\r
- ElementType operator[] (int index) const\r
+ ElementType operator[] (const int index) const\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getValueWithDefault (index);\r
+\r
+ if (isPositiveAndBelow (index, numUsed))\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[index];\r
+ }\r
+\r
+ return ElementType();\r
}\r
\r
/** Returns one of the elements in the array, without checking the index passed in.\r
@param index the index of the element being requested (0 is the first element in the array)\r
@see operator[], getFirst, getLast\r
*/\r
- inline ElementType getUnchecked (int index) const\r
+ inline ElementType getUnchecked (const int index) const\r
{\r
const ScopedLockType lock (getLock());\r
- return values[index];\r
+ jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+ return data.elements[index];\r
}\r
\r
/** Returns a direct reference to one of the elements in the array, without checking the index passed in.\r
@param index the index of the element being requested (0 is the first element in the array)\r
@see operator[], getFirst, getLast\r
*/\r
- inline ElementType& getReference (int index) const noexcept\r
+ inline ElementType& getReference (const int index) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values[index];\r
+ jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+ return data.elements[index];\r
}\r
\r
/** Returns the first element in the array, or a default value if the array is empty.\r
@see operator[], getUnchecked, getLast\r
*/\r
- inline ElementType getFirst() const noexcept\r
+ inline ElementType getFirst() const\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getFirst();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[0];\r
+ }\r
+\r
+ return ElementType();\r
}\r
\r
/** Returns the last element in the array, or a default value if the array is empty.\r
\r
@see operator[], getUnchecked, getFirst\r
*/\r
- inline ElementType getLast() const noexcept\r
+ inline ElementType getLast() const\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getLast();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[numUsed - 1];\r
+ }\r
+\r
+ return ElementType();\r
}\r
\r
/** Returns a pointer to the actual array data.\r
*/\r
inline ElementType* getRawDataPointer() noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
//==============================================================================\r
*/\r
inline ElementType* begin() const noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
/** Returns a pointer to the element which follows the last element in the array.\r
*/\r
inline ElementType* end() const noexcept\r
{\r
- return values.end();\r
- }\r
+ #if JUCE_DEBUG\r
+ if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy)\r
+ return data.elements;\r
+ #endif\r
\r
- /** Returns a pointer to the first element in the array.\r
- This method is provided for compatibility with the standard C++ containers.\r
- */\r
- inline ElementType* data() const noexcept\r
- {\r
- return begin();\r
+ return data.elements + numUsed;\r
}\r
\r
//==============================================================================\r
int indexOf (ParameterType elementToLookFor) const\r
{\r
const ScopedLockType lock (getLock());\r
- auto e = values.begin();\r
- auto endPtr = values.end();\r
+ auto e = data.elements.get();\r
+ auto endPtr = e + numUsed;\r
\r
for (; e != endPtr; ++e)\r
if (elementToLookFor == *e)\r
- return static_cast<int> (e - values.begin());\r
+ return static_cast<int> (e - data.elements.get());\r
\r
return -1;\r
}\r
bool contains (ParameterType elementToLookFor) const\r
{\r
const ScopedLockType lock (getLock());\r
- auto e = values.begin();\r
- auto endPtr = values.end();\r
+ auto e = data.elements.get();\r
+ auto endPtr = e + numUsed;\r
\r
for (; e != endPtr; ++e)\r
if (elementToLookFor == *e)\r
void add (const ElementType& newElement)\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (newElement);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ new (data.elements + numUsed++) ElementType (newElement);\r
}\r
\r
/** Appends a new element at the end of the array.\r
void add (ElementType&& newElement)\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (std::move (newElement));\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ new (data.elements + numUsed++) ElementType (static_cast<ElementType&&> (newElement));\r
}\r
\r
/** Appends multiple new elements at the end of the array. */\r
void add (const ElementType& firstNewElement, OtherElements... otherElements)\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (firstNewElement, otherElements...);\r
+ data.ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
+ addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
}\r
\r
/** Appends multiple new elements at the end of the array. */\r
void add (ElementType&& firstNewElement, OtherElements... otherElements)\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (std::move (firstNewElement), otherElements...);\r
+ data.ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
+ addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement), otherElements...);\r
}\r
\r
/** Inserts a new element into the array at a given position.\r
void insert (int indexToInsertAt, ParameterType newElement)\r
{\r
const ScopedLockType lock (getLock());\r
- values.insert (indexToInsertAt, newElement, 1);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
+\r
+ if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+ {\r
+ auto* insertPos = data.elements + indexToInsertAt;\r
+ auto numberToMove = numUsed - indexToInsertAt;\r
+\r
+ if (numberToMove > 0)\r
+ memmove (insertPos + 1, insertPos, ((size_t) numberToMove) * sizeof (ElementType));\r
+\r
+ new (insertPos) ElementType (newElement);\r
+ ++numUsed;\r
+ }\r
+ else\r
+ {\r
+ new (data.elements + numUsed++) ElementType (newElement);\r
+ }\r
}\r
\r
/** Inserts multiple copies of an element into the array at a given position.\r
if (numberOfTimesToInsertIt > 0)\r
{\r
const ScopedLockType lock (getLock());\r
- values.insert (indexToInsertAt, newElement, numberOfTimesToInsertIt);\r
+ data.ensureAllocatedSize (numUsed + numberOfTimesToInsertIt);\r
+ ElementType* insertPos;\r
+\r
+ if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+ {\r
+ insertPos = data.elements + indexToInsertAt;\r
+ auto numberToMove = numUsed - indexToInsertAt;\r
+ memmove (insertPos + numberOfTimesToInsertIt, insertPos, ((size_t) numberToMove) * sizeof (ElementType));\r
+ }\r
+ else\r
+ {\r
+ insertPos = data.elements + numUsed;\r
+ }\r
+\r
+ numUsed += numberOfTimesToInsertIt;\r
+\r
+ while (--numberOfTimesToInsertIt >= 0)\r
+ {\r
+ new (insertPos) ElementType (newElement);\r
+ ++insertPos; // NB: this increment is done separately from the\r
+ // new statement to avoid a compiler bug in VS2014\r
+ }\r
}\r
}\r
\r
if (numberOfElements > 0)\r
{\r
const ScopedLockType lock (getLock());\r
- values.insertArray (indexToInsertAt, newElements, numberOfElements);\r
+ data.ensureAllocatedSize (numUsed + numberOfElements);\r
+ ElementType* insertPos = data.elements;\r
+\r
+ if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+ {\r
+ insertPos += indexToInsertAt;\r
+ auto numberToMove = numUsed - indexToInsertAt;\r
+ memmove (insertPos + numberOfElements, insertPos, (size_t) numberToMove * sizeof (ElementType));\r
+ }\r
+ else\r
+ {\r
+ insertPos += numUsed;\r
+ }\r
+\r
+ numUsed += numberOfElements;\r
+\r
+ while (--numberOfElements >= 0)\r
+ new (insertPos++) ElementType (*newElements++);\r
}\r
}\r
\r
@param newValue the new value to set for this index.\r
@see add, insert\r
*/\r
- void set (int indexToChange, ParameterType newValue)\r
+ void set (const int indexToChange, ParameterType newValue)\r
{\r
- if (indexToChange >= 0)\r
- {\r
- const ScopedLockType lock (getLock());\r
+ jassert (indexToChange >= 0);\r
+ const ScopedLockType lock (getLock());\r
\r
- if (indexToChange < values.size())\r
- values[indexToChange] = newValue;\r
- else\r
- values.add (newValue);\r
+ if (isPositiveAndBelow (indexToChange, numUsed))\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ data.elements[indexToChange] = newValue;\r
}\r
- else\r
+ else if (indexToChange >= 0)\r
{\r
- jassertfalse;\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ new (data.elements + numUsed++) ElementType (newValue);\r
}\r
}\r
\r
@param newValue the new value to set for this index.\r
@see set, getUnchecked\r
*/\r
- void setUnchecked (int indexToChange, ParameterType newValue)\r
+ void setUnchecked (const int indexToChange, ParameterType newValue)\r
{\r
const ScopedLockType lock (getLock());\r
- jassert (isPositiveAndBelow (indexToChange, values.size()));\r
- values[indexToChange] = newValue;\r
+ jassert (isPositiveAndBelow (indexToChange, numUsed));\r
+ data.elements[indexToChange] = newValue;\r
}\r
\r
/** Adds elements from an array to the end of this array.\r
const ScopedLockType lock (getLock());\r
\r
if (numElementsToAdd > 0)\r
- values.addArray (elementsToAdd, numElementsToAdd);\r
+ {\r
+ data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+ while (--numElementsToAdd >= 0)\r
+ {\r
+ new (data.elements + numUsed) ElementType (*elementsToAdd++);\r
+ ++numUsed;\r
+ }\r
+ }\r
}\r
\r
template <typename TypeToCreateFrom>\r
void addArray (const std::initializer_list<TypeToCreateFrom>& items)\r
{\r
const ScopedLockType lock (getLock());\r
- values.addArray (items);\r
+ data.ensureAllocatedSize (numUsed + (int) items.size());\r
+\r
+ for (auto& item : items)\r
+ {\r
+ new (data.elements + numUsed) ElementType (item);\r
+ ++numUsed;\r
+ }\r
}\r
\r
/** Adds elements from a null-terminated array of pointers to the end of this array.\r
{\r
const ScopedLockType lock1 (getLock());\r
const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
- values.swapWith (otherArray.values);\r
- }\r
-\r
- /** Adds elements from another array to the end of this array.\r
-\r
- @param arrayToAddFrom the array from which to copy the elements\r
- @see add\r
- */\r
- template <class OtherArrayType>\r
- void addArray (const OtherArrayType& arrayToAddFrom)\r
- {\r
- const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
- const ScopedLockType lock2 (getLock());\r
-\r
- values.addArray (arrayToAddFrom);\r
+ data.swapWith (otherArray.data);\r
+ std::swap (numUsed, otherArray.numUsed);\r
}\r
\r
/** Adds elements from another array to the end of this array.\r
@see add\r
*/\r
template <class OtherArrayType>\r
- typename std::enable_if<! std::is_pointer<OtherArrayType>::value, void>::type\r
- addArray (const OtherArrayType& arrayToAddFrom,\r
- int startIndex,\r
- int numElementsToAdd = -1)\r
+ void addArray (const OtherArrayType& arrayToAddFrom,\r
+ int startIndex = 0,\r
+ int numElementsToAdd = -1)\r
{\r
const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
- const ScopedLockType lock2 (getLock());\r
\r
- values.addArray (arrayToAddFrom, startIndex, numElementsToAdd);\r
+ {\r
+ const ScopedLockType lock2 (getLock());\r
+\r
+ if (startIndex < 0)\r
+ {\r
+ jassertfalse;\r
+ startIndex = 0;\r
+ }\r
+\r
+ if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+ numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
+\r
+ data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+ while (--numElementsToAdd >= 0)\r
+ addAssumingCapacityIsReady (arrayToAddFrom.getUnchecked (startIndex++));\r
+ }\r
}\r
\r
/** This will enlarge or shrink the array to the given number of elements, by adding\r
until its size is as specified. If its size is larger than the target, items will be\r
removed from its end to shorten it.\r
*/\r
- void resize (int targetNumItems)\r
+ void resize (const int targetNumItems)\r
{\r
jassert (targetNumItems >= 0);\r
- auto numToAdd = targetNumItems - values.size();\r
+ auto numToAdd = targetNumItems - numUsed;\r
\r
if (numToAdd > 0)\r
- insertMultiple (values.size(), ElementType(), numToAdd);\r
+ insertMultiple (numUsed, ElementType(), numToAdd);\r
else if (numToAdd < 0)\r
removeRange (targetNumItems, -numToAdd);\r
}\r
int addSorted (ElementComparator& comparator, ParameterType newElement)\r
{\r
const ScopedLockType lock (getLock());\r
- auto index = findInsertIndexInSortedArray (comparator, values.begin(), newElement, 0, values.size());\r
+ auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newElement, 0, numUsed);\r
insert (index, newElement);\r
return index;\r
}\r
\r
const ScopedLockType lock (getLock());\r
\r
- for (int s = 0, e = values.size();;)\r
+ for (int s = 0, e = numUsed;;)\r
{\r
if (s >= e)\r
return -1;\r
\r
- if (comparator.compareElements (elementToLookFor, values[s]) == 0)\r
+ if (comparator.compareElements (elementToLookFor, data.elements[s]) == 0)\r
return s;\r
\r
auto halfway = (s + e) / 2;\r
if (halfway == s)\r
return -1;\r
\r
- if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0)\r
+ if (comparator.compareElements (elementToLookFor, data.elements[halfway]) >= 0)\r
s = halfway;\r
else\r
e = halfway;\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
+ {\r
+ jassert (data.elements != nullptr);\r
removeInternal (indexToRemove);\r
+ }\r
}\r
\r
/** Removes an element from the array.\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
- ElementType removed (values[indexToRemove]);\r
+ jassert (data.elements != nullptr);\r
+ ElementType removed (data.elements[indexToRemove]);\r
removeInternal (indexToRemove);\r
return removed;\r
}\r
\r
- return ElementType();\r
+ return {};\r
}\r
\r
/** Removes an element from the array.\r
jassert (elementToRemove != nullptr);\r
const ScopedLockType lock (getLock());\r
\r
- jassert (values.begin() != nullptr);\r
- auto indexToRemove = (int) (elementToRemove - values.begin());\r
+ jassert (data.elements != nullptr);\r
+ auto indexToRemove = (int) (elementToRemove - data.elements);\r
\r
- if (! isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (! isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
jassertfalse;\r
return;\r
void removeFirstMatchingValue (ParameterType valueToRemove)\r
{\r
const ScopedLockType lock (getLock());\r
- auto* e = values.begin();\r
+ auto* e = data.elements.get();\r
\r
- for (int i = 0; i < values.size(); ++i)\r
+ for (int i = 0; i < numUsed; ++i)\r
{\r
if (valueToRemove == e[i])\r
{\r
int numRemoved = 0;\r
const ScopedLockType lock (getLock());\r
\r
- for (int i = values.size(); --i >= 0;)\r
+ for (int i = numUsed; --i >= 0;)\r
{\r
- if (valueToRemove == values[i])\r
+ if (valueToRemove == data.elements[i])\r
{\r
removeInternal (i);\r
++numRemoved;\r
@see remove, removeRange, removeAllInstancesOf\r
*/\r
template <typename PredicateType>\r
- int removeIf (PredicateType&& predicate)\r
+ int removeIf (PredicateType predicate)\r
{\r
int numRemoved = 0;\r
const ScopedLockType lock (getLock());\r
\r
- for (int i = values.size(); --i >= 0;)\r
+ for (int i = numUsed; --i >= 0;)\r
{\r
- if (predicate (values[i]))\r
+ if (predicate (data.elements[i]))\r
{\r
removeInternal (i);\r
++numRemoved;\r
void removeRange (int startIndex, int numberToRemove)\r
{\r
const ScopedLockType lock (getLock());\r
+ auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+ startIndex = jlimit (0, numUsed, startIndex);\r
\r
- auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
- startIndex = jlimit (0, values.size(), startIndex);\r
- numberToRemove = endIndex - startIndex;\r
-\r
- if (numberToRemove > 0)\r
+ if (endIndex > startIndex)\r
{\r
- values.removeElements (startIndex, numberToRemove);\r
+ auto* e = data.elements + startIndex;\r
+ numberToRemove = endIndex - startIndex;\r
+\r
+ for (int i = 0; i < numberToRemove; ++i)\r
+ e[i].~ElementType();\r
+\r
+ auto numToShift = numUsed - endIndex;\r
+\r
+ if (numToShift > 0)\r
+ memmove (e, e + numberToRemove, ((size_t) numToShift) * sizeof (ElementType));\r
+\r
+ numUsed -= numberToRemove;\r
minimiseStorageAfterRemoval();\r
}\r
}\r
*/\r
void removeLast (int howManyToRemove = 1)\r
{\r
- jassert (howManyToRemove >= 0);\r
+ const ScopedLockType lock (getLock());\r
\r
- if (howManyToRemove > 0)\r
- {\r
- const ScopedLockType lock (getLock());\r
+ if (howManyToRemove > numUsed)\r
+ howManyToRemove = numUsed;\r
\r
- if (howManyToRemove > values.size())\r
- howManyToRemove = values.size();\r
+ for (int i = 1; i <= howManyToRemove; ++i)\r
+ data.elements[numUsed - i].~ElementType();\r
\r
- values.removeElements (values.size() - howManyToRemove, howManyToRemove);\r
- minimiseStorageAfterRemoval();\r
- }\r
+ numUsed -= howManyToRemove;\r
+ minimiseStorageAfterRemoval();\r
}\r
\r
/** Removes any elements which are also in another array.\r
{\r
if (otherArray.size() > 0)\r
{\r
- for (int i = values.size(); --i >= 0;)\r
- if (otherArray.contains (values[i]))\r
+ for (int i = numUsed; --i >= 0;)\r
+ if (otherArray.contains (data.elements[i]))\r
removeInternal (i);\r
}\r
}\r
}\r
else\r
{\r
- for (int i = values.size(); --i >= 0;)\r
- if (! otherArray.contains (values[i]))\r
+ for (int i = numUsed; --i >= 0;)\r
+ if (! otherArray.contains (data.elements[i]))\r
removeInternal (i);\r
}\r
}\r
void swap (int index1, int index2)\r
{\r
const ScopedLockType lock (getLock());\r
- values.swap (index1, index2);\r
+\r
+ if (isPositiveAndBelow (index1, numUsed)\r
+ && isPositiveAndBelow (index2, numUsed))\r
+ {\r
+ std::swap (data.elements[index1],\r
+ data.elements[index2]);\r
+ }\r
}\r
\r
/** Moves one of the values to a different position.\r
if (currentIndex != newIndex)\r
{\r
const ScopedLockType lock (getLock());\r
- values.move (currentIndex, newIndex);\r
+\r
+ if (isPositiveAndBelow (currentIndex, numUsed))\r
+ {\r
+ if (! isPositiveAndBelow (newIndex, numUsed))\r
+ newIndex = numUsed - 1;\r
+\r
+ char tempCopy[sizeof (ElementType)];\r
+ memcpy (tempCopy, data.elements + currentIndex, sizeof (ElementType));\r
+\r
+ if (newIndex > currentIndex)\r
+ {\r
+ memmove (data.elements + currentIndex,\r
+ data.elements + currentIndex + 1,\r
+ sizeof (ElementType) * (size_t) (newIndex - currentIndex));\r
+ }\r
+ else\r
+ {\r
+ memmove (data.elements + newIndex + 1,\r
+ data.elements + newIndex,\r
+ sizeof (ElementType) * (size_t) (currentIndex - newIndex));\r
+ }\r
+\r
+ memcpy (data.elements + newIndex, tempCopy, sizeof (ElementType));\r
+ }\r
}\r
}\r
\r
void minimiseStorageOverheads()\r
{\r
const ScopedLockType lock (getLock());\r
- values.shrinkToNoMoreThan (values.size());\r
+ data.shrinkToNoMoreThan (numUsed);\r
}\r
\r
/** Increases the array's internal storage to hold a minimum number of elements.\r
the array won't have to keep dynamically resizing itself as the elements\r
are added, and it'll therefore be more efficient.\r
*/\r
- void ensureStorageAllocated (int minNumElements)\r
+ void ensureStorageAllocated (const int minNumElements)\r
{\r
const ScopedLockType lock (getLock());\r
- values.ensureAllocatedSize (minNumElements);\r
+ data.ensureAllocatedSize (minNumElements);\r
}\r
\r
//==============================================================================\r
*/\r
template <class ElementComparator>\r
void sort (ElementComparator& comparator,\r
- bool retainOrderOfEquivalentItems = false)\r
+ const bool retainOrderOfEquivalentItems = false)\r
{\r
const ScopedLockType lock (getLock());\r
ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
// avoids getting warning messages about the parameter being unused\r
- sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+ sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
}\r
\r
//==============================================================================\r
To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
an object of ScopedLockType as an RAII lock for it.\r
*/\r
- inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return values; }\r
+ inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; }\r
\r
/** Returns the type of scoped lock to use for locking this array */\r
using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
\r
private:\r
//==============================================================================\r
- ArrayBase<ElementType, TypeOfCriticalSectionToUse> values;\r
+ ArrayAllocationBase <ElementType, TypeOfCriticalSectionToUse> data;\r
+ int numUsed = 0;\r
\r
- void removeInternal (int indexToRemove)\r
+ void removeInternal (const int indexToRemove)\r
{\r
- values.removeElements (indexToRemove, 1);\r
+ --numUsed;\r
+ auto* e = data.elements + indexToRemove;\r
+ e->~ElementType();\r
+ auto numberToShift = numUsed - indexToRemove;\r
+\r
+ if (numberToShift > 0)\r
+ memmove (e, e + 1, ((size_t) numberToShift) * sizeof (ElementType));\r
+\r
minimiseStorageAfterRemoval();\r
}\r
\r
+ inline void deleteAllElements() noexcept\r
+ {\r
+ for (int i = 0; i < numUsed; ++i)\r
+ data.elements[i].~ElementType();\r
+ }\r
+\r
void minimiseStorageAfterRemoval()\r
{\r
- if (values.capacity() > jmax (minimumAllocatedSize, values.size() * 2))\r
- values.shrinkToNoMoreThan (jmax (values.size(), jmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType))));\r
+ if (data.numAllocated > jmax (minimumAllocatedSize, numUsed * 2))\r
+ data.shrinkToNoMoreThan (jmax (numUsed, jmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType))));\r
+ }\r
+\r
+ void addAssumingCapacityIsReady (const ElementType& e) { new (data.elements + numUsed++) ElementType (e); }\r
+ void addAssumingCapacityIsReady (ElementType&& e) { new (data.elements + numUsed++) ElementType (static_cast<ElementType&&> (e)); }\r
+\r
+ template <typename... OtherElements>\r
+ void addAssumingCapacityIsReady (const ElementType& firstNewElement, OtherElements... otherElements)\r
+ {\r
+ addAssumingCapacityIsReady (firstNewElement);\r
+ addAssumingCapacityIsReady (otherElements...);\r
+ }\r
+\r
+ template <typename... OtherElements>\r
+ void addAssumingCapacityIsReady (ElementType&& firstNewElement, OtherElements... otherElements)\r
+ {\r
+ addAssumingCapacityIsReady (static_cast<ElementType&&> (firstNewElement));\r
+ addAssumingCapacityIsReady (otherElements...);\r
}\r
};\r
\r
/**\r
Implements some basic array storage allocation functions.\r
\r
- This class isn't really for public use - it used to be part of the\r
- container classes but has since been superseded by ArrayBase. Eventually\r
- it will be removed from the API.\r
+ This class isn't really for public use - it's used by the other\r
+ array classes, but might come in handy for some purposes.\r
+\r
+ It inherits from a critical section class to allow the arrays to use\r
+ the "empty base class optimisation" pattern to reduce their footprint.\r
+\r
+ @see Array, OwnedArray, ReferenceCountedArray\r
\r
@tags{Core}\r
*/\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2018 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-namespace ArrayBaseTestsHelpers\r
-{\r
- class TriviallyCopyableType\r
- {\r
- public:\r
- TriviallyCopyableType() = default;\r
-\r
- TriviallyCopyableType (int v)\r
- : value (v)\r
- {}\r
-\r
- TriviallyCopyableType (float v)\r
- : value ((int) v)\r
- {}\r
-\r
- bool operator== (const TriviallyCopyableType& other) const\r
- {\r
- return getValue() == other.getValue();\r
- }\r
-\r
- int getValue() const { return value; }\r
-\r
- private:\r
- int value { -1111 };\r
- };\r
-\r
- class NonTriviallyCopyableType\r
- {\r
- public:\r
- NonTriviallyCopyableType() = default;\r
-\r
- NonTriviallyCopyableType (int v)\r
- : value (v)\r
- {}\r
-\r
- NonTriviallyCopyableType (float v)\r
- : value ((int) v)\r
- {}\r
-\r
- NonTriviallyCopyableType (const NonTriviallyCopyableType& other)\r
- : value (other.value)\r
- {}\r
-\r
- NonTriviallyCopyableType& operator= (const NonTriviallyCopyableType& other)\r
- {\r
- value = other.value;\r
- return *this;\r
- }\r
-\r
- bool operator== (const NonTriviallyCopyableType& other) const\r
- {\r
- return getValue() == other.getValue();\r
- }\r
-\r
- int getValue() const { return *ptr; }\r
-\r
- private:\r
- int value { -1111 };\r
- int* ptr = &value;\r
- };\r
-}\r
-\r
-bool operator== (const ArrayBaseTestsHelpers::TriviallyCopyableType& tct,\r
- const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct)\r
-{\r
- return tct.getValue() == ntct.getValue();\r
-}\r
-\r
-bool operator== (const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct,\r
- const ArrayBaseTestsHelpers::TriviallyCopyableType& tct)\r
-{\r
- return tct == ntct;\r
-}\r
-\r
-class ArrayBaseTests : public UnitTest\r
-{\r
- using CopyableType = ArrayBaseTestsHelpers::TriviallyCopyableType;\r
- using NoncopyableType = ArrayBaseTestsHelpers::NonTriviallyCopyableType;\r
-\r
-public:\r
- ArrayBaseTests()\r
- : UnitTest ("ArrayBase", "Containers")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- static_assert (std::is_trivially_copyable<CopyableType>::value,\r
- "Test TriviallyCopyableType is not trivially copyable");\r
- static_assert (! std::is_trivially_copyable<NoncopyableType>::value,\r
- "Test NonTriviallyCopyableType is trivially copyable");\r
-\r
- beginTest ("grow capacity");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- int originalCapacity = 4;\r
- referenceContainer.reserve ((size_t) originalCapacity);\r
- expectEquals ((int) referenceContainer.capacity(), originalCapacity);\r
- copyableContainer.setAllocatedSize (originalCapacity);\r
- expectEquals (copyableContainer.capacity(), originalCapacity);\r
- noncopyableContainer.setAllocatedSize (originalCapacity);\r
- expectEquals (noncopyableContainer.capacity(), originalCapacity);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 33);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- expect ((int) referenceContainer.capacity() != originalCapacity);\r
- expect (copyableContainer.capacity() != originalCapacity);\r
- expect (noncopyableContainer.capacity() != originalCapacity);\r
- }\r
-\r
- beginTest ("shrink capacity");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- int numElements = 45;\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, numElements);\r
-\r
- copyableContainer.shrinkToNoMoreThan (numElements);\r
- noncopyableContainer.setAllocatedSize (numElements + 1);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- referenceContainer.clear();\r
- copyableContainer.removeElements (0, numElements);\r
- noncopyableContainer.removeElements (0, numElements);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- copyableContainer.setAllocatedSize (0);\r
- noncopyableContainer.setAllocatedSize (0);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, numElements);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("equality");\r
- {\r
- std::vector<int> referenceContainer = { 1, 2, 3 };\r
- ArrayBase<int, DummyCriticalSection> testContainer1, testContainer2;\r
-\r
- for (auto i : referenceContainer)\r
- {\r
- testContainer1.add (i);\r
- testContainer2.add (i);\r
- }\r
-\r
- expect (testContainer1 == referenceContainer);\r
- expect (testContainer2 == testContainer1);\r
-\r
- testContainer1.ensureAllocatedSize (257);\r
- referenceContainer.shrink_to_fit();\r
-\r
- expect (testContainer1 == referenceContainer);\r
- expect (testContainer2 == testContainer1);\r
-\r
- testContainer1.removeElements (0, 1);\r
-\r
- expect (testContainer1 != referenceContainer);\r
- expect (testContainer2 != testContainer1);\r
- }\r
-\r
- beginTest ("accessors");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 3);\r
-\r
- int testValue = -123;\r
- referenceContainer[0] = testValue;\r
- copyableContainer[0] = testValue;\r
- noncopyableContainer[0] = testValue;\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- expect (copyableContainer .getFirst().getValue() == testValue);\r
- expect (noncopyableContainer.getFirst().getValue() == testValue);\r
-\r
- auto last = referenceContainer.back().getValue();\r
-\r
- expectEquals (copyableContainer .getLast().getValue(), last);\r
- expectEquals (noncopyableContainer.getLast().getValue(), last);\r
-\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableEmpty;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableEmpty;\r
-\r
- auto defualtValue = CopyableType().getValue();\r
- expectEquals (defualtValue, NoncopyableType().getValue());\r
-\r
- expectEquals (copyableEmpty .getFirst().getValue(), defualtValue);\r
- expectEquals (noncopyableEmpty.getFirst().getValue(), defualtValue);\r
- expectEquals (copyableEmpty .getLast() .getValue(), defualtValue);\r
- expectEquals (noncopyableEmpty.getLast() .getValue(), defualtValue);\r
-\r
- ArrayBase<float*, DummyCriticalSection> floatPointers;\r
- expect (floatPointers.getValueWithDefault (-3) == nullptr);\r
- }\r
-\r
- beginTest ("add moved");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- for (int i = 0; i < 5; ++i)\r
- {\r
- CopyableType ref (-i);\r
- CopyableType ct (-i);\r
- NoncopyableType nct (-i);\r
- referenceContainer.push_back (std::move (ref));\r
- copyableContainer.add (std::move (ct));\r
- noncopyableContainer.add (std::move (nct));\r
- }\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("add multiple");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- for (int i = 4; i < 7; ++i)\r
- referenceContainer.push_back ({ -i });\r
-\r
- copyableContainer.add (CopyableType (-4), CopyableType (-5), CopyableType (-6));\r
- noncopyableContainer.add (NoncopyableType (-4), NoncopyableType (-5), NoncopyableType (-6));\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("add array from a pointer");\r
- {\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- std::vector<CopyableType> copyableData = { 3, 4, 5 };\r
- std::vector<NoncopyableType> noncopyableData = { 3, 4, 5 };\r
-\r
- copyableContainer.addArray (copyableData.data(), (int) copyableData.size());\r
- noncopyableContainer.addArray (noncopyableData.data(), (int) noncopyableData.size());\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, copyableData);\r
- }\r
-\r
- beginTest ("add array from a pointer of a different type");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- std::vector<float> floatData = { 1.4f, 2.5f, 3.6f };\r
-\r
- for (auto f : floatData)\r
- referenceContainer.push_back ({ f });\r
-\r
- copyableContainer.addArray (floatData.data(), (int) floatData.size());\r
- noncopyableContainer.addArray (floatData.data(), (int) floatData.size());\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("add array from initilizer list");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- std::initializer_list<CopyableType> ilct { { 3 }, { 4 }, { 5 } };\r
- std::initializer_list<NoncopyableType> ilnct { { 3 }, { 4 }, { 5 } };\r
-\r
- for (auto v : ilct)\r
- referenceContainer.push_back ({ v });\r
-\r
- copyableContainer.addArray (ilct);\r
- noncopyableContainer.addArray (ilnct);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("add array from containers");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 5);\r
-\r
- std::vector<CopyableType> referenceContainerCopy (referenceContainer);\r
- std::vector<NoncopyableType> noncopyableReferenceContainerCopy;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainerCopy;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainerCopy;\r
-\r
- for (auto& v : referenceContainerCopy)\r
- noncopyableReferenceContainerCopy.push_back ({ v.getValue() });\r
-\r
- for (size_t i = 0; i < referenceContainerCopy.size(); ++i)\r
- {\r
- auto value = referenceContainerCopy[i].getValue();\r
- copyableContainerCopy.add ({ value });\r
- noncopyableContainerCopy.add ({ value });\r
- }\r
-\r
- // From self-types\r
- copyableContainer.addArray (copyableContainerCopy);\r
- noncopyableContainer.addArray (noncopyableContainerCopy);\r
-\r
- for (auto v : referenceContainerCopy)\r
- referenceContainer.push_back (v);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- // From std containers\r
- copyableContainer.addArray (referenceContainerCopy);\r
- noncopyableContainer.addArray (noncopyableReferenceContainerCopy);\r
-\r
- for (auto v : referenceContainerCopy)\r
- referenceContainer.push_back (v);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- // From std containers with offset\r
- int offset = 5;\r
- copyableContainer.addArray (referenceContainerCopy, offset);\r
- noncopyableContainer.addArray (noncopyableReferenceContainerCopy, offset);\r
-\r
- for (size_t i = 5; i < referenceContainerCopy.size(); ++i)\r
- referenceContainer.push_back (referenceContainerCopy[i]);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("insert");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 8);\r
-\r
- referenceContainer.insert (referenceContainer.begin(), -4);\r
- copyableContainer.insert (0, -4, 1);\r
- noncopyableContainer.insert (0, -4, 1);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- for (int i = 0; i < 3; ++i)\r
- referenceContainer.insert (referenceContainer.begin() + 1, -3);\r
-\r
- copyableContainer.insert (1, -3, 3);\r
- noncopyableContainer.insert (1, -3, 3);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- for (int i = 0; i < 50; ++i)\r
- referenceContainer.insert (referenceContainer.end() - 1, -9);\r
-\r
- copyableContainer.insert (copyableContainer.size() - 2, -9, 50);\r
- noncopyableContainer.insert (noncopyableContainer.size() - 2, -9, 50);\r
- }\r
-\r
- beginTest ("insert array");\r
- {\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- std::vector<CopyableType> copyableData = { 3, 4, 5, 6, 7, 8 };\r
- std::vector<NoncopyableType> noncopyableData = { 3, 4, 5, 6, 7, 8 };\r
-\r
- std::vector<CopyableType> referenceContainer { copyableData };\r
-\r
- copyableContainer.insertArray (0, copyableData.data(), (int) copyableData.size());\r
- noncopyableContainer.insertArray (0, noncopyableData.data(), (int) noncopyableData.size());\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- int insertPos = copyableContainer.size() - 1;\r
-\r
- for (auto it = copyableData.end(); it != copyableData.begin(); --it)\r
- referenceContainer.insert (referenceContainer.begin() + insertPos, CopyableType (*(it - 1)));\r
-\r
- copyableContainer.insertArray (insertPos, copyableData.data(), (int) copyableData.size());\r
- noncopyableContainer.insertArray (insertPos, noncopyableData.data(), (int) noncopyableData.size());\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("remove");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 17);\r
-\r
- for (int i = 0; i < 4; ++i)\r
- {\r
- referenceContainer.erase (referenceContainer.begin() + i);\r
- copyableContainer.removeElements (i, 1);\r
- noncopyableContainer.removeElements (i, 1);\r
- }\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 17);\r
- int blockSize = 3;\r
-\r
- for (int i = 0; i < 4; ++i)\r
- {\r
- for (int j = 0; j < blockSize; ++j)\r
- referenceContainer.erase (referenceContainer.begin() + i);\r
-\r
- copyableContainer.removeElements (i, blockSize);\r
- noncopyableContainer.removeElements (i, blockSize);\r
- }\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
-\r
- auto numToRemove = copyableContainer.size() - 2;\r
-\r
- for (int i = 0; i < numToRemove; ++i)\r
- referenceContainer.erase (referenceContainer.begin() + 1);\r
-\r
- copyableContainer.removeElements (1, numToRemove);\r
- noncopyableContainer.removeElements (1, numToRemove);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
-\r
- beginTest ("move");\r
- {\r
- std::vector<CopyableType> referenceContainer;\r
- ArrayBase<CopyableType, DummyCriticalSection> copyableContainer;\r
- ArrayBase<NoncopyableType, DummyCriticalSection> noncopyableContainer;\r
-\r
- addData (referenceContainer, copyableContainer, noncopyableContainer, 6);\r
-\r
- std::vector<std::pair<int, int>> testValues;\r
- testValues.emplace_back (2, 4);\r
- testValues.emplace_back (0, 5);\r
- testValues.emplace_back (4, 1);\r
- testValues.emplace_back (5, 0);\r
-\r
- for (auto p : testValues)\r
- {\r
- if (p.second > p.first)\r
- std::rotate (referenceContainer.begin() + p.first,\r
- referenceContainer.begin() + p.first + 1,\r
- referenceContainer.begin() + p.second + 1);\r
- else\r
- std::rotate (referenceContainer.begin() + p.second,\r
- referenceContainer.begin() + p.first,\r
- referenceContainer.begin() + p.first + 1);\r
-\r
- copyableContainer.move (p.first, p.second);\r
- noncopyableContainer.move (p.first, p.second);\r
-\r
- checkEqual (copyableContainer, noncopyableContainer, referenceContainer);\r
- }\r
- }\r
-\r
- beginTest ("After converting move construction, ownership is transferred");\r
- {\r
- Derived obj;\r
- ArrayBase<Derived*, DummyCriticalSection> derived;\r
- derived.setAllocatedSize (5);\r
- derived.add (&obj);\r
-\r
- ArrayBase<Base*, DummyCriticalSection> base { std::move (derived) };\r
-\r
- expectEquals (base.capacity(), 5);\r
- expectEquals (base.size(), 1);\r
- expect (base.getFirst() == &obj);\r
- expectEquals (derived.capacity(), 0);\r
- expectEquals (derived.size(), 0);\r
- expect (derived.data() == nullptr);\r
- }\r
-\r
- beginTest ("After converting move assignment, ownership is transferred");\r
- {\r
- Derived obj;\r
- ArrayBase<Derived*, DummyCriticalSection> derived;\r
- derived.setAllocatedSize (5);\r
- derived.add (&obj);\r
- ArrayBase<Base*, DummyCriticalSection> base;\r
-\r
- base = std::move (derived);\r
-\r
- expectEquals (base.capacity(), 5);\r
- expectEquals (base.size(), 1);\r
- expect (base.getFirst() == &obj);\r
- expectEquals (derived.capacity(), 0);\r
- expectEquals (derived.size(), 0);\r
- expect (derived.data() == nullptr);\r
- }\r
- }\r
-\r
-private:\r
- struct Base\r
- {\r
- virtual ~Base() = default;\r
- };\r
-\r
- struct Derived : Base\r
- {\r
- };\r
-\r
- static void addData (std::vector<CopyableType>& referenceContainer,\r
- ArrayBase<CopyableType, DummyCriticalSection>& copyableContainer,\r
- ArrayBase<NoncopyableType, DummyCriticalSection>& NoncopyableContainer,\r
- int numValues)\r
- {\r
- for (int i = 0; i < numValues; ++i)\r
- {\r
- referenceContainer.push_back ({ i });\r
- copyableContainer.add ({ i });\r
- NoncopyableContainer.add ({ i });\r
- }\r
- }\r
-\r
- template<typename A, typename B>\r
- void checkEqual (const ArrayBase<A, DummyCriticalSection>& a,\r
- const ArrayBase<B, DummyCriticalSection>& b)\r
- {\r
- expectEquals ((int) a.size(), (int) b.size());\r
-\r
- for (int i = 0; i < (int) a.size(); ++i)\r
- expect (a[i] == b[i]);\r
- }\r
-\r
- template<typename A, typename B>\r
- void checkEqual (ArrayBase<A, DummyCriticalSection>& a,\r
- std::vector<B>& b)\r
- {\r
- expectEquals ((int) a.size(), (int) b.size());\r
-\r
- for (int i = 0; i < (int) a.size(); ++i)\r
- expect (a[i] == b[(size_t) i]);\r
- }\r
-\r
- template<typename A, typename B, typename C>\r
- void checkEqual (ArrayBase<A, DummyCriticalSection>& a,\r
- ArrayBase<B, DummyCriticalSection>& b,\r
- std::vector<C>& c)\r
- {\r
- checkEqual (a, b);\r
- checkEqual (a, c);\r
- checkEqual (b, c);\r
- }\r
-};\r
-\r
-static ArrayBaseTests arrayBaseTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-/**\r
- A basic object container.\r
-\r
- This class isn't really for public use - it's used by the other\r
- array classes, but might come in handy for some purposes.\r
-\r
- It inherits from a critical section class to allow the arrays to use\r
- the "empty base class optimisation" pattern to reduce their footprint.\r
-\r
- @see Array, OwnedArray, ReferenceCountedArray\r
-\r
- @tags{Core}\r
-*/\r
-template <class ElementType, class TypeOfCriticalSectionToUse>\r
-class ArrayBase : public TypeOfCriticalSectionToUse\r
-{\r
-private:\r
- using ParameterType = typename TypeHelpers::ParameterType<ElementType>::type;\r
-\r
- template <class OtherElementType, class OtherCriticalSection>\r
- using AllowConversion = typename std::enable_if<! std::is_same<std::tuple<ElementType, TypeOfCriticalSectionToUse>,\r
- std::tuple<OtherElementType, OtherCriticalSection>>::value>::type;\r
-\r
-public:\r
- //==============================================================================\r
- ArrayBase() = default;\r
-\r
- ~ArrayBase()\r
- {\r
- clear();\r
- }\r
-\r
- ArrayBase (ArrayBase&& other) noexcept\r
- : elements (std::move (other.elements)),\r
- numAllocated (other.numAllocated),\r
- numUsed (other.numUsed)\r
- {\r
- other.numAllocated = 0;\r
- other.numUsed = 0;\r
- }\r
-\r
- ArrayBase& operator= (ArrayBase&& other) noexcept\r
- {\r
- if (this != &other)\r
- {\r
- auto tmp (std::move (other));\r
- swapWith (tmp);\r
- }\r
-\r
- return *this;\r
- }\r
-\r
- /** Converting move constructor.\r
- Only enabled when the other array has a different type to this one.\r
- If you see a compile error here, it's probably because you're attempting a conversion that\r
- HeapBlock won't allow.\r
- */\r
- template <class OtherElementType,\r
- class OtherCriticalSection,\r
- typename = AllowConversion<OtherElementType, OtherCriticalSection>>\r
- ArrayBase (ArrayBase<OtherElementType, OtherCriticalSection>&& other) noexcept\r
- : elements (std::move (other.elements)),\r
- numAllocated (other.numAllocated),\r
- numUsed (other.numUsed)\r
- {\r
- other.numAllocated = 0;\r
- other.numUsed = 0;\r
- }\r
-\r
- /** Converting move assignment operator.\r
- Only enabled when the other array has a different type to this one.\r
- If you see a compile error here, it's probably because you're attempting a conversion that\r
- HeapBlock won't allow.\r
- */\r
- template <class OtherElementType,\r
- class OtherCriticalSection,\r
- typename = AllowConversion<OtherElementType, OtherCriticalSection>>\r
- ArrayBase& operator= (ArrayBase<OtherElementType, OtherCriticalSection>&& other) noexcept\r
- {\r
- // No need to worry about assignment to *this, because 'other' must be of a different type.\r
- elements = std::move (other.elements);\r
- numAllocated = other.numAllocated;\r
- numUsed = other.numUsed;\r
-\r
- other.numAllocated = 0;\r
- other.numUsed = 0;\r
-\r
- return *this;\r
- }\r
-\r
- //==============================================================================\r
- template <class OtherArrayType>\r
- bool operator== (const OtherArrayType& other) const noexcept\r
- {\r
- if (size() != (int) other.size())\r
- return false;\r
-\r
- auto* e = begin();\r
-\r
- for (auto& o : other)\r
- if (! (*e++ == o))\r
- return false;\r
-\r
- return true;\r
- }\r
-\r
- template <class OtherArrayType>\r
- bool operator!= (const OtherArrayType& other) const noexcept\r
- {\r
- return ! operator== (other);\r
- }\r
-\r
- //==============================================================================\r
- inline ElementType& operator[] (const int index) const noexcept\r
- {\r
- jassert (elements != nullptr);\r
- jassert (isPositiveAndBelow (index, numUsed));\r
- return elements[index];\r
- }\r
-\r
- inline ElementType getValueWithDefault (const int index) const noexcept\r
- {\r
- return isPositiveAndBelow (index, numUsed) ? elements[index] : ElementType();\r
- }\r
-\r
- inline ElementType getFirst() const noexcept\r
- {\r
- return numUsed > 0 ? elements[0] : ElementType();\r
- }\r
-\r
- inline ElementType getLast() const noexcept\r
- {\r
- return numUsed > 0 ? elements[numUsed - 1] : ElementType();\r
- }\r
-\r
- //==============================================================================\r
- inline ElementType* begin() const noexcept\r
- {\r
- return elements;\r
- }\r
-\r
- inline ElementType* end() const noexcept\r
- {\r
- return elements + numUsed;\r
- }\r
-\r
- inline ElementType* data() const noexcept\r
- {\r
- return elements;\r
- }\r
-\r
- inline int size() const noexcept\r
- {\r
- return numUsed;\r
- }\r
-\r
- inline int capacity() const noexcept\r
- {\r
- return numAllocated;\r
- }\r
-\r
- //==============================================================================\r
- void setAllocatedSize (int numElements)\r
- {\r
- jassert (numElements >= numUsed);\r
-\r
- if (numAllocated != numElements)\r
- {\r
- if (numElements > 0)\r
- setAllocatedSizeInternal (numElements);\r
- else\r
- elements.free();\r
- }\r
-\r
- numAllocated = numElements;\r
- }\r
-\r
- void ensureAllocatedSize (int minNumElements)\r
- {\r
- if (minNumElements > numAllocated)\r
- setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7);\r
-\r
- jassert (numAllocated <= 0 || elements != nullptr);\r
- }\r
-\r
- void shrinkToNoMoreThan (int maxNumElements)\r
- {\r
- if (maxNumElements < numAllocated)\r
- setAllocatedSize (maxNumElements);\r
- }\r
-\r
- void clear()\r
- {\r
- for (int i = 0; i < numUsed; ++i)\r
- elements[i].~ElementType();\r
-\r
- numUsed = 0;\r
- }\r
-\r
- //==============================================================================\r
- void swapWith (ArrayBase& other) noexcept\r
- {\r
- elements.swapWith (other.elements);\r
- std::swap (numAllocated, other.numAllocated);\r
- std::swap (numUsed, other.numUsed);\r
- }\r
-\r
- //==============================================================================\r
- void add (const ElementType& newElement)\r
- {\r
- checkSourceIsNotAMember (&newElement);\r
- ensureAllocatedSize (numUsed + 1);\r
- addAssumingCapacityIsReady (newElement);\r
- }\r
-\r
- void add (ElementType&& newElement)\r
- {\r
- checkSourceIsNotAMember (&newElement);\r
- ensureAllocatedSize (numUsed + 1);\r
- addAssumingCapacityIsReady (std::move (newElement));\r
- }\r
-\r
- template <typename... OtherElements>\r
- void add (const ElementType& firstNewElement, OtherElements... otherElements)\r
- {\r
- checkSourceIsNotAMember (&firstNewElement);\r
- ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
- addAssumingCapacityIsReady (firstNewElement, otherElements...);\r
- }\r
-\r
- template <typename... OtherElements>\r
- void add (ElementType&& firstNewElement, OtherElements... otherElements)\r
- {\r
- checkSourceIsNotAMember (&firstNewElement);\r
- ensureAllocatedSize (numUsed + 1 + (int) sizeof... (otherElements));\r
- addAssumingCapacityIsReady (std::move (firstNewElement), otherElements...);\r
- }\r
-\r
- //==============================================================================\r
- template <typename Type>\r
- void addArray (const Type* elementsToAdd, int numElementsToAdd)\r
- {\r
- ensureAllocatedSize (numUsed + numElementsToAdd);\r
- addArrayInternal (elementsToAdd, numElementsToAdd);\r
- numUsed += numElementsToAdd;\r
- }\r
-\r
- template <typename TypeToCreateFrom>\r
- void addArray (const std::initializer_list<TypeToCreateFrom>& items)\r
- {\r
- ensureAllocatedSize (numUsed + (int) items.size());\r
-\r
- for (auto& item : items)\r
- new (elements + numUsed++) ElementType (item);\r
- }\r
-\r
- template <class OtherArrayType>\r
- void addArray (const OtherArrayType& arrayToAddFrom)\r
- {\r
- jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!\r
- ensureAllocatedSize (numUsed + (int) arrayToAddFrom.size());\r
-\r
- for (auto& e : arrayToAddFrom)\r
- addAssumingCapacityIsReady (e);\r
- }\r
-\r
- template <class OtherArrayType>\r
- typename std::enable_if<! std::is_pointer<OtherArrayType>::value, int>::type\r
- addArray (const OtherArrayType& arrayToAddFrom,\r
- int startIndex, int numElementsToAdd = -1)\r
- {\r
- jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!\r
-\r
- if (startIndex < 0)\r
- {\r
- jassertfalse;\r
- startIndex = 0;\r
- }\r
-\r
- if (numElementsToAdd < 0 || startIndex + numElementsToAdd > (int) arrayToAddFrom.size())\r
- numElementsToAdd = (int) arrayToAddFrom.size() - startIndex;\r
-\r
- addArray (arrayToAddFrom.data() + startIndex, numElementsToAdd);\r
-\r
- return numElementsToAdd;\r
- }\r
-\r
- //==============================================================================\r
- void insert (int indexToInsertAt, ParameterType newElement, int numberOfTimesToInsertIt)\r
- {\r
- checkSourceIsNotAMember (&newElement);\r
- auto* space = createInsertSpace (indexToInsertAt, numberOfTimesToInsertIt);\r
-\r
- for (int i = 0; i < numberOfTimesToInsertIt; ++i)\r
- new (space++) ElementType (newElement);\r
-\r
- numUsed += numberOfTimesToInsertIt;\r
- }\r
-\r
- void insertArray (int indexToInsertAt, const ElementType* newElements, int numberOfElements)\r
- {\r
- auto* space = createInsertSpace (indexToInsertAt, numberOfElements);\r
-\r
- for (int i = 0; i < numberOfElements; ++i)\r
- new (space++) ElementType (*(newElements++));\r
-\r
- numUsed += numberOfElements;\r
- }\r
-\r
- //==============================================================================\r
- void removeElements (int indexToRemoveAt, int numElementsToRemove)\r
- {\r
- jassert (indexToRemoveAt >= 0);\r
- jassert (numElementsToRemove >= 0);\r
- jassert (indexToRemoveAt + numElementsToRemove <= numUsed);\r
-\r
- if (numElementsToRemove > 0)\r
- {\r
- removeElementsInternal (indexToRemoveAt, numElementsToRemove);\r
- numUsed -= numElementsToRemove;\r
- }\r
- }\r
-\r
- //==============================================================================\r
- void swap (int index1, int index2)\r
- {\r
- if (isPositiveAndBelow (index1, numUsed)\r
- && isPositiveAndBelow (index2, numUsed))\r
- {\r
- std::swap (elements[index1],\r
- elements[index2]);\r
- }\r
- }\r
-\r
- //==============================================================================\r
- void move (int currentIndex, int newIndex) noexcept\r
- {\r
- if (isPositiveAndBelow (currentIndex, numUsed))\r
- {\r
- if (! isPositiveAndBelow (newIndex, numUsed))\r
- newIndex = numUsed - 1;\r
-\r
- moveInternal (currentIndex, newIndex);\r
- }\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- template <typename T>\r
- using TriviallyCopyableVoid = typename std::enable_if<std::is_trivially_copyable<T>::value, void>::type;\r
-\r
- template <typename T>\r
- using NonTriviallyCopyableVoid = typename std::enable_if<! std::is_trivially_copyable<T>::value, void>::type;\r
-\r
- //==============================================================================\r
- template <typename T = ElementType>\r
- TriviallyCopyableVoid<T> addArrayInternal (const ElementType* otherElements, int numElements)\r
- {\r
- memcpy (elements + numUsed, otherElements, (size_t) numElements * sizeof (ElementType));\r
- }\r
-\r
- template <typename Type, typename T = ElementType>\r
- TriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)\r
- {\r
- auto* start = elements + numUsed;\r
-\r
- while (--numElements >= 0)\r
- new (start++) ElementType (*(otherElements++));\r
- }\r
-\r
- template <typename Type, typename T = ElementType>\r
- NonTriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)\r
- {\r
- auto* start = elements + numUsed;\r
-\r
- while (--numElements >= 0)\r
- new (start++) ElementType (*(otherElements++));\r
- }\r
-\r
- //==============================================================================\r
- template <typename T = ElementType>\r
- TriviallyCopyableVoid<T> setAllocatedSizeInternal (int numElements)\r
- {\r
- elements.realloc ((size_t) numElements);\r
- }\r
-\r
- template <typename T = ElementType>\r
- NonTriviallyCopyableVoid<T> setAllocatedSizeInternal (int numElements)\r
- {\r
- HeapBlock<ElementType> newElements (numElements);\r
-\r
- for (int i = 0; i < numUsed; ++i)\r
- {\r
- new (newElements + i) ElementType (std::move (elements[i]));\r
- elements[i].~ElementType();\r
- }\r
-\r
- elements = std::move (newElements);\r
- }\r
-\r
- //==============================================================================\r
- ElementType* createInsertSpace (int indexToInsertAt, int numElements)\r
- {\r
- ensureAllocatedSize (numUsed + numElements);\r
-\r
- if (! isPositiveAndBelow (indexToInsertAt, numUsed))\r
- return elements + numUsed;\r
-\r
- createInsertSpaceInternal (indexToInsertAt, numElements);\r
-\r
- return elements + indexToInsertAt;\r
- }\r
-\r
- template <typename T = ElementType>\r
- TriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)\r
- {\r
- auto* start = elements + indexToInsertAt;\r
- auto numElementsToShift = numUsed - indexToInsertAt;\r
- memmove (start + numElements, start, (size_t) numElementsToShift * sizeof (ElementType));\r
- }\r
-\r
- template <typename T = ElementType>\r
- NonTriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)\r
- {\r
- auto* end = elements + numUsed;\r
- auto* newEnd = end + numElements;\r
- auto numElementsToShift = numUsed - indexToInsertAt;\r
-\r
- for (int i = 0; i < numElementsToShift; ++i)\r
- {\r
- new (--newEnd) ElementType (std::move (*(--end)));\r
- end->~ElementType();\r
- }\r
- }\r
-\r
- //==============================================================================\r
- template <typename T = ElementType>\r
- TriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)\r
- {\r
- auto* start = elements + indexToRemoveAt;\r
- auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);\r
- memmove (start, start + numElementsToRemove, (size_t) numElementsToShift * sizeof (ElementType));\r
- }\r
-\r
- template <typename T = ElementType>\r
- NonTriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)\r
- {\r
- auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);\r
- auto* destination = elements + indexToRemoveAt;\r
- auto* source = destination + numElementsToRemove;\r
-\r
- for (int i = 0; i < numElementsToShift; ++i)\r
- moveAssignElement (destination++, std::move (*(source++)));\r
-\r
- for (int i = 0; i < numElementsToRemove; ++i)\r
- (destination++)->~ElementType();\r
- }\r
-\r
- //==============================================================================\r
- template <typename T = ElementType>\r
- TriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept\r
- {\r
- char tempCopy[sizeof (ElementType)];\r
- memcpy (tempCopy, elements + currentIndex, sizeof (ElementType));\r
-\r
- if (newIndex > currentIndex)\r
- {\r
- memmove (elements + currentIndex,\r
- elements + currentIndex + 1,\r
- sizeof (ElementType) * (size_t) (newIndex - currentIndex));\r
- }\r
- else\r
- {\r
- memmove (elements + newIndex + 1,\r
- elements + newIndex,\r
- sizeof (ElementType) * (size_t) (currentIndex - newIndex));\r
- }\r
-\r
- memcpy (elements + newIndex, tempCopy, sizeof (ElementType));\r
- }\r
-\r
- template <typename T = ElementType>\r
- NonTriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept\r
- {\r
- auto* e = elements + currentIndex;\r
- ElementType tempCopy (std::move (*e));\r
- auto delta = newIndex - currentIndex;\r
-\r
- if (delta > 0)\r
- {\r
- for (int i = 0; i < delta; ++i)\r
- {\r
- moveAssignElement (e, std::move (*(e + 1)));\r
- ++e;\r
- }\r
- }\r
- else\r
- {\r
- for (int i = 0; i < -delta; ++i)\r
- {\r
- moveAssignElement (e, std::move (*(e - 1)));\r
- --e;\r
- }\r
- }\r
-\r
- moveAssignElement (e, std::move (tempCopy));\r
- }\r
-\r
- //==============================================================================\r
- void addAssumingCapacityIsReady (const ElementType& element) { new (elements + numUsed++) ElementType (element); }\r
- void addAssumingCapacityIsReady (ElementType&& element) { new (elements + numUsed++) ElementType (std::move (element)); }\r
-\r
- template <typename... OtherElements>\r
- void addAssumingCapacityIsReady (const ElementType& firstNewElement, OtherElements... otherElements)\r
- {\r
- addAssumingCapacityIsReady (firstNewElement);\r
- addAssumingCapacityIsReady (otherElements...);\r
- }\r
-\r
- template <typename... OtherElements>\r
- void addAssumingCapacityIsReady (ElementType&& firstNewElement, OtherElements... otherElements)\r
- {\r
- addAssumingCapacityIsReady (std::move (firstNewElement));\r
- addAssumingCapacityIsReady (otherElements...);\r
- }\r
-\r
- //==============================================================================\r
- template <typename T = ElementType>\r
- typename std::enable_if<std::is_move_assignable<T>::value, void>::type\r
- moveAssignElement (ElementType* destination, ElementType&& source)\r
- {\r
- *destination = std::move (source);\r
- }\r
-\r
- template <typename T = ElementType>\r
- typename std::enable_if<! std::is_move_assignable<T>::value, void>::type\r
- moveAssignElement (ElementType* destination, ElementType&& source)\r
- {\r
- destination->~ElementType();\r
- new (destination) ElementType (std::move (source));\r
- }\r
-\r
- void checkSourceIsNotAMember (const ElementType* element)\r
- {\r
- // when you pass a reference to an existing element into a method like add() which\r
- // may need to reallocate the array to make more space, the incoming reference may\r
- // be deleted indirectly during the reallocation operation! To work around this,\r
- // make a local copy of the item you're trying to add (and maybe use std::move to\r
- // move it into the add() method to avoid any extra overhead)\r
- jassert (element < begin() || element >= end());\r
- ignoreUnused (element);\r
- }\r
-\r
- //==============================================================================\r
- HeapBlock<ElementType> elements;\r
- int numAllocated = 0, numUsed = 0;\r
-\r
- template <class OtherElementType, class OtherCriticalSection>\r
- friend class ArrayBase;\r
-\r
- JUCE_DECLARE_NON_COPYABLE (ArrayBase)\r
-};\r
-\r
-} // namespace juce\r
inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return lock; }\r
\r
/** Returns the type of scoped lock to use for locking this array */\r
- using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
+ typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType;\r
\r
private:\r
//==============================================================================\r
}\r
@endcode\r
\r
- The order in which items are iterated bears no resemblance to the order in which\r
+ The order in which items are iterated bears no resemblence to the order in which\r
they were originally added!\r
\r
Obviously as soon as you call any non-const methods on the original hash-map, any\r
NamedValueSet::~NamedValueSet() noexcept {}\r
\r
NamedValueSet::NamedValueSet (const NamedValueSet& other) : values (other.values) {}\r
-\r
-NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept\r
- : values (static_cast<Array<NamedValue>&&> (other.values)) {}\r
-\r
-NamedValueSet::NamedValueSet (std::initializer_list<NamedValue> list)\r
- : values (static_cast<std::initializer_list<NamedValue>&&> (list))\r
-{\r
-}\r
+NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept : values (static_cast<Array<NamedValue>&&> (other.values)) {}\r
\r
NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other)\r
{\r
class JUCE_API NamedValueSet\r
{\r
public:\r
+ /** Creates an empty set. */\r
+ NamedValueSet() noexcept;\r
+\r
+ NamedValueSet (const NamedValueSet&);\r
+ NamedValueSet (NamedValueSet&&) noexcept;\r
+ NamedValueSet& operator= (const NamedValueSet&);\r
+ NamedValueSet& operator= (NamedValueSet&&) noexcept;\r
+\r
+ /** Destructor. */\r
+ ~NamedValueSet() noexcept;\r
+\r
+ /** Two NamedValueSets are considered equal if they contain all the same key/value\r
+ pairs, regardless of the order.\r
+ */\r
+ bool operator== (const NamedValueSet&) const noexcept;\r
+ bool operator!= (const NamedValueSet&) const noexcept;\r
+\r
//==============================================================================\r
/** Structure for a named var object */\r
struct JUCE_API NamedValue\r
var value;\r
};\r
\r
- //==============================================================================\r
- /** Creates an empty set. */\r
- NamedValueSet() noexcept;\r
-\r
- NamedValueSet (const NamedValueSet&);\r
- NamedValueSet (NamedValueSet&&) noexcept;\r
- NamedValueSet& operator= (const NamedValueSet&);\r
- NamedValueSet& operator= (NamedValueSet&&) noexcept;\r
-\r
- /** Creates a NamedValueSet from a list of names and properties. */\r
- NamedValueSet (std::initializer_list<NamedValue>);\r
-\r
- /** Destructor. */\r
- ~NamedValueSet() noexcept;\r
-\r
- /** Two NamedValueSets are considered equal if they contain all the same key/value\r
- pairs, regardless of the order.\r
- */\r
- bool operator== (const NamedValueSet&) const noexcept;\r
- bool operator!= (const NamedValueSet&) const noexcept;\r
-\r
const NamedValueSet::NamedValue* begin() const noexcept { return values.begin(); }\r
const NamedValueSet::NamedValue* end() const noexcept { return values.end(); }\r
\r
\r
Do not use this method unless you really need access to the internal var object\r
for some reason - for normal reading and writing always prefer operator[]() and set().\r
- Also note that the pointer returned may become invalid as soon as any subsequent\r
- methods are called on the NamedValueSet.\r
*/\r
var* getVarPointer (const Identifier& name) const noexcept;\r
\r
\r
/** Returns the value of the item at a given index.\r
The index must be between 0 and size() - 1, or this will return a nullptr\r
- Also note that the pointer returned may become invalid as soon as any subsequent\r
- methods are called on the NamedValueSet.\r
*/\r
var* getVarPointerAt (int index) const noexcept;\r
\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-static struct OwnedArrayTest : public UnitTest\r
-{\r
- OwnedArrayTest() : UnitTest { "OwnedArray" } {}\r
-\r
- struct Base\r
- {\r
- virtual ~Base() = default;\r
- };\r
-\r
- struct Derived : Base\r
- {\r
- };\r
-\r
- void runTest() override\r
- {\r
- beginTest ("After converting move construction, ownership is transferred");\r
- {\r
- OwnedArray<Derived> derived { new Derived{}, new Derived{}, new Derived{} };\r
-\r
- OwnedArray<Base> base { std::move (derived) };\r
-\r
- expectEquals (base.size(), 3);\r
- expectEquals (derived.size(), 0);\r
- }\r
-\r
- beginTest ("After converting move assignment, ownership is transferred");\r
- {\r
- OwnedArray<Base> base;\r
-\r
- base = OwnedArray<Derived> { new Derived{}, new Derived{}, new Derived{} };\r
-\r
- expectEquals (base.size(), 3);\r
- }\r
- }\r
-} ownedArrayTest;\r
-\r
-#endif\r
-\r
-}\r
public:\r
//==============================================================================\r
/** Creates an empty array. */\r
- OwnedArray() = default;\r
+ OwnedArray() noexcept\r
+ {\r
+ }\r
\r
/** Deletes the array and also deletes any objects inside it.\r
\r
\r
/** Move constructor. */\r
OwnedArray (OwnedArray&& other) noexcept\r
- : values (std::move (other.values))\r
+ : data (static_cast<ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+ numUsed (other.numUsed)\r
{\r
+ other.numUsed = 0;\r
}\r
\r
/** Creates an array from a list of objects. */\r
{\r
const ScopedLockType lock (getLock());\r
deleteAllObjects();\r
- values = std::move (other.values);\r
- return *this;\r
- }\r
\r
- /** Converting move constructor. */\r
- template <class OtherObjectClass, class OtherCriticalSection>\r
- OwnedArray (OwnedArray<OtherObjectClass, OtherCriticalSection>&& other) noexcept\r
- : values (std::move (other.values))\r
- {\r
- }\r
-\r
- /** Converting move assignment operator. */\r
- template <class OtherObjectClass, class OtherCriticalSection>\r
- OwnedArray& operator= (OwnedArray<OtherObjectClass, OtherCriticalSection>&& other) noexcept\r
- {\r
- const ScopedLockType lock (getLock());\r
- deleteAllObjects();\r
- values = std::move (other.values);\r
+ data = static_cast<ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data);\r
+ numUsed = other.numUsed;\r
+ other.numUsed = 0;\r
return *this;\r
}\r
\r
void clear (bool deleteObjects = true)\r
{\r
const ScopedLockType lock (getLock());\r
- clearQuick (deleteObjects);\r
- values.setAllocatedSize (0);\r
+\r
+ if (deleteObjects)\r
+ deleteAllObjects();\r
+\r
+ data.setAllocatedSize (0);\r
+ numUsed = 0;\r
}\r
\r
//==============================================================================\r
\r
if (deleteObjects)\r
deleteAllObjects();\r
- else\r
- values.clear();\r
+\r
+ numUsed = 0;\r
}\r
\r
//==============================================================================\r
*/\r
inline int size() const noexcept\r
{\r
- return values.size();\r
+ return numUsed;\r
}\r
\r
/** Returns true if the array is empty, false otherwise. */\r
inline ObjectClass* operator[] (const int index) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getValueWithDefault (index);\r
+ if (isPositiveAndBelow (index, numUsed))\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[index];\r
+ }\r
+\r
+ return nullptr;\r
}\r
\r
/** Returns a pointer to the object at this index in the array, without checking whether the index is in-range.\r
inline ObjectClass* getUnchecked (const int index) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values[index];\r
+ jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+ return data.elements[index];\r
}\r
\r
/** Returns a pointer to the first object in the array.\r
inline ObjectClass* getFirst() const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getFirst();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[0];\r
+ }\r
+\r
+ return nullptr;\r
}\r
\r
/** Returns a pointer to the last object in the array.\r
inline ObjectClass* getLast() const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getLast();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[numUsed - 1];\r
+ }\r
+\r
+ return nullptr;\r
}\r
\r
/** Returns a pointer to the actual array data.\r
*/\r
inline ObjectClass** getRawDataPointer() noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
//==============================================================================\r
*/\r
inline ObjectClass** begin() const noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
/** Returns a pointer to the element which follows the last element in the array.\r
*/\r
inline ObjectClass** end() const noexcept\r
{\r
- return values.end();\r
- }\r
+ #if JUCE_DEBUG\r
+ if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy)\r
+ return data.elements;\r
+ #endif\r
\r
- /** Returns a pointer to the first element in the array.\r
- This method is provided for compatibility with the standard C++ containers.\r
- */\r
- inline ObjectClass** data() const noexcept\r
- {\r
- return begin();\r
+ return data.elements + numUsed;\r
}\r
\r
//==============================================================================\r
int indexOf (const ObjectClass* objectToLookFor) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto** e = values.begin();\r
+ auto** e = data.elements.get();\r
+ auto** end_ = e + numUsed;\r
\r
- for (; e != values.end(); ++e)\r
+ for (; e != end_; ++e)\r
if (objectToLookFor == *e)\r
- return static_cast<int> (e - values.begin());\r
+ return static_cast<int> (e - data.elements.get());\r
\r
return -1;\r
}\r
bool contains (const ObjectClass* objectToLookFor) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto** e = values.begin();\r
+ auto** e = data.elements.get();\r
+ auto** end_ = e + numUsed;\r
\r
- for (; e != values.end(); ++e)\r
+ for (; e != end_; ++e)\r
if (objectToLookFor == *e)\r
return true;\r
\r
ObjectClass* add (ObjectClass* newObject) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (newObject);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
+ data.elements[numUsed++] = newObject;\r
return newObject;\r
}\r
\r
*/\r
ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject) noexcept\r
{\r
+ if (indexToInsertAt < 0)\r
+ return add (newObject);\r
+\r
const ScopedLockType lock (getLock());\r
- values.insert (indexToInsertAt, newObject, 1);\r
+\r
+ if (indexToInsertAt > numUsed)\r
+ indexToInsertAt = numUsed;\r
+\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
+\r
+ auto** e = data.elements + indexToInsertAt;\r
+ auto numToMove = numUsed - indexToInsertAt;\r
+\r
+ if (numToMove > 0)\r
+ memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove);\r
+\r
+ *e = newObject;\r
+ ++numUsed;\r
return newObject;\r
}\r
\r
if (numberOfElements > 0)\r
{\r
const ScopedLockType lock (getLock());\r
- values.insertArray (indexToInsertAt, newObjects, numberOfElements);\r
+ data.ensureAllocatedSize (numUsed + numberOfElements);\r
+ auto* insertPos = data.elements.get();\r
+\r
+ if (isPositiveAndBelow (indexToInsertAt, numUsed))\r
+ {\r
+ insertPos += indexToInsertAt;\r
+ auto numberToMove = (size_t) (numUsed - indexToInsertAt);\r
+ memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ObjectClass*));\r
+ }\r
+ else\r
+ {\r
+ insertPos += numUsed;\r
+ }\r
+\r
+ numUsed += numberOfElements;\r
+\r
+ while (--numberOfElements >= 0)\r
+ *insertPos++ = *newObjects++;\r
}\r
}\r
\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (indexToChange < values.size())\r
+ if (indexToChange < numUsed)\r
{\r
if (deleteOldElement)\r
{\r
- toDelete.reset (values[indexToChange]);\r
+ toDelete.reset (data.elements[indexToChange]);\r
\r
if (toDelete.get() == newObject)\r
toDelete.release();\r
}\r
\r
- values[indexToChange] = newObject;\r
+ data.elements[indexToChange] = newObject;\r
}\r
else\r
{\r
- values.add (newObject);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ data.elements[numUsed++] = newObject;\r
}\r
}\r
}\r
{\r
const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock());\r
const ScopedLockType lock2 (getLock());\r
- values.addArray (arrayToAddFrom, startIndex, numElementsToAdd);\r
+\r
+ if (startIndex < 0)\r
+ {\r
+ jassertfalse;\r
+ startIndex = 0;\r
+ }\r
+\r
+ if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+ numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
+\r
+ data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+ jassert (numElementsToAdd <= 0 || data.elements != nullptr);\r
+\r
+ while (--numElementsToAdd >= 0)\r
+ {\r
+ data.elements[numUsed] = arrayToAddFrom.getUnchecked (startIndex++);\r
+ ++numUsed;\r
+ }\r
}\r
\r
/** Adds elements from another array to the end of this array. */\r
void addArray (const std::initializer_list<OtherArrayType>& items)\r
{\r
const ScopedLockType lock (getLock());\r
- values.addArray (items);\r
+ data.ensureAllocatedSize (numUsed + (int) items.size());\r
+\r
+ for (auto* item : items)\r
+ {\r
+ data.elements[numUsed] = item;\r
+ ++numUsed;\r
+ }\r
}\r
\r
/** Adds copies of the elements in another array to the end of this array.\r
if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
\r
- jassert (numElementsToAdd >= 0);\r
- values.ensureAllocatedSize (values.size() + numElementsToAdd);\r
+ data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+ jassert (numElementsToAdd <= 0 || data.elements != nullptr);\r
\r
while (--numElementsToAdd >= 0)\r
- values.add (createCopyIfNotNull (arrayToAddFrom.getUnchecked (startIndex++)));\r
+ data.elements[numUsed++] = createCopyIfNotNull (arrayToAddFrom.getUnchecked (startIndex++));\r
}\r
\r
/** Inserts a new object into the array assuming that the array is sorted.\r
template <class ElementComparator>\r
int addSorted (ElementComparator& comparator, ObjectClass* const newObject) noexcept\r
{\r
- // If you pass in an object with a static compareElements() method, this\r
- // avoids getting warning messages about the parameter being unused\r
- ignoreUnused (comparator);\r
-\r
+ ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+ // avoids getting warning messages about the parameter being unused\r
const ScopedLockType lock (getLock());\r
- const int index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+ const int index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
insert (index, newObject);\r
return index;\r
}\r
template <typename ElementComparator>\r
int indexOfSorted (ElementComparator& comparator, const ObjectClass* const objectToLookFor) const noexcept\r
{\r
- // If you pass in an object with a static compareElements() method, this\r
- // avoids getting warning messages about the parameter being unused\r
ignoreUnused (comparator);\r
-\r
const ScopedLockType lock (getLock());\r
- int s = 0, e = values.size();\r
+ int s = 0, e = numUsed;\r
\r
while (s < e)\r
{\r
- if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+ if (comparator.compareElements (objectToLookFor, data.elements[s]) == 0)\r
return s;\r
\r
auto halfway = (s + e) / 2;\r
if (halfway == s)\r
break;\r
\r
- if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+ if (comparator.compareElements (objectToLookFor, data.elements[halfway]) >= 0)\r
s = halfway;\r
else\r
e = halfway;\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
- auto** e = values.begin() + indexToRemove;\r
+ auto** e = data.elements + indexToRemove;\r
\r
if (deleteObject)\r
toDelete.reset (*e);\r
\r
- values.removeElements (indexToRemove, 1);\r
+ --numUsed;\r
+ auto numToShift = numUsed - indexToRemove;\r
+\r
+ if (numToShift > 0)\r
+ memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift);\r
}\r
}\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
\r
ObjectClass* removedItem = nullptr;\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
- removedItem = values[indexToRemove];\r
+ auto** e = data.elements + indexToRemove;\r
+ removedItem = *e;\r
\r
- values.removeElements (indexToRemove, 1);\r
+ --numUsed;\r
+ const int numToShift = numUsed - indexToRemove;\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ if (numToShift > 0)\r
+ memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift);\r
+\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
\r
void removeObject (const ObjectClass* objectToRemove, bool deleteObject = true)\r
{\r
const ScopedLockType lock (getLock());\r
+ auto** e = data.elements.get();\r
\r
- for (int i = 0; i < values.size(); ++i)\r
+ for (int i = 0; i < numUsed; ++i)\r
{\r
- if (objectToRemove == values[i])\r
+ if (objectToRemove == e[i])\r
{\r
remove (i, deleteObject);\r
break;\r
void removeRange (int startIndex, int numberToRemove, bool deleteObjects = true)\r
{\r
const ScopedLockType lock (getLock());\r
- auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
- startIndex = jlimit (0, values.size(), startIndex);\r
- numberToRemove = endIndex - startIndex;\r
+ auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+ startIndex = jlimit (0, numUsed, startIndex);\r
\r
- if (numberToRemove > 0)\r
+ if (endIndex > startIndex)\r
{\r
if (deleteObjects)\r
{\r
for (int i = startIndex; i < endIndex; ++i)\r
{\r
- ContainerDeletePolicy<ObjectClass>::destroy (values[i]);\r
- values[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
+ ContainerDeletePolicy<ObjectClass>::destroy (data.elements[i]);\r
+ data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
}\r
}\r
\r
- values.removeElements (startIndex, numberToRemove);\r
+ auto rangeSize = endIndex - startIndex;\r
+ auto** e = data.elements + startIndex;\r
+ auto numToShift = numUsed - endIndex;\r
+ numUsed -= rangeSize;\r
+\r
+ while (--numToShift >= 0)\r
+ {\r
+ *e = e[rangeSize];\r
+ ++e;\r
+ }\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
}\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (howManyToRemove >= values.size())\r
+ if (howManyToRemove >= numUsed)\r
clear (deleteObjects);\r
else\r
- removeRange (values.size() - howManyToRemove, howManyToRemove, deleteObjects);\r
+ removeRange (numUsed - howManyToRemove, howManyToRemove, deleteObjects);\r
}\r
\r
/** Swaps a pair of objects in the array.\r
If either of the indexes passed in is out-of-range, nothing will happen,\r
otherwise the two objects at these positions will be exchanged.\r
*/\r
- void swap (int index1, int index2) noexcept\r
+ void swap (int index1,\r
+ int index2) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.swap (index1, index2);\r
+\r
+ if (isPositiveAndBelow (index1, numUsed)\r
+ && isPositiveAndBelow (index2, numUsed))\r
+ {\r
+ std::swap (data.elements[index1],\r
+ data.elements[index2]);\r
+ }\r
}\r
\r
/** Moves one of the objects to a different position.\r
if (currentIndex != newIndex)\r
{\r
const ScopedLockType lock (getLock());\r
- values.move (currentIndex, newIndex);\r
+\r
+ if (isPositiveAndBelow (currentIndex, numUsed))\r
+ {\r
+ if (! isPositiveAndBelow (newIndex, numUsed))\r
+ newIndex = numUsed - 1;\r
+\r
+ auto* value = data.elements[currentIndex];\r
+\r
+ if (newIndex > currentIndex)\r
+ {\r
+ memmove (data.elements + currentIndex,\r
+ data.elements + currentIndex + 1,\r
+ sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex));\r
+ }\r
+ else\r
+ {\r
+ memmove (data.elements + newIndex + 1,\r
+ data.elements + newIndex,\r
+ sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex));\r
+ }\r
+\r
+ data.elements[newIndex] = value;\r
+ }\r
}\r
}\r
\r
{\r
const ScopedLockType lock1 (getLock());\r
const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
- values.swapWith (otherArray.values);\r
+ data.swapWith (otherArray.data);\r
+ std::swap (numUsed, otherArray.numUsed);\r
}\r
\r
//==============================================================================\r
void minimiseStorageOverheads() noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.shrinkToNoMoreThan (values.size());\r
+ data.shrinkToNoMoreThan (numUsed);\r
}\r
\r
/** Increases the array's internal storage to hold a minimum number of elements.\r
void ensureStorageAllocated (const int minNumElements) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.ensureAllocatedSize (minNumElements);\r
+ data.ensureAllocatedSize (minNumElements);\r
}\r
\r
//==============================================================================\r
void sort (ElementComparator& comparator,\r
bool retainOrderOfEquivalentItems = false) const noexcept\r
{\r
- // If you pass in an object with a static compareElements() method, this\r
- // avoids getting warning messages about the parameter being unused\r
- ignoreUnused (comparator);\r
+ ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+ // avoids getting warning messages about the parameter being unused\r
\r
const ScopedLockType lock (getLock());\r
\r
if (size() > 1)\r
- sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+ sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
}\r
\r
//==============================================================================\r
To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
an object of ScopedLockType as an RAII lock for it.\r
*/\r
- inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return values; }\r
+ inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; }\r
\r
/** Returns the type of scoped lock to use for locking this array */\r
using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
\r
+\r
//==============================================================================\r
#ifndef DOXYGEN\r
// Note that the swapWithArray method has been replaced by a more flexible templated version,\r
\r
private:\r
//==============================================================================\r
- ArrayBase <ObjectClass*, TypeOfCriticalSectionToUse> values;\r
+ ArrayAllocationBase <ObjectClass*, TypeOfCriticalSectionToUse> data;\r
+ int numUsed = 0;\r
\r
void deleteAllObjects()\r
{\r
- for (auto& e : values)\r
- ContainerDeletePolicy<ObjectClass>::destroy (e);\r
-\r
- values.clear();\r
+ while (numUsed > 0)\r
+ ContainerDeletePolicy<ObjectClass>::destroy (data.elements[--numUsed]);\r
}\r
\r
- template <class OtherObjectClass, class OtherCriticalSection>\r
- friend class OwnedArray;\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray)\r
};\r
\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2018 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class ReferenceCountedArrayTests : public UnitTest\r
-{\r
-public:\r
- ReferenceCountedArrayTests() : UnitTest ("ReferenceCountedArray", "Containers") {}\r
-\r
- //==============================================================================\r
- void runTest() override\r
- {\r
- beginTest ("Add derived objects");\r
- {\r
- ReferenceCountedArray<TestDerivedObj> derivedArray;\r
- derivedArray.add (static_cast<TestDerivedObj*> (new TestBaseObj()));\r
- expectEquals (derivedArray.size(), 1);\r
- expectEquals (derivedArray.getObjectPointer (0)->getReferenceCount(), 1);\r
- expectEquals (derivedArray[0]->getReferenceCount(), 2);\r
-\r
- for (auto o : derivedArray)\r
- expectEquals (o->getReferenceCount(), 1);\r
-\r
- ReferenceCountedArray<TestBaseObj> baseArray;\r
- baseArray.addArray (derivedArray);\r
-\r
- for (auto o : baseArray)\r
- expectEquals (o->getReferenceCount(), 2);\r
-\r
- derivedArray.clearQuick();\r
- baseArray.clearQuick();\r
-\r
- auto* baseObject = new TestBaseObj();\r
- TestBaseObj::Ptr baseObjectPtr = baseObject;\r
- expectEquals (baseObject->getReferenceCount(), 1);\r
-\r
- auto* derivedObject = new TestDerivedObj();\r
- TestDerivedObj::Ptr derivedObjectPtr = derivedObject;\r
- expectEquals (derivedObject->getReferenceCount(), 1);\r
-\r
- baseArray.add (baseObject);\r
- baseArray.add (derivedObject);\r
-\r
- for (auto o : baseArray)\r
- expectEquals (o->getReferenceCount(), 2);\r
-\r
- expectEquals (baseObject->getReferenceCount(), 2);\r
- expectEquals (derivedObject->getReferenceCount(), 2);\r
-\r
- derivedArray.add (derivedObject);\r
-\r
- for (auto o : derivedArray)\r
- expectEquals (o->getReferenceCount(), 3);\r
-\r
- derivedArray.clearQuick();\r
- baseArray.clearQuick();\r
-\r
- expectEquals (baseObject->getReferenceCount(), 1);\r
- expectEquals (derivedObject->getReferenceCount(), 1);\r
-\r
- baseArray.add (baseObjectPtr);\r
-\r
- #if JUCE_STRICT_REFCOUNTEDPOINTER\r
- baseArray.add (derivedObjectPtr);\r
- #else\r
- baseArray.add (derivedObjectPtr.get());\r
- #endif\r
-\r
- for (auto o : baseArray)\r
- expectEquals (o->getReferenceCount(), 2);\r
-\r
- derivedArray.add (derivedObjectPtr);\r
-\r
- for (auto o : derivedArray)\r
- expectEquals (o->getReferenceCount(), 3);\r
- }\r
- }\r
-\r
-private:\r
- struct TestBaseObj : public ReferenceCountedObject\r
- {\r
- using Ptr = ReferenceCountedObjectPtr<TestBaseObj>;\r
-\r
- TestBaseObj() = default;\r
- };\r
-\r
- struct TestDerivedObj : public TestBaseObj\r
- {\r
- using Ptr = ReferenceCountedObjectPtr<TestDerivedObj>;\r
-\r
- TestDerivedObj() = default;\r
- };\r
-};\r
-\r
-static ReferenceCountedArrayTests referenceCountedArrayTests;\r
-\r
-#endif\r
-\r
-} // namespace juce\r
/** Creates an empty array.\r
@see ReferenceCountedObject, Array, OwnedArray\r
*/\r
- ReferenceCountedArray() = default;\r
+ ReferenceCountedArray() noexcept\r
+ {\r
+ }\r
\r
/** Creates a copy of another array */\r
ReferenceCountedArray (const ReferenceCountedArray& other) noexcept\r
{\r
const ScopedLockType lock (other.getLock());\r
- values.addArray (other.begin(), other.size());\r
+ numUsed = other.numUsed;\r
+ data.setAllocatedSize (numUsed);\r
+ memcpy (data.elements, other.getRawDataPointer(), (size_t) numUsed * sizeof (ObjectClass*));\r
\r
for (auto* o : *this)\r
if (o != nullptr)\r
\r
/** Moves from another array */\r
ReferenceCountedArray (ReferenceCountedArray&& other) noexcept\r
- : values (std::move (other.values))\r
+ : data (static_cast<ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data)),\r
+ numUsed (other.numUsed)\r
{\r
+ other.numUsed = 0;\r
}\r
\r
/** Creates a copy of another array */\r
ReferenceCountedArray (const ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>& other) noexcept\r
{\r
const typename ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>::ScopedLockType lock (other.getLock());\r
- values.addArray (other.begin(), other.size());\r
+ numUsed = other.size();\r
+ data.setAllocatedSize (numUsed);\r
+ memcpy (data.elements, other.getRawDataPointer(), (size_t) numUsed * sizeof (ObjectClass*));\r
\r
for (auto* o : *this)\r
if (o != nullptr)\r
ReferenceCountedArray& operator= (ReferenceCountedArray&& other) noexcept\r
{\r
releaseAllObjects();\r
- values = std::move (other.values);\r
+ data = static_cast<ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse>&&> (other.data);\r
+ numUsed = other.numUsed;\r
+ other.numUsed = 0;\r
return *this;\r
}\r
\r
\r
//==============================================================================\r
/** Removes all objects from the array.\r
- Any objects in the array whose reference counts drop to zero will be deleted.\r
+ Any objects in the array that whose reference counts drop to zero will be deleted.\r
*/\r
void clear()\r
{\r
const ScopedLockType lock (getLock());\r
- clearQuick();\r
- values.setAllocatedSize (0);\r
+ releaseAllObjects();\r
+ data.setAllocatedSize (0);\r
}\r
\r
/** Removes all objects from the array without freeing the array's allocated storage.\r
/** Returns the current number of objects in the array. */\r
inline int size() const noexcept\r
{\r
- return values.size();\r
+ return numUsed;\r
}\r
\r
/** Returns true if the array is empty, false otherwise. */\r
inline bool isEmpty() const noexcept\r
{\r
- return size() == 0;\r
+ return numUsed == 0;\r
}\r
\r
/** Returns a pointer to the object at this index in the array.\r
*/\r
inline ObjectClassPtr operator[] (int index) const noexcept\r
{\r
- return ObjectClassPtr (getObjectPointer (index));\r
+ return getObjectPointer (index);\r
}\r
\r
/** Returns a pointer to the object at this index in the array, without checking\r
*/\r
inline ObjectClassPtr getUnchecked (int index) const noexcept\r
{\r
- return ObjectClassPtr (getObjectPointerUnchecked (index));\r
+ return getObjectPointerUnchecked (index);\r
}\r
\r
/** Returns a raw pointer to the object at this index in the array.\r
inline ObjectClass* getObjectPointer (int index) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getValueWithDefault (index);\r
+\r
+ if (isPositiveAndBelow (index, numUsed))\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[index];\r
+ }\r
+\r
+ return {};\r
}\r
\r
/** Returns a raw pointer to the object at this index in the array, without checking\r
whether the index is in-range.\r
*/\r
- inline ObjectClass* getObjectPointerUnchecked (int index) const noexcept\r
+ inline ObjectClass* getObjectPointerUnchecked (const int index) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values[index];\r
+ jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr);\r
+ return data.elements[index];\r
}\r
\r
/** Returns a pointer to the first object in the array.\r
inline ObjectClassPtr getFirst() const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getFirst();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[0];\r
+ }\r
+\r
+ return {};\r
}\r
\r
/** Returns a pointer to the last object in the array.\r
inline ObjectClassPtr getLast() const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- return values.getLast();\r
+\r
+ if (numUsed > 0)\r
+ {\r
+ jassert (data.elements != nullptr);\r
+ return data.elements[numUsed - 1];\r
+ }\r
+\r
+ return {};\r
}\r
\r
/** Returns a pointer to the actual array data.\r
*/\r
inline ObjectClass** getRawDataPointer() const noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
//==============================================================================\r
*/\r
inline ObjectClass** begin() const noexcept\r
{\r
- return values.begin();\r
+ return data.elements;\r
}\r
\r
/** Returns a pointer to the element which follows the last element in the array.\r
*/\r
inline ObjectClass** end() const noexcept\r
{\r
- return values.end();\r
- }\r
-\r
- /** Returns a pointer to the first element in the array.\r
- This method is provided for compatibility with the standard C++ containers.\r
- */\r
- inline ObjectClass** data() const noexcept\r
- {\r
- return begin();\r
+ return data.elements + numUsed;\r
}\r
\r
//==============================================================================\r
int indexOf (const ObjectClass* objectToLookFor) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto** e = values.begin();\r
- auto** endPointer = values.end();\r
+ auto** e = data.elements.get();\r
+ auto** endPointer = e + numUsed;\r
\r
while (e != endPointer)\r
{\r
if (objectToLookFor == *e)\r
- return static_cast<int> (e - values.begin());\r
+ return static_cast<int> (e - data.elements.get());\r
\r
++e;\r
}\r
return -1;\r
}\r
\r
- /** Finds the index of the first occurrence of an object in the array.\r
-\r
- @param objectToLookFor the object to look for\r
- @returns the index at which the object was found, or -1 if it's not found\r
- */\r
- int indexOf (const ObjectClassPtr& objectToLookFor) const noexcept { return indexOf (objectToLookFor.get()); }\r
-\r
/** Returns true if the array contains a specified object.\r
\r
@param objectToLookFor the object to look for\r
bool contains (const ObjectClass* objectToLookFor) const noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto** e = values.begin();\r
- auto** endPointer = values.end();\r
+ auto** e = data.elements.get();\r
+ auto** endPointer = e + numUsed;\r
\r
while (e != endPointer)\r
{\r
return false;\r
}\r
\r
- /** Returns true if the array contains a specified object.\r
-\r
- @param objectToLookFor the object to look for\r
- @returns true if the object is in the array\r
- */\r
- bool contains (const ObjectClassPtr& objectToLookFor) const noexcept { return contains (objectToLookFor.get()); }\r
-\r
/** Appends a new object to the end of the array.\r
\r
This will increase the new object's reference count.\r
@param newObject the new object to add to the array\r
@see set, insert, addIfNotAlreadyThere, addSorted, addArray\r
*/\r
- ObjectClass* add (ObjectClass* newObject)\r
+ ObjectClass* add (ObjectClass* newObject) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.add (newObject);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
+ data.elements[numUsed++] = newObject;\r
\r
if (newObject != nullptr)\r
newObject->incReferenceCount();\r
return newObject;\r
}\r
\r
- /** Appends a new object to the end of the array.\r
-\r
- This will increase the new object's reference count.\r
-\r
- @param newObject the new object to add to the array\r
- @see set, insert, addIfNotAlreadyThere, addSorted, addArray\r
- */\r
- ObjectClass* add (const ObjectClassPtr& newObject) { return add (newObject.get()); }\r
-\r
/** Inserts a new object into the array at the given index.\r
\r
If the index is less than 0 or greater than the size of the array, the\r
@param newObject the new object to add to the array\r
@see add, addSorted, addIfNotAlreadyThere, set\r
*/\r
- ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject)\r
+ ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject) noexcept\r
{\r
- values.insert (indexToInsertAt, newObject, 1);\r
+ if (indexToInsertAt < 0)\r
+ return add (newObject);\r
\r
- if (newObject != nullptr)\r
- newObject->incReferenceCount();\r
+ const ScopedLockType lock (getLock());\r
\r
- return newObject;\r
- }\r
+ if (indexToInsertAt > numUsed)\r
+ indexToInsertAt = numUsed;\r
\r
- /** Inserts a new object into the array at the given index.\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
\r
- If the index is less than 0 or greater than the size of the array, the\r
- element will be added to the end of the array.\r
- Otherwise, it will be inserted into the array, moving all the later elements\r
- along to make room.\r
+ auto** e = data.elements + indexToInsertAt;\r
+ auto numToMove = numUsed - indexToInsertAt;\r
\r
- This will increase the new object's reference count.\r
+ if (numToMove > 0)\r
+ memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove);\r
\r
- @param indexToInsertAt the index at which the new element should be inserted\r
- @param newObject the new object to add to the array\r
- @see add, addSorted, addIfNotAlreadyThere, set\r
- */\r
- ObjectClass* insert (int indexToInsertAt, const ObjectClassPtr& newObject) { return insert (indexToInsertAt, newObject.get()); }\r
+ *e = newObject;\r
+\r
+ if (newObject != nullptr)\r
+ newObject->incReferenceCount();\r
+\r
+ ++numUsed;\r
+ return newObject;\r
+ }\r
\r
/** Appends a new object at the end of the array as long as the array doesn't\r
already contain it.\r
@param newObject the new object to add to the array\r
@returns true if the object has been added, false otherwise\r
*/\r
- bool addIfNotAlreadyThere (ObjectClass* newObject)\r
+ bool addIfNotAlreadyThere (ObjectClass* newObject) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
\r
return true;\r
}\r
\r
- /** Appends a new object at the end of the array as long as the array doesn't\r
- already contain it.\r
-\r
- If the array already contains a matching object, nothing will be done.\r
-\r
- @param newObject the new object to add to the array\r
- @returns true if the object has been added, false otherwise\r
- */\r
- bool addIfNotAlreadyThere (const ObjectClassPtr& newObject) { return addIfNotAlreadyThere (newObject.get()); }\r
-\r
/** Replaces an object in the array with a different one.\r
\r
If the index is less than zero, this method does nothing.\r
if (newObject != nullptr)\r
newObject->incReferenceCount();\r
\r
- if (indexToChange < values.size())\r
+ if (indexToChange < numUsed)\r
{\r
- releaseObject (values[indexToChange]);\r
- values[indexToChange] = newObject;\r
+ releaseObject (data.elements[indexToChange]);\r
+ data.elements[indexToChange] = newObject;\r
}\r
else\r
{\r
- values.add (newObject);\r
+ data.ensureAllocatedSize (numUsed + 1);\r
+ jassert (data.elements != nullptr);\r
+ data.elements[numUsed++] = newObject;\r
}\r
}\r
}\r
{\r
const ScopedLockType lock2 (getLock());\r
\r
- auto numElementsAdded = values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd);\r
- auto** e = values.end();\r
+ if (startIndex < 0)\r
+ {\r
+ jassertfalse;\r
+ startIndex = 0;\r
+ }\r
+\r
+ if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size())\r
+ numElementsToAdd = arrayToAddFrom.size() - startIndex;\r
\r
- for (int i = 0; i < numElementsAdded; ++i)\r
- (*(--e))->incReferenceCount();\r
+ if (numElementsToAdd > 0)\r
+ {\r
+ data.ensureAllocatedSize (numUsed + numElementsToAdd);\r
+\r
+ while (--numElementsToAdd >= 0)\r
+ add (arrayToAddFrom.getUnchecked (startIndex++));\r
+ }\r
}\r
}\r
\r
int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+ auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
insert (index, newObject);\r
return index;\r
}\r
void addOrReplaceSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+ auto index = findInsertIndexInSortedArray (comparator, data.elements.get(), newObject, 0, numUsed);\r
\r
- if (index > 0 && comparator.compareElements (newObject, values[index - 1]) == 0)\r
+ if (index > 0 && comparator.compareElements (newObject, data.elements[index - 1]) == 0)\r
set (index - 1, newObject); // replace an existing object that matches\r
else\r
insert (index, newObject); // no match, so insert the new one\r
{\r
ignoreUnused (comparator);\r
const ScopedLockType lock (getLock());\r
- int s = 0, e = values.size();\r
+ int s = 0, e = numUsed;\r
\r
while (s < e)\r
{\r
- if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+ if (comparator.compareElements (objectToLookFor, data.elements[s]) == 0)\r
return s;\r
\r
auto halfway = (s + e) / 2;\r
if (halfway == s)\r
break;\r
\r
- if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+ if (comparator.compareElements (objectToLookFor, data.elements[halfway]) >= 0)\r
s = halfway;\r
else\r
e = halfway;\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
- auto** e = values.begin() + indexToRemove;\r
+ auto** e = data.elements + indexToRemove;\r
releaseObject (*e);\r
- values.removeElements (indexToRemove, 1);\r
+ --numUsed;\r
+ auto numberToShift = numUsed - indexToRemove;\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ if (numberToShift > 0)\r
+ memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift);\r
+\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
}\r
ObjectClassPtr removedItem;\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (indexToRemove, values.size()))\r
+ if (isPositiveAndBelow (indexToRemove, numUsed))\r
{\r
- auto** e = values.begin() + indexToRemove;\r
+ auto** e = data.elements + indexToRemove;\r
removedItem = *e;\r
releaseObject (*e);\r
- values.removeElements (indexToRemove, 1);\r
+ --numUsed;\r
+ auto numberToShift = numUsed - indexToRemove;\r
+\r
+ if (numberToShift > 0)\r
+ memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift);\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
\r
remove (indexOf (objectToRemove));\r
}\r
\r
- /** Removes the first occurrence of a specified object from the array.\r
-\r
- If the item isn't found, no action is taken. If it is found, it is\r
- removed and has its reference count decreased.\r
-\r
- @param objectToRemove the object to try to remove\r
- @see remove, removeRange\r
- */\r
- void removeObject (const ObjectClassPtr& objectToRemove) { removeObject (objectToRemove.get()); }\r
-\r
/** Removes a range of objects from the array.\r
\r
This will remove a set of objects, starting from the given index,\r
int numberToRemove)\r
{\r
const ScopedLockType lock (getLock());\r
- startIndex = jlimit (0, values.size(), startIndex);\r
- auto endIndex = jlimit (0, values.size(), startIndex + numberToRemove);\r
- numberToRemove = endIndex - startIndex;\r
\r
- if (numberToRemove > 0)\r
+ auto start = jlimit (0, numUsed, startIndex);\r
+ auto endIndex = jlimit (0, numUsed, startIndex + numberToRemove);\r
+\r
+ if (endIndex > start)\r
{\r
- for (int i = startIndex; i < endIndex; ++i)\r
+ for (int i = start; i < endIndex; ++i)\r
{\r
- releaseObject (values[i]);\r
- values[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
+ releaseObject (data.elements[i]);\r
+ data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer)\r
}\r
\r
- values.removeElements (startIndex, numberToRemove);\r
+ auto rangeSize = endIndex - start;\r
+ auto** e = data.elements + start;\r
+ int i = numUsed - endIndex;\r
+ numUsed -= rangeSize;\r
\r
- if ((values.size() << 1) < values.capacity())\r
+ while (--i >= 0)\r
+ {\r
+ *e = e[rangeSize];\r
+ ++e;\r
+ }\r
+\r
+ if ((numUsed << 1) < data.numAllocated)\r
minimiseStorageOverheads();\r
}\r
}\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (howManyToRemove > values.size())\r
- howManyToRemove = values.size();\r
+ if (howManyToRemove > numUsed)\r
+ howManyToRemove = numUsed;\r
\r
while (--howManyToRemove >= 0)\r
- remove (values.size() - 1);\r
+ remove (numUsed - 1);\r
}\r
\r
/** Swaps a pair of objects in the array.\r
{\r
const ScopedLockType lock (getLock());\r
\r
- if (isPositiveAndBelow (index1, values.size())\r
- && isPositiveAndBelow (index2, values.size()))\r
+ if (isPositiveAndBelow (index1, numUsed)\r
+ && isPositiveAndBelow (index2, numUsed))\r
{\r
- std::swap (values[index1], values[index2]);\r
+ std::swap (data.elements[index1],\r
+ data.elements[index2]);\r
}\r
}\r
\r
if (currentIndex != newIndex)\r
{\r
const ScopedLockType lock (getLock());\r
- values.move (currentIndex, newIndex);\r
+\r
+ if (isPositiveAndBelow (currentIndex, numUsed))\r
+ {\r
+ if (! isPositiveAndBelow (newIndex, numUsed))\r
+ newIndex = numUsed - 1;\r
+\r
+ auto* value = data.elements[currentIndex];\r
+\r
+ if (newIndex > currentIndex)\r
+ {\r
+ memmove (data.elements + currentIndex,\r
+ data.elements + currentIndex + 1,\r
+ sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex));\r
+ }\r
+ else\r
+ {\r
+ memmove (data.elements + newIndex + 1,\r
+ data.elements + newIndex,\r
+ sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex));\r
+ }\r
+\r
+ data.elements[newIndex] = value;\r
+ }\r
}\r
}\r
\r
{\r
const ScopedLockType lock1 (getLock());\r
const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock());\r
- values.swapWith (otherArray.values);\r
+ data.swapWith (otherArray.data);\r
+ std::swap (numUsed, otherArray.numUsed);\r
}\r
\r
//==============================================================================\r
{\r
const ScopedLockType lock2 (other.getLock());\r
const ScopedLockType lock1 (getLock());\r
- return values == other.values;\r
+\r
+ if (numUsed != other.numUsed)\r
+ return false;\r
+\r
+ for (int i = numUsed; --i >= 0;)\r
+ if (data.elements[i] != other.data.elements[i])\r
+ return false;\r
+\r
+ return true;\r
}\r
\r
/** Compares this array to another one.\r
void sort (ElementComparator& comparator,\r
bool retainOrderOfEquivalentItems = false) const noexcept\r
{\r
- // If you pass in an object with a static compareElements() method, this\r
- // avoids getting warning messages about the parameter being unused\r
- ignoreUnused (comparator);\r
+ ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
+ // avoids getting warning messages about the parameter being unused\r
\r
const ScopedLockType lock (getLock());\r
- sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);\r
+ sortArray (comparator, data.elements.get(), 0, size() - 1, retainOrderOfEquivalentItems);\r
}\r
\r
//==============================================================================\r
void minimiseStorageOverheads() noexcept\r
{\r
const ScopedLockType lock (getLock());\r
- values.shrinkToNoMoreThan (values.size());\r
+ data.shrinkToNoMoreThan (numUsed);\r
}\r
\r
/** Increases the array's internal storage to hold a minimum number of elements.\r
void ensureStorageAllocated (const int minNumElements)\r
{\r
const ScopedLockType lock (getLock());\r
- values.ensureAllocatedSize (minNumElements);\r
+ data.ensureAllocatedSize (minNumElements);\r
}\r
\r
//==============================================================================\r
To lock, you can call getLock().enter() and getLock().exit(), or preferably use\r
an object of ScopedLockType as an RAII lock for it.\r
*/\r
- inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return values; }\r
+ inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; }\r
\r
/** Returns the type of scoped lock to use for locking this array */\r
using ScopedLockType = typename TypeOfCriticalSectionToUse::ScopedLockType;\r
\r
+\r
//==============================================================================\r
#ifndef DOXYGEN\r
// Note that the swapWithArray method has been replaced by a more flexible templated version,\r
\r
private:\r
//==============================================================================\r
- ArrayBase<ObjectClass*, TypeOfCriticalSectionToUse> values;\r
+ ArrayAllocationBase<ObjectClass*, TypeOfCriticalSectionToUse> data;\r
+ int numUsed = 0;\r
\r
void releaseAllObjects()\r
{\r
- for (auto& v : values)\r
- releaseObject (v);\r
+ while (numUsed > 0)\r
+ releaseObject (data.elements[--numUsed]);\r
\r
- values.clear();\r
+ jassert (numUsed == 0);\r
}\r
\r
static void releaseObject (ObjectClass* o)\r
virtual MemoryBlock* toBinary (const ValueUnion&) const noexcept { return nullptr; }\r
virtual var clone (const var& original) const { return original; }\r
\r
- virtual bool isVoid() const noexcept { return false; }\r
- virtual bool isUndefined() const noexcept { return false; }\r
- virtual bool isInt() const noexcept { return false; }\r
- virtual bool isInt64() const noexcept { return false; }\r
- virtual bool isBool() const noexcept { return false; }\r
- virtual bool isDouble() const noexcept { return false; }\r
- virtual bool isString() const noexcept { return false; }\r
- virtual bool isObject() const noexcept { return false; }\r
- virtual bool isArray() const noexcept { return false; }\r
- virtual bool isBinary() const noexcept { return false; }\r
- virtual bool isMethod() const noexcept { return false; }\r
- virtual bool isComparable() const noexcept { return false; }\r
+ virtual bool isVoid() const noexcept { return false; }\r
+ virtual bool isUndefined() const noexcept { return false; }\r
+ virtual bool isInt() const noexcept { return false; }\r
+ virtual bool isInt64() const noexcept { return false; }\r
+ virtual bool isBool() const noexcept { return false; }\r
+ virtual bool isDouble() const noexcept { return false; }\r
+ virtual bool isString() const noexcept { return false; }\r
+ virtual bool isObject() const noexcept { return false; }\r
+ virtual bool isArray() const noexcept { return false; }\r
+ virtual bool isBinary() const noexcept { return false; }\r
+ virtual bool isMethod() const noexcept { return false; }\r
\r
virtual void cleanUp (ValueUnion&) const noexcept {}\r
virtual void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest = source; }\r
VariantType_Void() noexcept {}\r
static const VariantType_Void instance;\r
\r
- bool isVoid() const noexcept override { return true; }\r
- bool isComparable() const noexcept override { return true; }\r
+ bool isVoid() const noexcept override { return true; }\r
bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); }\r
void writeToStream (const ValueUnion&, OutputStream& output) const override { output.writeCompressedInt (0); }\r
};\r
String toString (const ValueUnion& data) const override { return String (data.intValue); }\r
bool toBool (const ValueUnion& data) const noexcept override { return data.intValue != 0; }\r
bool isInt() const noexcept override { return true; }\r
- bool isComparable() const noexcept override { return true; }\r
\r
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
{\r
String toString (const ValueUnion& data) const override { return String (data.int64Value); }\r
bool toBool (const ValueUnion& data) const noexcept override { return data.int64Value != 0; }\r
bool isInt64() const noexcept override { return true; }\r
- bool isComparable() const noexcept override { return true; }\r
\r
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
{\r
String toString (const ValueUnion& data) const override { return String (data.doubleValue, 20); }\r
bool toBool (const ValueUnion& data) const noexcept override { return data.doubleValue != 0.0; }\r
bool isDouble() const noexcept override { return true; }\r
- bool isComparable() const noexcept override { return true; }\r
\r
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
{\r
String toString (const ValueUnion& data) const override { return String::charToString (data.boolValue ? (juce_wchar) '1' : (juce_wchar) '0'); }\r
bool toBool (const ValueUnion& data) const noexcept override { return data.boolValue; }\r
bool isBool() const noexcept override { return true; }\r
- bool isComparable() const noexcept override { return true; }\r
\r
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
{\r
bool toBool (const ValueUnion& data) const noexcept override { return getString (data)->getIntValue() != 0\r
|| getString (data)->trim().equalsIgnoreCase ("true")\r
|| getString (data)->trim().equalsIgnoreCase ("yes"); }\r
- bool isComparable() const noexcept override { return true; }\r
\r
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override\r
{\r
var::var (const VariantType& t) noexcept : type (&t) {}\r
var::~var() noexcept { type->cleanUp (value); }\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const var var::null;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const var var::null);\r
\r
//==============================================================================\r
var::var (const var& valueToCopy) : type (valueToCopy.type)\r
\r
bool var::equalsWithSameType (const var& other) const noexcept\r
{\r
- return hasSameTypeAs (other) && equals (other);\r
+ return type == other.type && equals (other);\r
}\r
\r
bool var::hasSameTypeAs (const var& other) const noexcept\r
return type == other.type;\r
}\r
\r
-bool canCompare (const var& v1, const var& v2)\r
-{\r
- return v1.type->isComparable() && v2.type->isComparable();\r
-}\r
-\r
-static int compare (const var& v1, const var& v2)\r
-{\r
- if (v1.isString() && v2.isString())\r
- return v1.toString().compare (v2.toString());\r
-\r
- auto diff = static_cast<double> (v1) - static_cast<double> (v2);\r
- return diff == 0 ? 0 : (diff < 0 ? -1 : 1);\r
-}\r
-\r
-bool operator== (const var& v1, const var& v2) { return v1.equals (v2); }\r
-bool operator!= (const var& v1, const var& v2) { return ! v1.equals (v2); }\r
-bool operator< (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) < 0; }\r
-bool operator> (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) > 0; }\r
-bool operator<= (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) <= 0; }\r
-bool operator>= (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) >= 0; }\r
-\r
-bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; }\r
-bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; }\r
-bool operator== (const var& v1, const char* v2) { return v1.toString() == v2; }\r
-bool operator!= (const var& v1, const char* v2) { return v1.toString() != v2; }\r
+bool operator== (const var& v1, const var& v2) noexcept { return v1.equals (v2); }\r
+bool operator!= (const var& v1, const var& v2) noexcept { return ! v1.equals (v2); }\r
+bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; }\r
+bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; }\r
+bool operator== (const var& v1, const char* const v2) { return v1.toString() == v2; }\r
+bool operator!= (const var& v1, const char* const v2) { return v1.toString() != v2; }\r
\r
//==============================================================================\r
var var::clone() const noexcept\r
//==============================================================================\r
int var::size() const\r
{\r
- if (auto array = getArray())\r
+ if (auto* array = getArray())\r
return array->size();\r
\r
return 0;\r
\r
const var& var::operator[] (int arrayIndex) const\r
{\r
- auto array = getArray();\r
+ auto* array = getArray();\r
\r
// When using this method, the var must actually be an array, and the index\r
// must be in-range!\r
\r
var& var::operator[] (int arrayIndex)\r
{\r
- auto array = getArray();\r
+ auto* array = getArray();\r
\r
// When using this method, the var must actually be an array, and the index\r
// must be in-range!\r
\r
Array<var>* var::convertToArray()\r
{\r
- if (auto array = getArray())\r
+ if (auto* array = getArray())\r
return array;\r
\r
Array<var> tempVar;\r
-\r
if (! isVoid())\r
tempVar.add (*this);\r
\r
\r
void var::remove (const int index)\r
{\r
- if (auto array = getArray())\r
+ if (auto* const array = getArray())\r
array->remove (index);\r
}\r
\r
\r
int var::indexOf (const var& n) const\r
{\r
- if (auto array = getArray())\r
+ if (auto* const array = getArray())\r
return array->indexOf (n);\r
\r
return -1;\r
case varMarker_BoolTrue: return var (true);\r
case varMarker_BoolFalse: return var (false);\r
case varMarker_Double: return var (input.readDouble());\r
-\r
case varMarker_String:\r
{\r
MemoryOutputStream mo;\r
empty var from a function by reference, but if you need to do that, it's easy enough to use\r
a function-local static var and return that, avoiding any order-of-initialisation issues.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const var null;)\r
+ JUCE_DEPRECATED_STATIC (static const var null);\r
\r
private:\r
//==============================================================================\r
- class VariantType;\r
- class VariantType_Void;\r
- class VariantType_Undefined;\r
- class VariantType_Int;\r
- class VariantType_Int64;\r
- class VariantType_Double;\r
- class VariantType_Bool;\r
- class VariantType_String;\r
- class VariantType_Object;\r
- class VariantType_Array;\r
- class VariantType_Binary;\r
- class VariantType_Method;\r
+ class VariantType; friend class VariantType;\r
+ class VariantType_Void; friend class VariantType_Void;\r
+ class VariantType_Undefined; friend class VariantType_Undefined;\r
+ class VariantType_Int; friend class VariantType_Int;\r
+ class VariantType_Int64; friend class VariantType_Int64;\r
+ class VariantType_Double; friend class VariantType_Double;\r
+ class VariantType_Bool; friend class VariantType_Bool;\r
+ class VariantType_String; friend class VariantType_String;\r
+ class VariantType_Object; friend class VariantType_Object;\r
+ class VariantType_Array; friend class VariantType_Array;\r
+ class VariantType_Binary; friend class VariantType_Binary;\r
+ class VariantType_Method; friend class VariantType_Method;\r
\r
union ValueUnion\r
{\r
NativeFunction* methodValue;\r
};\r
\r
- friend bool canCompare (const var&, const var&);\r
-\r
const VariantType* type;\r
ValueUnion value;\r
\r
};\r
\r
/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator== (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator!= (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator< (const var&, const var&);\r
+JUCE_API bool operator== (const var&, const var&) noexcept;\r
/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator<= (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator> (const var&, const var&);\r
-/** Compares the values of two var objects, using the var::equals() comparison. */\r
-JUCE_API bool operator>= (const var&, const var&);\r
-\r
+JUCE_API bool operator!= (const var&, const var&) noexcept;\r
JUCE_API bool operator== (const var&, const String&);\r
JUCE_API bool operator!= (const var&, const String&);\r
JUCE_API bool operator== (const var&, const char*);\r
\r
private:\r
//==============================================================================\r
- struct NativeIterator\r
+ class NativeIterator\r
{\r
+ public:\r
NativeIterator (const File& directory, const String& wildCard);\r
~NativeIterator();\r
\r
Time* modTime, Time* creationTime, bool* isReadOnly);\r
\r
class Pimpl;\r
+\r
+ private:\r
+ friend class DirectoryIterator;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator)\r
};\r
\r
+ friend struct ContainerDeletePolicy<NativeIterator::Pimpl>;\r
StringArray wildCards;\r
NativeIterator fileFinder;\r
String wildCard, path;\r
return *this;\r
}\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const File File::nonexistent;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const File File::nonexistent);\r
\r
//==============================================================================\r
static String removeEllipsis (const String& path)\r
return setFileExecutableInternal (shouldBeExecutable);\r
}\r
\r
-bool File::deleteRecursively (bool followSymlinks) const\r
+bool File::deleteRecursively() const\r
{\r
bool worked = true;\r
\r
- if (isDirectory() && (followSymlinks || ! isSymbolicLink()))\r
+ if (isDirectory())\r
for (auto& f : findChildFiles (File::findFilesAndDirectories, false))\r
- worked = f.deleteRecursively (followSymlinks) && worked;\r
+ worked = f.deleteRecursively() && worked;\r
\r
return deleteFile() && worked;\r
}\r
bool isDirectory() const;\r
\r
/** Checks whether the path of this file represents the root of a file system,\r
- irrespective of its existence.\r
+ irrespective of its existance.\r
\r
This will return true for "C:", "D:", etc on Windows and "/" on other\r
platforms.\r
If this file is actually a directory, it may not be deleted correctly if it\r
contains files. See deleteRecursively() as a better way of deleting directories.\r
\r
- If this file is a symlink, then the symlink will be deleted and not the target\r
- of the symlink.\r
-\r
@returns true if the file has been successfully deleted (or if it didn't exist to\r
begin with).\r
@see deleteRecursively\r
If this file is a directory, this will try to delete it and all its subfolders. If\r
it's just a file, it will just try to delete the file.\r
\r
-\r
- @param followSymlinks If true, then any symlink pointing to a directory will also\r
- recursively delete the contents of that directory\r
- @returns true if the file and all its subfolders have been successfully\r
- deleted (or if it didn't exist to begin with).\r
+ @returns true if the file and all its subfolders have been successfully deleted\r
+ (or if it didn't exist to begin with).\r
@see deleteFile\r
*/\r
- bool deleteRecursively (bool followSymlinks = false) const;\r
+ bool deleteRecursively() const;\r
\r
/** Moves this file or folder to the trash.\r
\r
//==============================================================================\r
/** Creates a stream to read from this file.\r
\r
- Note that this is an old method, and actually it's usually best to avoid it and\r
- instead use an RAII pattern with an FileInputStream directly, e.g.\r
- @code\r
- FileInputStream input (fileToOpen);\r
-\r
- if (input.openedOk())\r
- {\r
- input.read (etc...\r
- }\r
- @endcode\r
-\r
@returns a stream that will read from this file (initially positioned at the\r
start of the file), or nullptr if the file can't be opened for some reason\r
@see createOutputStream, loadFileAsData\r
\r
/** Creates a stream to write to this file.\r
\r
- Note that this is an old method, and actually it's usually best to avoid it and\r
- instead use an RAII pattern with an FileOutputStream directly, e.g.\r
- @code\r
- FileOutputStream output (fileToOpen);\r
-\r
- if (output.openedOk())\r
- {\r
- output.read etc...\r
- }\r
- @endcode\r
-\r
If the file exists, the stream that is returned will be positioned ready for\r
- writing at the end of the file. If you want to write to the start of the file,\r
- replacing the existing content, then you can do the following:\r
- @code\r
- FileOutputStream output (fileToOverwrite);\r
-\r
- if (output.openedOk())\r
- {\r
- output.setPosition (0);\r
- output.truncate();\r
- ...\r
- }\r
- @endcode\r
+ writing at the end of the file, so you might want to use deleteFile() first\r
+ to write to an empty file.\r
\r
@returns a stream that will write to this file (initially positioned at the\r
end of the file), or nullptr if the file can't be opened for some reason\r
Use File::getSeparatorChar() and File::getSeparatorString(), and instead of File::nonexistent,\r
just use File() or {}.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const juce_wchar separator;)\r
- JUCE_DEPRECATED_STATIC (static const StringRef separatorString;)\r
- JUCE_DEPRECATED_STATIC (static const File nonexistent;)\r
+ JUCE_DEPRECATED_STATIC (static const juce_wchar separator);\r
+ JUCE_DEPRECATED_STATIC (static const StringRef separatorString);\r
+ JUCE_DEPRECATED_STATIC (static const File nonexistent);\r
\r
private:\r
//==============================================================================\r
return currentPosition == pos;\r
}\r
\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct FileInputStreamTests : public UnitTest\r
-{\r
- FileInputStreamTests()\r
- : UnitTest ("FileInputStream", "Streams")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
- File f (File::createTempFile (".txt"));\r
- f.appendData (data.getData(), data.getSize());\r
- FileInputStream stream (f);\r
-\r
- beginTest ("Read");\r
-\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- size_t numBytesRead = 0;\r
- MemoryBlock readBuffer (data.getSize());\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- expect (readBuffer == data);\r
-\r
- beginTest ("Skip");\r
-\r
- stream.setPosition (0);\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- numBytesRead = 0;\r
- const int numBytesToSkip = 5;\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- stream.skipNextBytes (numBytesToSkip);\r
- numBytesRead += numBytesToSkip;\r
- numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- f.deleteFile();\r
- }\r
-};\r
-\r
-static FileInputStreamTests fileInputStreamTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
does not exist), the failedToOpen() method will return true.\r
\r
If the file already exists when opened, the stream's write-position will\r
- be set to the end of the file. To overwrite an existing file, you can truncate\r
- it like this:\r
-\r
- @code\r
- FileOutputStream stream (file);\r
-\r
- if (stream.openedOk())\r
- {\r
- stream.setPosition (0);\r
- stream.truncate();\r
- ...\r
- }\r
- @endcode\r
-\r
+ be set to the end of the file. To overwrite an existing file,\r
+ use File::deleteFile() before opening the stream, or use setPosition(0)\r
+ after it's opened (although this won't truncate the file).\r
\r
Destroying a FileOutputStream object does not force the operating system\r
to write the buffered data to disk immediately. If this is required you\r
\r
If the file can't be opened for some reason, the getData() method will return a null pointer.\r
\r
- NOTE: The start of the actual range used may be rounded-down to a multiple of the OS's page-size,\r
+ NOTE: the start of the actual range used may be rounded-down to a multiple of the OS's page-size,\r
so do not assume that the mapped memory will begin at exactly the position you requested - always\r
use getRange() to check the actual range that is being used.\r
*/\r
TemporaryFile temp (myTargetFile);\r
\r
// create a stream to the temporary file, and write some data to it...\r
- if (auto out = std::unique_ptr<FileOutputStream> (temp.getFile().createOutputStream()))\r
+ std::unique_ptr<FileOutputStream> out (temp.getFile().createOutputStream());\r
+\r
+ if (out != nullptr)\r
{\r
out->write ( ...etc )\r
- out.reset(); // (deletes the stream)\r
+ out = nullptr; // (deletes the stream)\r
\r
// ..now we've finished writing, this will rename the temp file to\r
// make it replace the target file we specified above.\r
}\r
else if (v.isDouble())\r
{\r
- auto d = static_cast<double> (v);\r
-\r
- if (juce_isfinite (d))\r
- out << String (d, maximumDecimalPlaces);\r
- else\r
- out << "null";\r
+ out << String (static_cast<double> (v), maximumDecimalPlaces);\r
}\r
else if (v.isArray())\r
{\r
void execute (const String& code)\r
{\r
ExpressionTreeBuilder tb (code);\r
- std::unique_ptr<BlockStatement> (tb.parseStatementList())->perform (Scope ({}, *this, *this), nullptr);\r
+ std::unique_ptr<BlockStatement> (tb.parseStatementList())->perform (Scope (nullptr, this, this), nullptr);\r
}\r
\r
var evaluate (const String& code)\r
{\r
ExpressionTreeBuilder tb (code);\r
- return ExpPtr (tb.parseExpression())->getResult (Scope ({}, *this, *this));\r
+ return ExpPtr (tb.parseExpression())->getResult (Scope (nullptr, this, this));\r
}\r
\r
//==============================================================================\r
static bool isNumericOrUndefined (const var& v) noexcept { return isNumeric (v) || v.isUndefined(); }\r
static int64 getOctalValue (const String& s) { BigInteger b; b.parseString (s.initialSectionContainingOnly ("01234567"), 8); return b.toInt64(); }\r
static Identifier getPrototypeIdentifier() { static const Identifier i ("prototype"); return i; }\r
- static var* getPropertyPointer (DynamicObject& o, const Identifier& i) noexcept { return o.getProperties().getVarPointer (i); }\r
+ static var* getPropertyPointer (DynamicObject* o, const Identifier& i) noexcept { return o->getProperties().getVarPointer (i); }\r
\r
//==============================================================================\r
struct CodeLocation\r
//==============================================================================\r
struct Scope\r
{\r
- Scope (const Scope* p, ReferenceCountedObjectPtr<RootObject> rt, DynamicObject::Ptr scp) noexcept\r
- : parent (p), root (static_cast<ReferenceCountedObjectPtr<RootObject>&&> (rt)),\r
- scope (static_cast<DynamicObject::Ptr&&> (scp)) {}\r
+ Scope (const Scope* p, RootObject* r, DynamicObject* s) noexcept : parent (p), root (r), scope (s) {}\r
\r
- const Scope* const parent;\r
+ const Scope* parent;\r
ReferenceCountedObjectPtr<RootObject> root;\r
DynamicObject::Ptr scope;\r
\r
{\r
if (auto* o = targetObject.getDynamicObject())\r
{\r
- if (auto* prop = getPropertyPointer (*o, functionName))\r
+ if (auto* prop = getPropertyPointer (o, functionName))\r
return *prop;\r
\r
for (auto* p = o->getProperty (getPrototypeIdentifier()).getDynamicObject(); p != nullptr;\r
p = p->getProperty (getPrototypeIdentifier()).getDynamicObject())\r
{\r
- if (auto* prop = getPropertyPointer (*p, functionName))\r
+ if (auto* prop = getPropertyPointer (p, functionName))\r
return *prop;\r
}\r
\r
var* findRootClassProperty (const Identifier& className, const Identifier& propName) const\r
{\r
if (auto* cls = root->getProperty (className).getDynamicObject())\r
- return getPropertyPointer (*cls, propName);\r
+ return getPropertyPointer (cls, propName);\r
\r
return nullptr;\r
}\r
\r
var findSymbolInParentScopes (const Identifier& name) const\r
{\r
- if (auto v = getPropertyPointer (*scope, name))\r
+ if (auto* v = getPropertyPointer (scope, name))\r
return *v;\r
\r
return parent != nullptr ? parent->findSymbolInParentScopes (name)\r
{\r
auto* target = args.thisObject.getDynamicObject();\r
\r
- if (target == nullptr || target == scope.get())\r
+ if (target == nullptr || target == scope)\r
{\r
- if (auto* m = getPropertyPointer (*scope, function))\r
+ if (auto* m = getPropertyPointer (scope, function))\r
{\r
if (auto fo = dynamic_cast<FunctionObject*> (m->getObject()))\r
{\r
\r
for (int i = 0; i < props.size(); ++i)\r
if (auto* o = props.getValueAt (i).getDynamicObject())\r
- if (Scope (this, *root, *o).findAndInvokeMethod (function, args, result))\r
+ if (Scope (this, root, o).findAndInvokeMethod (function, args, result))\r
return true;\r
\r
return false;\r
{\r
auto* target = args.thisObject.getDynamicObject();\r
\r
- if (target == nullptr || target == scope.get())\r
+ if (target == nullptr || target == scope)\r
{\r
if (auto fo = dynamic_cast<FunctionObject*> (m.getObject()))\r
{\r
if (Time::getCurrentTime() > root->timeout)\r
location.throwError (root->timeout == Time() ? "Interrupted" : "Execution timed-out");\r
}\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Scope)\r
};\r
\r
//==============================================================================\r
\r
void assign (const Scope& s, const var& newValue) const override\r
{\r
- if (auto* v = getPropertyPointer (*s.scope, name))\r
+ if (auto* v = getPropertyPointer (s.scope, name))\r
*v = newValue;\r
else\r
s.root->setProperty (name, newValue);\r
}\r
\r
if (auto* o = p.getDynamicObject())\r
- if (auto* v = getPropertyPointer (*o, child))\r
+ if (auto* v = getPropertyPointer (o, child))\r
return *v;\r
\r
return var::undefined();\r
\r
if (auto* o = arrayVar.getDynamicObject())\r
if (key.isString())\r
- if (auto* v = getPropertyPointer (*o, Identifier (key)))\r
+ if (auto* v = getPropertyPointer (o, Identifier (key)))\r
return *v;\r
\r
return var::undefined();\r
tb.parseFunctionParamsAndBody (*this);\r
}\r
\r
- DynamicObject::Ptr clone() override { return *new FunctionObject (*this); }\r
+ DynamicObject::Ptr clone() override { return new FunctionObject (*this); }\r
\r
void writeAsJSON (OutputStream& out, int /*indentLevel*/, bool /*allOnOneLine*/, int /*maximumDecimalPlaces*/) override\r
{\r
if (matchIf (TokenTypes::assign)) { ExpPtr rhs (parseExpression()); return new Assignment (location, lhs, rhs); }\r
if (matchIf (TokenTypes::plusEquals)) return parseInPlaceOpExpression<AdditionOp> (lhs);\r
if (matchIf (TokenTypes::minusEquals)) return parseInPlaceOpExpression<SubtractionOp> (lhs);\r
- if (matchIf (TokenTypes::timesEquals)) return parseInPlaceOpExpression<MultiplyOp> (lhs);\r
- if (matchIf (TokenTypes::divideEquals)) return parseInPlaceOpExpression<DivideOp> (lhs);\r
- if (matchIf (TokenTypes::moduloEquals)) return parseInPlaceOpExpression<ModuloOp> (lhs);\r
if (matchIf (TokenTypes::leftShiftEquals)) return parseInPlaceOpExpression<LeftShiftOp> (lhs);\r
if (matchIf (TokenTypes::rightShiftEquals)) return parseInPlaceOpExpression<RightShiftOp> (lhs);\r
\r
Expression* parseInPlaceOpExpression (ExpPtr& lhs)\r
{\r
ExpPtr rhs (parseExpression());\r
- Expression* bareLHS = lhs.get(); // careful - bare pointer is deliberately aliased\r
+ Expression* bareLHS = lhs.get(); // careful - bare pointer is deliberately alised\r
return new SelfAssignment (location, bareLHS, new OpType (location, lhs, rhs));\r
}\r
\r
\r
var JavascriptEngine::callFunction (const Identifier& function, const var::NativeFunctionArgs& args, Result* result)\r
{\r
- auto returnVal = var::undefined();\r
+ var returnVal (var::undefined());\r
\r
try\r
{\r
prepareTimeout();\r
if (result != nullptr) *result = Result::ok();\r
- RootObject::Scope ({}, *root, *root).findAndInvokeMethod (function, args, returnVal);\r
+ RootObject::Scope (nullptr, root, root).findAndInvokeMethod (function, args, returnVal);\r
}\r
catch (String& error)\r
{\r
var JavascriptEngine::callFunctionObject (DynamicObject* objectScope, const var& functionObject,\r
const var::NativeFunctionArgs& args, Result* result)\r
{\r
- auto returnVal = var::undefined();\r
+ var returnVal (var::undefined());\r
\r
try\r
{\r
prepareTimeout();\r
if (result != nullptr) *result = Result::ok();\r
- RootObject::Scope rootScope ({}, *root, *root);\r
- RootObject::Scope (&rootScope, *root, DynamicObject::Ptr (objectScope))\r
- .invokeMethod (functionObject, args, returnVal);\r
+ RootObject::Scope rootScope (nullptr, root, root);\r
+ RootObject::Scope (&rootScope, root, objectScope).invokeMethod (functionObject, args, returnVal);\r
}\r
catch (String& error)\r
{\r
#endif\r
\r
#if JUCE_ANDROID\r
- #include <ifaddrs.h>\r
#include <android/log.h>\r
#endif\r
\r
\r
//==============================================================================\r
#include "containers/juce_AbstractFifo.cpp"\r
-#include "containers/juce_ArrayBase.cpp"\r
#include "containers/juce_NamedValueSet.cpp"\r
-#include "containers/juce_OwnedArray.cpp"\r
#include "containers/juce_PropertySet.cpp"\r
-#include "containers/juce_ReferenceCountedArray.cpp"\r
#include "containers/juce_SparseSet.cpp"\r
#include "containers/juce_Variant.cpp"\r
#include "files/juce_DirectoryIterator.cpp"\r
#include "misc/juce_Result.cpp"\r
#include "misc/juce_Uuid.cpp"\r
#include "misc/juce_StdFunctionCompat.cpp"\r
-#include "misc/juce_ConsoleApplication.cpp"\r
#include "network/juce_MACAddress.cpp"\r
#include "network/juce_NamedPipe.cpp"\r
#include "network/juce_Socket.cpp"\r
#if ! JUCE_WINDOWS\r
#include "native/juce_posix_SharedCode.h"\r
#include "native/juce_posix_NamedPipe.cpp"\r
-#if ! JUCE_ANDROID || __ANDROID_API__ >= 24\r
- #include "native/juce_posix_IPAddress.h"\r
-#endif\r
#endif\r
\r
//==============================================================================\r
\r
ID: juce_core\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE core classes\r
description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.\r
website: http://www.juce.com/juce\r
OSXFrameworks: Cocoa IOKit\r
iOSFrameworks: Foundation\r
linuxLibs: rt dl pthread\r
+ linuxPackages: libcurl\r
mingwLibs: uuid wsock32 wininet version ole32 ws2_32 oleaut32 imm32 comdlg32 shlwapi rpcrt4 winmm\r
\r
END_JUCE_MODULE_DECLARATION\r
If you disable this then https/ssl support will not be available on linux.\r
*/\r
#ifndef JUCE_USE_CURL\r
- #if JUCE_LINUX\r
- #define JUCE_USE_CURL 1\r
- #else\r
- #define JUCE_USE_CURL 0\r
- #endif\r
-#endif\r
-\r
-/** Config: JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- If enabled, JUCE will load libcurl lazily when required (for example, when WebInputStream\r
- is used). Enabling this flag may also help with library dependency erros as linking\r
- libcurl at compile-time may instruct the linker to hard depend on a specific version\r
- of libcurl. It's also useful if you want to limit the amount of JUCE dependencies and\r
- you are not using WebInputStream or the URL classes.\r
-*/\r
-#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- #define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0\r
+ #define JUCE_USE_CURL 0\r
#endif\r
\r
\r
#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1\r
#endif\r
\r
-/** Config: JUCE_STRICT_REFCOUNTEDPOINTER\r
- If enabled, this will make the ReferenceCountedObjectPtr class stricter about allowing\r
- itself to be cast directly to a raw pointer. By default this is disabled, for compatibility\r
- with old code, but if possible, you should always enable it to improve code safety!\r
-*/\r
-#ifndef JUCE_STRICT_REFCOUNTEDPOINTER\r
- #define JUCE_STRICT_REFCOUNTEDPOINTER 0\r
-#endif\r
-\r
\r
#ifndef JUCE_STRING_UTF_TYPE\r
#define JUCE_STRING_UTF_TYPE 8\r
#include "maths/juce_StatisticsAccumulator.h"\r
#include "containers/juce_ElementComparator.h"\r
#include "containers/juce_ArrayAllocationBase.h"\r
-#include "containers/juce_ArrayBase.h"\r
#include "containers/juce_Array.h"\r
#include "containers/juce_LinkedListPointer.h"\r
#include "containers/juce_ListenerList.h"\r
#include "text/juce_Base64.h"\r
#include "misc/juce_Result.h"\r
#include "misc/juce_Uuid.h"\r
-#include "misc/juce_ConsoleApplication.h"\r
#include "containers/juce_Variant.h"\r
#include "containers/juce_NamedValueSet.h"\r
#include "containers/juce_DynamicObject.h"\r
#include "containers/juce_HashMap.h"\r
-#include "system/juce_SystemStats.h"\r
-#include "memory/juce_HeavyweightLeakedObjectDetector.h"\r
#include "time/juce_RelativeTime.h"\r
#include "time/juce_Time.h"\r
#include "streams/juce_InputStream.h"\r
#include "network/juce_URL.h"\r
#include "network/juce_WebInputStream.h"\r
#include "streams/juce_URLInputSource.h"\r
+#include "system/juce_SystemStats.h"\r
#include "time/juce_PerformanceCounter.h"\r
#include "unit_tests/juce_UnitTest.h"\r
#include "xml/juce_XmlDocument.h"\r
static File getSystemLogFileFolder();\r
\r
// (implementation of the Logger virtual method)\r
- void logMessage (const String&) override;\r
+ void logMessage (const String&);\r
\r
//==============================================================================\r
/** This is a utility function which removes lines from the start of a text\r
class Constant : public Term\r
{\r
public:\r
- Constant (double val, bool resolutionTarget)\r
+ Constant (const double val, const bool resolutionTarget)\r
: value (val), isResolutionTarget (resolutionTarget) {}\r
\r
Type getType() const noexcept { return constantType; }\r
Term* clone() const { return new Constant (value, isResolutionTarget); }\r
- TermPtr resolve (const Scope&, int) { return *this; }\r
+ TermPtr resolve (const Scope&, int) { return this; }\r
double toDouble() const { return value; }\r
- TermPtr negated() { return *new Constant (-value, isResolutionTarget); }\r
+ TermPtr negated() { return new Constant (-value, isResolutionTarget); }\r
\r
String toString() const\r
{\r
class BinaryTerm : public Term\r
{\r
public:\r
- BinaryTerm (TermPtr l, TermPtr r) : left (static_cast<TermPtr&&> (l)), right (static_cast<TermPtr&&> (r))\r
+ BinaryTerm (Term* const l, Term* const r) : left (l), right (r)\r
{\r
- jassert (left != nullptr && right != nullptr);\r
+ jassert (l != nullptr && r != nullptr);\r
}\r
\r
int getInputIndexFor (const Term* possibleInput) const\r
\r
Type getType() const noexcept { return operatorType; }\r
int getNumInputs() const { return 2; }\r
- Term* getInput (int index) const { return index == 0 ? left.get() : (index == 1 ? right.get() : nullptr); }\r
+ Term* getInput (int index) const { return index == 0 ? left.get() : (index == 1 ? right.get() : 0); }\r
\r
virtual double performFunction (double left, double right) const = 0;\r
virtual void writeOperator (String& dest) const = 0;\r
\r
TermPtr resolve (const Scope& scope, int recursionDepth)\r
{\r
- return *new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(),\r
- right->resolve (scope, recursionDepth)->toDouble()), false);\r
+ return new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(),\r
+ right->resolve (scope, recursionDepth)->toDouble()), false);\r
}\r
\r
String toString() const\r
{\r
String s;\r
- auto ourPrecendence = getOperatorPrecedence();\r
\r
+ const int ourPrecendence = getOperatorPrecedence();\r
if (left->getOperatorPrecedence() > ourPrecendence)\r
s << '(' << left->toString() << ')';\r
else\r
{\r
jassert (input == left || input == right);\r
if (input != left && input != right)\r
- return {};\r
+ return TermPtr();\r
\r
- if (auto dest = findDestinationFor (topLevelTerm, this))\r
+ if (const Term* const dest = findDestinationFor (topLevelTerm, this))\r
return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm);\r
\r
- return *new Constant (overallTarget, false);\r
+ return new Constant (overallTarget, false);\r
}\r
};\r
\r
Type getType() const noexcept { return functionType; }\r
Term* clone() const { return new Function (functionName, parameters); }\r
int getNumInputs() const { return parameters.size(); }\r
- Term* getInput (int i) const { return parameters.getReference(i).term.get(); }\r
+ Term* getInput (int i) const { return parameters.getReference(i).term; }\r
String getName() const { return functionName; }\r
\r
TermPtr resolve (const Scope& scope, int recursionDepth)\r
result = scope.evaluateFunction (functionName, nullptr, 0);\r
}\r
\r
- return *new Constant (result, false);\r
+ return new Constant (result, false);\r
}\r
\r
int getInputIndexFor (const Term* possibleInput) const\r
class DotOperator : public BinaryTerm\r
{\r
public:\r
- DotOperator (SymbolTerm* l, TermPtr r) : BinaryTerm (TermPtr (l), r) {}\r
+ DotOperator (SymbolTerm* const l, Term* const r) : BinaryTerm (l, r) {}\r
\r
TermPtr resolve (const Scope& scope, int recursionDepth)\r
{\r
return visitor.output;\r
}\r
\r
- Term* clone() const { return new DotOperator (getSymbol(), *right); }\r
+ Term* clone() const { return new DotOperator (getSymbol(), right); }\r
String getName() const { return "."; }\r
int getOperatorPrecedence() const { return 1; }\r
void writeOperator (String& dest) const { dest << '.'; }\r
int getInputIndexFor (const Term* possibleInput) const { return possibleInput == input ? 0 : -1; }\r
int getNumInputs() const { return 1; }\r
Term* getInput (int index) const { return index == 0 ? input.get() : nullptr; }\r
- Term* clone() const { return new Negate (*input->clone()); }\r
+ Term* clone() const { return new Negate (input->clone()); }\r
\r
TermPtr resolve (const Scope& scope, int recursionDepth)\r
{\r
- return *new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false);\r
+ return new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false);\r
}\r
\r
String getName() const { return "-"; }\r
\r
const Term* const dest = findDestinationFor (topLevelTerm, this);\r
\r
- return *new Negate (dest == nullptr ? TermPtr (*new Constant (overallTarget, false))\r
- : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm));\r
+ return new Negate (dest == nullptr ? new Constant (overallTarget, false)\r
+ : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm));\r
}\r
\r
String toString() const\r
class Add : public BinaryTerm\r
{\r
public:\r
- Add (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+ Add (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
\r
- Term* clone() const { return new Add (*left->clone(), *right->clone()); }\r
+ Term* clone() const { return new Add (left->clone(), right->clone()); }\r
double performFunction (double lhs, double rhs) const { return lhs + rhs; }\r
int getOperatorPrecedence() const { return 3; }\r
String getName() const { return "+"; }\r
\r
TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
{\r
- if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
- return *new Subtract (newDest, *(input == left ? right : left)->clone());\r
+ const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+ if (newDest == nullptr)\r
+ return TermPtr();\r
\r
- return {};\r
+ return new Subtract (newDest, (input == left ? right : left)->clone());\r
}\r
\r
private:\r
class Subtract : public BinaryTerm\r
{\r
public:\r
- Subtract (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+ Subtract (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
\r
- Term* clone() const { return new Subtract (*left->clone(), *right->clone()); }\r
+ Term* clone() const { return new Subtract (left->clone(), right->clone()); }\r
double performFunction (double lhs, double rhs) const { return lhs - rhs; }\r
int getOperatorPrecedence() const { return 3; }\r
String getName() const { return "-"; }\r
\r
TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
{\r
- if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
- {\r
- if (input == left)\r
- return *new Add (*newDest, *right->clone());\r
+ const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+ if (newDest == nullptr)\r
+ return TermPtr();\r
\r
- return *new Subtract (*left->clone(), *newDest);\r
- }\r
+ if (input == left)\r
+ return new Add (newDest, right->clone());\r
\r
- return {};\r
+ return new Subtract (left->clone(), newDest);\r
}\r
\r
private:\r
class Multiply : public BinaryTerm\r
{\r
public:\r
- Multiply (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+ Multiply (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
\r
- Term* clone() const { return new Multiply (*left->clone(), *right->clone()); }\r
+ Term* clone() const { return new Multiply (left->clone(), right->clone()); }\r
double performFunction (double lhs, double rhs) const { return lhs * rhs; }\r
String getName() const { return "*"; }\r
void writeOperator (String& dest) const { dest << " * "; }\r
\r
TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
{\r
- if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm))\r
- return *new Divide (newDest, *(input == left ? right : left)->clone());\r
+ const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
+ if (newDest == nullptr)\r
+ return TermPtr();\r
\r
- return {};\r
+ return new Divide (newDest, (input == left ? right : left)->clone());\r
}\r
\r
+ private:\r
JUCE_DECLARE_NON_COPYABLE (Multiply)\r
};\r
\r
class Divide : public BinaryTerm\r
{\r
public:\r
- Divide (TermPtr l, TermPtr r) : BinaryTerm (l, r) {}\r
+ Divide (Term* const l, Term* const r) : BinaryTerm (l, r) {}\r
\r
- Term* clone() const { return new Divide (*left->clone(), *right->clone()); }\r
+ Term* clone() const { return new Divide (left->clone(), right->clone()); }\r
double performFunction (double lhs, double rhs) const { return lhs / rhs; }\r
String getName() const { return "/"; }\r
void writeOperator (String& dest) const { dest << " / "; }\r
\r
TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const\r
{\r
- auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm);\r
-\r
+ const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm));\r
if (newDest == nullptr)\r
- return {};\r
+ return TermPtr();\r
\r
if (input == left)\r
- return *new Multiply (*newDest, *right->clone());\r
+ return new Multiply (newDest, right->clone());\r
\r
- return *new Divide (*left->clone(), *newDest);\r
+ return new Divide (left->clone(), newDest);\r
}\r
\r
+ private:\r
JUCE_DECLARE_NON_COPYABLE (Divide)\r
};\r
\r
}\r
\r
for (int i = 0; i < numIns; ++i)\r
- if (auto c = findTermToAdjust (term->getInput (i), mustBeFlagged))\r
+ {\r
+ Constant* const c = findTermToAdjust (term->getInput (i), mustBeFlagged);\r
+ if (c != nullptr)\r
return c;\r
+ }\r
\r
return nullptr;\r
}\r
\r
- static bool containsAnySymbols (const Term& t)\r
+ static bool containsAnySymbols (const Term* const t)\r
{\r
- if (t.getType() == Expression::symbolType)\r
+ if (t->getType() == Expression::symbolType)\r
return true;\r
\r
- for (int i = t.getNumInputs(); --i >= 0;)\r
- if (containsAnySymbols (*t.getInput (i)))\r
+ for (int i = t->getNumInputs(); --i >= 0;)\r
+ if (containsAnySymbols (t->getInput (i)))\r
return true;\r
\r
return false;\r
TermPtr readUpToComma()\r
{\r
if (text.isEmpty())\r
- return *new Constant (0.0, false);\r
+ return new Constant (0.0, false);\r
\r
- auto e = readExpression();\r
+ const TermPtr e (readExpression());\r
\r
if (e == nullptr || ((! readOperator (",")) && ! text.isEmpty()))\r
return parseError ("Syntax error: \"" + String (text) + "\"");\r
private:\r
String::CharPointerType& text;\r
\r
- TermPtr parseError (const String& message)\r
+ Term* parseError (const String& message)\r
{\r
if (error.isEmpty())\r
error = message;\r
\r
- return {};\r
+ return nullptr;\r
}\r
\r
//==============================================================================\r
\r
TermPtr readExpression()\r
{\r
- auto lhs = readMultiplyOrDivideExpression();\r
- char opType;\r
+ TermPtr lhs (readMultiplyOrDivideExpression());\r
\r
+ char opType;\r
while (lhs != nullptr && readOperator ("+-", &opType))\r
{\r
- auto rhs = readMultiplyOrDivideExpression();\r
+ TermPtr rhs (readMultiplyOrDivideExpression());\r
\r
if (rhs == nullptr)\r
return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\"");\r
\r
if (opType == '+')\r
- lhs = *new Add (lhs, rhs);\r
+ lhs = new Add (lhs, rhs);\r
else\r
- lhs = *new Subtract (lhs, rhs);\r
+ lhs = new Subtract (lhs, rhs);\r
}\r
\r
return lhs;\r
\r
TermPtr readMultiplyOrDivideExpression()\r
{\r
- auto lhs = readUnaryExpression();\r
- char opType;\r
+ TermPtr lhs (readUnaryExpression());\r
\r
+ char opType;\r
while (lhs != nullptr && readOperator ("*/", &opType))\r
{\r
TermPtr rhs (readUnaryExpression());\r
return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\"");\r
\r
if (opType == '*')\r
- lhs = *new Multiply (lhs, rhs);\r
+ lhs = new Multiply (lhs, rhs);\r
else\r
- lhs = *new Divide (lhs, rhs);\r
+ lhs = new Divide (lhs, rhs);\r
}\r
\r
return lhs;\r
\r
TermPtr readPrimaryExpression()\r
{\r
- if (auto e = readParenthesisedExpression())\r
+ TermPtr e (readParenthesisedExpression());\r
+ if (e != nullptr)\r
return e;\r
\r
- if (auto e = readNumber())\r
+ e = readNumber();\r
+ if (e != nullptr)\r
return e;\r
\r
return readSymbolOrFunction();\r
TermPtr readSymbolOrFunction()\r
{\r
String identifier;\r
-\r
if (readIdentifier (identifier))\r
{\r
if (readOperator ("(")) // method call...\r
{\r
- auto f = new Function (identifier);\r
+ Function* const f = new Function (identifier);\r
std::unique_ptr<Term> func (f); // (can't use std::unique_ptr<Function> in MSVC)\r
\r
- auto param = readExpression();\r
+ TermPtr param (readExpression());\r
\r
if (param == nullptr)\r
{\r
if (readOperator (")"))\r
- return TermPtr (func.release());\r
+ return func.release();\r
\r
return parseError ("Expected parameters after \"" + identifier + " (\"");\r
}\r
\r
- f->parameters.add (Expression (param.get()));\r
+ f->parameters.add (Expression (param));\r
\r
while (readOperator (","))\r
{\r
if (param == nullptr)\r
return parseError ("Expected expression after \",\"");\r
\r
- f->parameters.add (Expression (param.get()));\r
+ f->parameters.add (Expression (param));\r
}\r
\r
if (readOperator (")"))\r
- return TermPtr (func.release());\r
+ return func.release();\r
\r
return parseError ("Expected \")\"");\r
}\r
if (identifier == "this")\r
return rhs;\r
\r
- return *new DotOperator (new SymbolTerm (identifier), rhs);\r
+ return new DotOperator (new SymbolTerm (identifier), rhs);\r
}\r
\r
// just a symbol..\r
jassert (identifier.trim() == identifier);\r
- return *new SymbolTerm (identifier);\r
+ return new SymbolTerm (identifier);\r
}\r
\r
- return {};\r
+ return TermPtr();\r
}\r
\r
TermPtr readParenthesisedExpression()\r
{\r
if (! readOperator ("("))\r
- return {};\r
-\r
- auto e = readExpression();\r
+ return TermPtr();\r
\r
+ const TermPtr e (readExpression());\r
if (e == nullptr || ! readOperator (")"))\r
- return {};\r
+ return TermPtr();\r
\r
return e;\r
}\r
Expression Expression::parse (String::CharPointerType& stringToParse, String& parseError)\r
{\r
Helpers::Parser parser (stringToParse);\r
- Expression e (parser.readUpToComma().get());\r
+ Expression e (parser.readUpToComma());\r
parseError = parser.error;\r
return e;\r
}\r
Expression Expression::operator- (const Expression& other) const { return Expression (new Helpers::Subtract (term, other.term)); }\r
Expression Expression::operator* (const Expression& other) const { return Expression (new Helpers::Multiply (term, other.term)); }\r
Expression Expression::operator/ (const Expression& other) const { return Expression (new Helpers::Divide (term, other.term)); }\r
-Expression Expression::operator-() const { return Expression (term->negated().get()); }\r
+Expression Expression::operator-() const { return Expression (term->negated()); }\r
Expression Expression::symbol (const String& symbol) { return Expression (new Helpers::SymbolTerm (symbol)); }\r
\r
Expression Expression::function (const String& functionName, const Array<Expression>& parameters)\r
{\r
std::unique_ptr<Term> newTerm (term->clone());\r
\r
- auto termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true);\r
+ Helpers::Constant* termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true);\r
\r
if (termToAdjust == nullptr)\r
termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false);\r
\r
if (termToAdjust == nullptr)\r
{\r
- newTerm.reset (new Helpers::Add (*newTerm.release(), *new Helpers::Constant (0, false)));\r
+ newTerm.reset (new Helpers::Add (newTerm.release(), new Helpers::Constant (0, false)));\r
termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false);\r
}\r
\r
if (const Term* parent = Helpers::findDestinationFor (newTerm.get(), termToAdjust))\r
{\r
if (Helpers::TermPtr reverseTerm = parent->createTermToEvaluateInput (scope, termToAdjust, targetValue, newTerm.get()))\r
- termToAdjust->value = Expression (reverseTerm.get()).evaluate (scope);\r
+ termToAdjust->value = Expression (reverseTerm).evaluate (scope);\r
else\r
return Expression (targetValue);\r
}\r
}\r
\r
String Expression::toString() const { return term->toString(); }\r
-bool Expression::usesAnySymbols() const { return Helpers::containsAnySymbols (*term); }\r
+bool Expression::usesAnySymbols() const { return Helpers::containsAnySymbols (term); }\r
Expression::Type Expression::getType() const noexcept { return term->getType(); }\r
String Expression::getSymbolOrFunction() const { return term->getName(); }\r
int Expression::getNumInputs() const { return term->getNumInputs(); }\r
//==============================================================================\r
ReferenceCountedObjectPtr<Expression::Term> Expression::Term::negated()\r
{\r
- return *new Helpers::Negate (*this);\r
+ return new Helpers::Negate (this);\r
}\r
\r
//==============================================================================\r
//==============================================================================\r
class Term;\r
struct Helpers;\r
+ friend class Term;\r
+ friend struct Helpers;\r
+ friend struct ContainerDeletePolicy<Term>;\r
+ friend class ReferenceCountedObjectPtr<Term>;\r
ReferenceCountedObjectPtr<Term> term;\r
\r
explicit Expression (Term*);\r
/** A platform-independent 32-bit signed integer type. */\r
using int32 = signed int;\r
/** A platform-independent 32-bit unsigned integer type. */\r
-using uint32 = unsigned int;\r
+typedef unsigned int uint32;\r
\r
#if JUCE_MSVC\r
/** A platform-independent 64-bit integer type. */\r
}\r
}\r
\r
+\r
//==============================================================================\r
/** Constrains a value to keep it within a given range.\r
\r
return static_cast<unsigned int> (valueToTest) <= static_cast<unsigned int> (upperLimit);\r
}\r
\r
-/** Computes the absolute difference between two values and returns true if it is less than or equal\r
- to a given tolerance, otherwise it returns false.\r
-*/\r
-template <typename Type>\r
-bool isWithin (Type a, Type b, Type tolerance) noexcept\r
-{\r
- return std::abs (a - b) <= tolerance;\r
-}\r
-\r
-/** Returns true if the two numbers are approximately equal. This is useful for floating-point\r
- and double comparisons.\r
-*/\r
-template <typename Type>\r
-bool approximatelyEqual (Type a, Type b) noexcept\r
-{\r
- return std::abs (a - b) <= (std::numeric_limits<Type>::epsilon() * std::max (a, b))\r
- || std::abs (a - b) < std::numeric_limits<Type>::min();\r
-}\r
-\r
//==============================================================================\r
/** Handy function for avoiding unused variables warning. */\r
template <typename... Types>\r
: start (other.start), end (other.end),\r
interval (other.interval), skew (other.skew),\r
symmetricSkew (other.symmetricSkew),\r
- convertFrom0To1Function (static_cast<ConversionFunction&&> (other.convertFrom0To1Function)),\r
- convertTo0To1Function (static_cast<ConversionFunction&&> (other.convertTo0To1Function)),\r
- snapToLegalValueFunction (static_cast<ConversionFunction&&> (other.snapToLegalValueFunction))\r
+ convertFrom0To1Function (static_cast<ConverstionFunction&&> (other.convertFrom0To1Function)),\r
+ convertTo0To1Function (static_cast<ConverstionFunction&&> (other.convertTo0To1Function)),\r
+ snapToLegalValueFunction (static_cast<ConverstionFunction&&> (other.snapToLegalValueFunction))\r
{\r
}\r
\r
interval = other.interval;\r
skew = other.skew;\r
symmetricSkew = other.symmetricSkew;\r
- convertFrom0To1Function = static_cast<ConversionFunction&&> (other.convertFrom0To1Function);\r
- convertTo0To1Function = static_cast<ConversionFunction&&> (other.convertTo0To1Function);\r
- snapToLegalValueFunction = static_cast<ConversionFunction&&> (other.snapToLegalValueFunction);\r
+ convertFrom0To1Function = static_cast<ConverstionFunction&&> (other.convertFrom0To1Function);\r
+ convertTo0To1Function = static_cast<ConverstionFunction&&> (other.convertTo0To1Function);\r
+ snapToLegalValueFunction = static_cast<ConverstionFunction&&> (other.snapToLegalValueFunction);\r
\r
return *this;\r
}\r
return clampedValue;\r
}\r
\r
- using ConversionFunction = std::function<ValueType(ValueType, ValueType, ValueType)>;\r
+ using ConverstionFunction = std::function<ValueType(ValueType, ValueType, ValueType)>;\r
\r
- ConversionFunction convertFrom0To1Function = {},\r
- convertTo0To1Function = {},\r
- snapToLegalValueFunction = {};\r
+ ConverstionFunction convertFrom0To1Function = {},\r
+ convertTo0To1Function = {},\r
+ snapToLegalValueFunction = {};\r
};\r
\r
} // namespace juce\r
public:\r
//==============================================================================\r
/** Constructs an empty range. */\r
- Range() = default;\r
+ Range() noexcept : start(), end()\r
+ {\r
+ }\r
\r
/** Constructs a range with given start and end values. */\r
Range (const ValueType startValue, const ValueType endValue) noexcept\r
}\r
\r
/** Constructs a copy of another range. */\r
- Range (const Range&) = default;\r
+ Range (const Range& other) noexcept\r
+ : start (other.start), end (other.end)\r
+ {\r
+ }\r
\r
/** Copies another range object. */\r
- Range& operator= (const Range&) = default;\r
+ Range& operator= (Range other) noexcept\r
+ {\r
+ start = other.start;\r
+ end = other.end;\r
+ return *this;\r
+ }\r
\r
/** Returns the range that lies between two positions (in either order). */\r
static Range between (const ValueType position1, const ValueType position2) noexcept\r
\r
private:\r
//==============================================================================\r
- ValueType start{}, end{};\r
+ ValueType start, end;\r
};\r
\r
} // namespace juce\r
public:\r
//==============================================================================\r
/** Constructs a new StatisticsAccumulator. */\r
- StatisticsAccumulator() = default;\r
+ StatisticsAccumulator() noexcept\r
+ : count (0),\r
+ minimum ( std::numeric_limits<FloatType>::infinity()),\r
+ maximum (-std::numeric_limits<FloatType>::infinity())\r
+ {}\r
\r
//==============================================================================\r
/** Add a new value to the accumulator.\r
//==============================================================================\r
struct KahanSum\r
{\r
- KahanSum() = default;\r
+ KahanSum() noexcept : sum(), error() {}\r
operator FloatType() const noexcept { return sum; }\r
\r
void JUCE_NO_ASSOCIATIVE_MATH_OPTIMISATIONS operator+= (FloatType value) noexcept\r
sum = newSum;\r
}\r
\r
- FloatType sum{}, error{};\r
+ FloatType sum, error;\r
};\r
\r
//==============================================================================\r
- size_t count { 0 };\r
+ size_t count;\r
KahanSum sum, sumSquares;\r
- FloatType minimum { std::numeric_limits<FloatType>::infinity() },\r
- maximum { -std::numeric_limits<FloatType>::infinity() };\r
+ FloatType minimum, maximum;\r
};\r
\r
} // namespace juce\r
template <typename Type>\r
struct Atomic final\r
{\r
- using DiffType = typename AtomicHelpers::DiffTypeHelper<Type>::Type;\r
+ typedef typename AtomicHelpers::DiffTypeHelper<Type>::Type DiffType;\r
\r
/** Creates a new value, initialised to zero. */\r
- Atomic() noexcept : value (Type()) {}\r
+ Atomic() noexcept : value (0) {}\r
\r
/** Creates a new value, with a given initial value. */\r
Atomic (Type initialValue) noexcept : value (initialValue) {}\r
template <class ElementType, bool throwOnFailure = false>\r
class HeapBlock\r
{\r
-private:\r
- template <class OtherElementType>\r
- using AllowConversion = typename std::enable_if<std::is_base_of<typename std::remove_pointer<ElementType>::type,\r
- typename std::remove_pointer<OtherElementType>::type>::value>::type;\r
-\r
public:\r
//==============================================================================\r
/** Creates a HeapBlock which is initially just a null pointer.\r
return *this;\r
}\r
\r
- /** Converting move constructor.\r
- Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>,\r
- where std::is_base_of<Base, Derived>::value == true.\r
- */\r
- template <class OtherElementType, bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>>\r
- HeapBlock (HeapBlock<OtherElementType, otherThrowOnFailure>&& other) noexcept\r
- : data (reinterpret_cast<ElementType*> (other.data))\r
- {\r
- other.data = nullptr;\r
- }\r
-\r
- /** Converting move assignment operator.\r
- Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>,\r
- where std::is_base_of<Base, Derived>::value == true.\r
- */\r
- template <class OtherElementType, bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>>\r
- HeapBlock& operator= (HeapBlock<OtherElementType, otherThrowOnFailure>&& other) noexcept\r
- {\r
- free();\r
- data = reinterpret_cast<ElementType*> (other.data);\r
- other.data = nullptr;\r
- return *this;\r
- }\r
-\r
//==============================================================================\r
/** Returns a raw pointer to the allocated data.\r
This may be a null pointer if the data hasn't yet been allocated, or if it has been\r
}\r
\r
/** This typedef can be used to get the type of the heapblock's elements. */\r
- using Type = ElementType;\r
+ typedef ElementType Type;\r
\r
private:\r
//==============================================================================\r
#endif\r
}\r
\r
- template <class OtherElementType, bool otherThrowOnFailure>\r
- friend class HeapBlock;\r
-\r
#if ! (defined (JUCE_DLL) || defined (JUCE_DLL_BUILD))\r
JUCE_DECLARE_NON_COPYABLE (HeapBlock)\r
JUCE_PREVENT_HEAP_ALLOCATION // Creating a 'new HeapBlock' would be missing the point!\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- This class is a useful way of tracking down hard to find memory leaks when the\r
- regular LeakedObjectDetector isn't enough.\r
-\r
- As well as firing when any instances of the OwnerClass type are leaked, it will\r
- print out a stack trace showing where the leaked object was created. This is obviously\r
- quite a heavyweight task so, unlike the LeakedObjectDetector which should be always\r
- be added to your classes, you should only use this object temporarily when you are\r
- debugging and remove it when finished.\r
-\r
- To use it, use the JUCE_HEAVYWEIGHT_LEAK_DETECTOR macro as a simple way to put\r
- one in your class declaration.\r
-\r
- @tags{Core}\r
-*/\r
-template <class OwnerClass>\r
-class HeavyweightLeakedObjectDetector\r
-{\r
-public:\r
- //==============================================================================\r
- HeavyweightLeakedObjectDetector() noexcept { getBacktraceMap().set (this, SystemStats::getStackBacktrace()); }\r
- HeavyweightLeakedObjectDetector (const HeavyweightLeakedObjectDetector&) noexcept { getBacktraceMap().set (this, SystemStats::getStackBacktrace()); }\r
-\r
- ~HeavyweightLeakedObjectDetector() { getBacktraceMap().remove (this); }\r
-\r
-private:\r
- //==============================================================================\r
- typedef HashMap<HeavyweightLeakedObjectDetector<OwnerClass>*, String> BacktraceMap;\r
-\r
- //==============================================================================\r
- struct BacktraceMapHolder\r
- {\r
- BacktraceMapHolder() noexcept {}\r
-\r
- ~BacktraceMapHolder()\r
- {\r
- if (map.size() > 0)\r
- {\r
- DBG ("*** Leaked objects detected: " << map.size() << " instance(s) of class " << getLeakedObjectClassName());\r
- DBG (getFormattedBacktracesString());\r
-\r
- /** If you hit this, then you've leaked one or more objects of the type specified by\r
- the 'OwnerClass' template parameter - the name and stack trace of its creation should\r
- have been printed by the lines above.\r
-\r
- If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for\r
- your object management. Tut, tut. Always, always use std::unique_ptrs, OwnedArrays,\r
- ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs!\r
- */\r
- jassertfalse;\r
- }\r
- }\r
-\r
- String getFormattedBacktracesString() const\r
- {\r
- String str;\r
-\r
- int counter = 1;\r
- for (typename BacktraceMap::Iterator i (map); i.next();)\r
- {\r
- str << "\nBacktrace " << String (counter++) << "\n"\r
- << "-----------------------------------------------------------------" << "\n"\r
- << i.getValue();\r
- }\r
-\r
- return str;\r
- }\r
-\r
- BacktraceMap map;\r
- };\r
-\r
- static BacktraceMap& getBacktraceMap()\r
- {\r
- static BacktraceMapHolder holder;\r
- return holder.map;\r
- }\r
-\r
- static const char* getLeakedObjectClassName()\r
- {\r
- return OwnerClass::getLeakedObjectClassName();\r
- }\r
-};\r
-\r
-//==============================================================================\r
-#if DOXYGEN || ! defined (JUCE_HEAVYWEIGHT_LEAK_DETECTOR)\r
- #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS)\r
- /** This macro lets you embed a heavyweight leak-detecting object inside a class.\r
-\r
- To use it, simply declare a JUCE_HEAVYWEIGHT_LEAK_DETECTOR (YourClassName) inside a private section\r
- of the class declaration. E.g.\r
-\r
- @code\r
- class MyClass\r
- {\r
- public:\r
- MyClass();\r
- void blahBlah();\r
-\r
- private:\r
- JUCE_HEAVYWEIGHT_LEAK_DETECTOR (MyClass)\r
- };\r
- @endcode\r
-\r
- NB: you should only use this when you really need to track down a tricky memory leak, and\r
- should never leave one of these inside a class!\r
-\r
- @see HeavyweightLeakedObjectDetector, JUCE_LEAK_DETECTOR, LeakedObjectDetector\r
- */\r
- #define JUCE_HEAVYWEIGHT_LEAK_DETECTOR(OwnerClass) \\r
- friend class juce::HeavyweightLeakedObjectDetector<OwnerClass>; \\r
- static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \\r
- juce::HeavyweightLeakedObjectDetector<OwnerClass> JUCE_JOIN_MACRO (leakDetector, __LINE__);\r
- #else\r
- #define JUCE_HEAVYWEIGHT_LEAK_DETECTOR(OwnerClass)\r
- #endif\r
-#endif\r
-\r
-} // namespace juce\r
\r
/** Overwrites a structure or object with zeros. */\r
template <typename Type>\r
-inline void zerostruct (Type& structure) noexcept { memset ((void*) &structure, 0, sizeof (structure)); }\r
+inline void zerostruct (Type& structure) noexcept { memset (&structure, 0, sizeof (structure)); }\r
\r
/** Delete an object pointer, and sets the pointer to null.\r
\r
/**\r
A class to hold a resizable block of raw data.\r
\r
+\r
@tags{Core}\r
*/\r
class JUCE_API MemoryBlock\r
\r
private:\r
//==============================================================================\r
- using HeapBlockType = HeapBlock<char, true>;\r
+ typedef HeapBlock<char, true> HeapBlockType;\r
HeapBlockType data;\r
size_t size = 0;\r
\r
Once a new ReferenceCountedObject has been assigned to a pointer, be\r
careful not to delete the object manually.\r
\r
- This class uses an Atomic<int> value to hold the reference count, so that\r
+ This class uses an Atomic<int> value to hold the reference count, so that it\r
the pointers can be passed between threads safely. For a faster but non-thread-safe\r
version, use SingleThreadedReferenceCountedObject instead.\r
\r
incIfNotNull (refCountedObject);\r
}\r
\r
- /** Creates a pointer to an object.\r
- This will increment the object's reference-count.\r
- */\r
- ReferenceCountedObjectPtr (ReferencedType& refCountedObject) noexcept\r
- : referencedObject (&refCountedObject)\r
- {\r
- refCountedObject.incReferenceCount();\r
- }\r
-\r
/** Copies another pointer.\r
This will increment the object's reference-count.\r
*/\r
incIfNotNull (referencedObject);\r
}\r
\r
- /** Takes-over the object from another pointer. */\r
- ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept\r
- : referencedObject (other.referencedObject)\r
- {\r
- other.referencedObject = nullptr;\r
- }\r
-\r
/** Copies another pointer.\r
This will increment the object's reference-count (if it is non-null).\r
*/\r
*/\r
ReferenceCountedObjectPtr& operator= (ReferencedType* newObject)\r
{\r
- if (newObject != nullptr)\r
- return operator= (*newObject);\r
-\r
- reset();\r
- return *this;\r
- }\r
-\r
- /** Changes this pointer to point at a different object.\r
-\r
- The reference count of the old object is decremented, and it might be\r
- deleted if it hits zero. The new object's count is incremented.\r
- */\r
- ReferenceCountedObjectPtr& operator= (ReferencedType& newObject)\r
- {\r
- if (referencedObject != &newObject)\r
+ if (referencedObject != newObject)\r
{\r
- newObject.incReferenceCount();\r
+ incIfNotNull (newObject);\r
auto* oldObject = referencedObject;\r
- referencedObject = &newObject;\r
+ referencedObject = newObject;\r
decIfNotNull (oldObject);\r
}\r
\r
return *this;\r
}\r
\r
- /** Resets this pointer to a null pointer. */\r
- ReferenceCountedObjectPtr& operator= (decltype (nullptr))\r
+ /** Takes-over the object from another pointer. */\r
+ ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept\r
+ : referencedObject (other.referencedObject)\r
{\r
- reset();\r
- return *this;\r
+ other.referencedObject = nullptr;\r
}\r
\r
/** Takes-over the object from another pointer. */\r
- ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) noexcept\r
+ ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other)\r
{\r
std::swap (referencedObject, other.referencedObject);\r
return *this;\r
/** Returns the object that this pointer references.\r
The pointer returned may be null, of course.\r
*/\r
- ReferencedType* get() const noexcept { return referencedObject; }\r
+ operator ReferencedType*() const noexcept { return referencedObject; }\r
\r
- /** Resets this object to a null pointer. */\r
- void reset() noexcept\r
- {\r
- auto oldObject = referencedObject; // need to null the pointer before deleting the object\r
- referencedObject = nullptr; // in case this ptr is itself deleted as a side-effect\r
- decIfNotNull (oldObject); // of the destructor\r
- }\r
+ /** Returns the object that this pointer references.\r
+ The pointer returned may be null, of course.\r
+ */\r
+ ReferencedType* get() const noexcept { return referencedObject; }\r
+\r
+ /** Returns the object that this pointer references.\r
+ The pointer returned may be null, of course.\r
+ */\r
+ ReferencedType* getObject() const noexcept { return referencedObject; }\r
\r
// the -> operator is called on the referenced object\r
ReferencedType* operator->() const noexcept\r
return referencedObject;\r
}\r
\r
- /** Dereferences the object that this pointer references.\r
- The pointer returned may be null, of course.\r
- */\r
- ReferencedType& operator*() const noexcept { jassert (referencedObject != nullptr); return *referencedObject; }\r
-\r
- /** Checks whether this pointer is null */\r
- bool operator== (decltype (nullptr)) const noexcept { return referencedObject == nullptr; }\r
- /** Checks whether this pointer is null */\r
- bool operator!= (decltype (nullptr)) const noexcept { return referencedObject != nullptr; }\r
-\r
- /** Compares two ReferenceCountedObjectPtrs. */\r
- bool operator== (const ObjectType* other) const noexcept { return referencedObject == other; }\r
- /** Compares two ReferenceCountedObjectPtrs. */\r
- bool operator== (const ReferenceCountedObjectPtr& other) const noexcept { return referencedObject == other.get(); }\r
- /** Compares two ReferenceCountedObjectPtrs. */\r
- bool operator!= (const ObjectType* other) const noexcept { return referencedObject != other; }\r
- /** Compares two ReferenceCountedObjectPtrs. */\r
- bool operator!= (const ReferenceCountedObjectPtr& other) const noexcept { return referencedObject != other.get(); }\r
-\r
- #if JUCE_STRICT_REFCOUNTEDPOINTER\r
- /** Checks whether this pointer is null */\r
- explicit operator bool() const noexcept { return referencedObject != nullptr; }\r
-\r
- #else\r
- /** Returns the object that this pointer references.\r
- The pointer returned may be null, of course.\r
- Note that this methods allows the compiler to be very lenient with what it allows you to do\r
- with the pointer, it's safer to disable this by setting JUCE_STRICT_REFCOUNTEDPOINTER=1, which\r
- increased type safety and can prevent some common slip-ups.\r
- */\r
- operator ReferencedType*() const noexcept { return referencedObject; }\r
- #endif\r
-\r
-\r
- // This old method is deprecated in favour of the shorter and more standard get() method.\r
- JUCE_DEPRECATED_WITH_BODY (ReferencedType* getObject() const, { return get(); })\r
-\r
private:\r
//==============================================================================\r
ReferencedType* referencedObject = nullptr;\r
\r
//==============================================================================\r
/** Compares two ReferenceCountedObjectPtrs. */\r
-template <typename Type>\r
-bool operator== (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept\r
+template <typename ObjectType>\r
+bool operator== (const ReferenceCountedObjectPtr<ObjectType>& object1, ObjectType* const object2) noexcept\r
+{\r
+ return object1.get() == object2;\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator== (const ReferenceCountedObjectPtr<ObjectType>& object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
+{\r
+ return object1.get() == object2.get();\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator== (ObjectType* object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
{\r
return object1 == object2.get();\r
}\r
\r
/** Compares two ReferenceCountedObjectPtrs. */\r
-template <typename Type>\r
-bool operator!= (const Type* object1, const ReferenceCountedObjectPtr<Type>& object2) noexcept\r
+template <typename ObjectType>\r
+bool operator!= (const ReferenceCountedObjectPtr<ObjectType>& object1, const ObjectType* object2) noexcept\r
+{\r
+ return object1.get() != object2;\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator!= (const ReferenceCountedObjectPtr<ObjectType>& object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
+{\r
+ return object1.get() != object2.get();\r
+}\r
+\r
+/** Compares two ReferenceCountedObjectPtrs. */\r
+template <typename ObjectType>\r
+bool operator!= (ObjectType* object1, const ReferenceCountedObjectPtr<ObjectType>& object2) noexcept\r
{\r
return object1 != object2.get();\r
}\r
object = newObject;\r
ContainerDeletePolicy<ObjectType>::destroy (oldObject);\r
}\r
- else\r
- {\r
- // You're trying to reset this ScopedPointer to itself! This will work here as ScopedPointer does an equality check\r
- // but be aware that std::unique_ptr won't do this and you could end up with some nasty, subtle bugs!\r
- jassert (newObject == nullptr);\r
- }\r
}\r
\r
/** Sets this pointer to a new object, deleting the old object that it was previously pointing to if there was one. */\r
the underlying object is also immediately destroyed. This allows you to use scoping\r
to manage the lifetime of a shared resource.\r
\r
- Note: The construction/deletion of the shared object must not involve any\r
+ Note: the construction/deletion of the shared object must not involve any\r
code that makes recursive calls to a SharedResourcePointer, or you'll cause\r
a deadlock.\r
\r
It must embed a WeakReference::Master object, which stores a shared pointer object, and must clear\r
this master pointer in its destructor.\r
\r
- Note that WeakReference is not designed to be thread-safe, so if you're accessing it from\r
- different threads, you'll need to do your own locking around all uses of the pointer and\r
- the object it refers to.\r
-\r
E.g.\r
@code\r
class MyObject\r
{\r
public:\r
- MyObject() {}\r
+ MyObject()\r
+ {\r
+ // If you're planning on using your WeakReferences in a multi-threaded situation, you may choose\r
+ // to create a WeakReference to the object here in the constructor, which will pre-initialise the\r
+ // embedded object, avoiding an (extremely unlikely) race condition that could occur if multiple\r
+ // threads overlap while creating the first WeakReference to it.\r
+ }\r
\r
~MyObject()\r
{\r
\r
// Here's an example of using a pointer..\r
\r
- auto* n = new MyObject();\r
+ MyObject* n = new MyObject();\r
WeakReference<MyObject> myObjectRef = n;\r
\r
- auto pointer1 = myObjectRef.get(); // returns a valid pointer to 'n'\r
+ MyObject* pointer1 = myObjectRef; // returns a valid pointer to 'n'\r
delete n;\r
- auto pointer2 = myObjectRef.get(); // now returns nullptr\r
+ MyObject* pointer2 = myObjectRef; // returns a null pointer\r
@endcode\r
\r
@see WeakReference::Master\r
JUCE_DECLARE_NON_COPYABLE (SharedPointer)\r
};\r
\r
- using SharedRef = ReferenceCountedObjectPtr<SharedPointer>;\r
+ typedef ReferenceCountedObjectPtr<SharedPointer> SharedRef;\r
\r
//==============================================================================\r
/**\r
/** The first call to this method will create an internal object that is shared by all weak\r
references to the object.\r
*/\r
- SharedRef getSharedPointer (ObjectType* object)\r
+ SharedPointer* getSharedPointer (ObjectType* object)\r
{\r
if (sharedPointer == nullptr)\r
{\r
- sharedPointer = *new SharedPointer (object);\r
+ sharedPointer = new SharedPointer (object);\r
}\r
else\r
{\r
private:\r
SharedRef holder;\r
\r
- static inline SharedRef getRef (ObjectType* o)\r
+ static inline SharedPointer* getRef (ObjectType* o)\r
{\r
- if (o != nullptr)\r
- return o->masterReference.getSharedPointer (o);\r
-\r
- return {};\r
+ return (o != nullptr) ? o->masterReference.getSharedPointer (o) : nullptr;\r
}\r
};\r
\r
@see WeakReference, WeakReference::Master\r
*/\r
#define JUCE_DECLARE_WEAK_REFERENCEABLE(Class) \\r
- struct WeakRefMaster : public juce::WeakReference<Class>::Master { ~WeakRefMaster() { this->clear(); } }; \\r
+ struct WeakRefMaster : public WeakReference<Class>::Master { ~WeakRefMaster() { this->clear(); } }; \\r
WeakRefMaster masterReference; \\r
- friend class juce::WeakReference<Class>; \\r
+ friend class WeakReference<Class>; \\r
\r
\r
} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-File ArgumentList::Argument::resolveAsFile() const\r
-{\r
- return File::getCurrentWorkingDirectory().getChildFile (text.unquoted());\r
-}\r
-\r
-File ArgumentList::Argument::resolveAsExistingFile() const\r
-{\r
- auto f = resolveAsFile();\r
-\r
- if (! f.exists())\r
- ConsoleApplication::fail ("Could not find file: " + f.getFullPathName());\r
-\r
- return f;\r
-}\r
-\r
-File ArgumentList::Argument::resolveAsExistingFolder() const\r
-{\r
- auto f = resolveAsFile();\r
-\r
- if (! f.isDirectory())\r
- ConsoleApplication::fail ("Could not find folder: " + f.getFullPathName());\r
-\r
- return f;\r
-}\r
-\r
-bool ArgumentList::Argument::isLongOption() const { return text[0] == '-' && text[1] == '-' && text[2] != '-'; }\r
-bool ArgumentList::Argument::isShortOption() const { return text[0] == '-' && text[1] != '-'; }\r
-\r
-bool ArgumentList::Argument::isLongOption (const String& option) const\r
-{\r
- if (option.startsWith ("--"))\r
- return text == option;\r
-\r
- jassert (! option.startsWithChar ('-')); // this will always fail to match\r
-\r
- return text == "--" + option;\r
-}\r
-\r
-bool ArgumentList::Argument::isShortOption (char option) const\r
-{\r
- jassert (option != '-'); // this is probably not what you intended to pass in\r
-\r
- return isShortOption() && text.containsChar (option);\r
-}\r
-\r
-static bool compareOptionStrings (StringRef s1, StringRef s2)\r
-{\r
- if (s1 == s2)\r
- return true;\r
-\r
- auto toks1 = StringArray::fromTokens (s1, "|", {});\r
- auto toks2 = StringArray::fromTokens (s2, "|", {});\r
-\r
- for (auto& part1 : toks1)\r
- for (auto& part2 : toks2)\r
- if (part1.trim() == part2.trim())\r
- return true;\r
-\r
- return false;\r
-}\r
-\r
-bool ArgumentList::Argument::operator== (StringRef s) const { return compareOptionStrings (text, s); }\r
-bool ArgumentList::Argument::operator!= (StringRef s) const { return ! operator== (s); }\r
-\r
-//==============================================================================\r
-ArgumentList::ArgumentList (String exeName, StringArray args)\r
- : executableName (std::move (exeName))\r
-{\r
- args.trim();\r
-\r
- for (auto& a : args)\r
- arguments.add ({ a });\r
-}\r
-\r
-ArgumentList::ArgumentList (int argc, char* argv[])\r
- : ArgumentList (argv[0], StringArray (argv + 1, argc - 1))\r
-{\r
-}\r
-\r
-ArgumentList::ArgumentList (const String& exeName, const String& args)\r
- : ArgumentList (exeName, StringArray::fromTokens (args, true))\r
-{\r
-}\r
-\r
-int ArgumentList::size() const { return arguments.size(); }\r
-ArgumentList::Argument ArgumentList::operator[] (int index) const { return arguments[index]; }\r
-\r
-void ArgumentList::checkMinNumArguments (int expectedMinNumberOfArgs) const\r
-{\r
- if (size() < expectedMinNumberOfArgs)\r
- ConsoleApplication::fail ("Not enough arguments!");\r
-}\r
-\r
-int ArgumentList::indexOfOption (StringRef option) const\r
-{\r
- jassert (option == String (option).trim()); // passing non-trimmed strings will always fail to find a match!\r
-\r
- for (int i = 0; i < arguments.size(); ++i)\r
- if (arguments.getReference(i) == option)\r
- return i;\r
-\r
- return -1;\r
-}\r
-\r
-bool ArgumentList::containsOption (StringRef option) const\r
-{\r
- return indexOfOption (option) >= 0;\r
-}\r
-\r
-void ArgumentList::failIfOptionIsMissing (StringRef option) const\r
-{\r
- if (! containsOption (option))\r
- ConsoleApplication::fail ("Expected the option " + option);\r
-}\r
-\r
-ArgumentList::Argument ArgumentList::getArgumentAfterOption (StringRef option) const\r
-{\r
- for (int i = 0; i < arguments.size() - 1; ++i)\r
- if (arguments.getReference(i) == option)\r
- return arguments.getReference (i + 1);\r
-\r
- return {};\r
-}\r
-\r
-File ArgumentList::getFileAfterOption (StringRef option) const\r
-{\r
- failIfOptionIsMissing (option);\r
- auto arg = getArgumentAfterOption (option);\r
-\r
- if (arg.text.isEmpty() || arg.text.startsWithChar ('-'))\r
- ConsoleApplication::fail ("Expected a filename after the " + option + " option");\r
-\r
- return arg.resolveAsFile();\r
-}\r
-\r
-File ArgumentList::getExistingFileAfterOption (StringRef option) const\r
-{\r
- failIfOptionIsMissing (option);\r
- auto arg = getArgumentAfterOption (option);\r
-\r
- if (arg.text.isEmpty())\r
- ConsoleApplication::fail ("Expected a filename after the " + option + " option");\r
-\r
- return arg.resolveAsExistingFile();\r
-}\r
-\r
-File ArgumentList::getExistingFolderAfterOption (StringRef option) const\r
-{\r
- failIfOptionIsMissing (option);\r
- auto arg = getArgumentAfterOption (option);\r
-\r
- if (arg.text.isEmpty())\r
- ConsoleApplication::fail ("Expected a folder name after the " + option + " option");\r
-\r
- return arg.resolveAsExistingFolder();\r
-}\r
-\r
-//==============================================================================\r
-struct ConsoleAppFailureCode\r
-{\r
- String errorMessage;\r
- int returnCode;\r
-};\r
-\r
-void ConsoleApplication::fail (String errorMessage, int returnCode)\r
-{\r
- throw ConsoleAppFailureCode { std::move (errorMessage), returnCode };\r
-}\r
-\r
-int ConsoleApplication::invokeCatchingFailures (std::function<int()>&& f)\r
-{\r
- int returnCode = 0;\r
-\r
- try\r
- {\r
- returnCode = f();\r
- }\r
- catch (const ConsoleAppFailureCode& error)\r
- {\r
- std::cout << error.errorMessage << std::endl;\r
- returnCode = error.returnCode;\r
- }\r
-\r
- return returnCode;\r
-}\r
-\r
-int ConsoleApplication::findAndRunCommand (const ArgumentList& args) const\r
-{\r
- for (auto& c : commands)\r
- if (args.containsOption (c.commandOption))\r
- return invokeCatchingFailures ([&] { c.command (args); return 0; });\r
-\r
- if (commandIfNoOthersRecognised.isNotEmpty())\r
- for (auto& c : commands)\r
- if (compareOptionStrings (c.commandOption, commandIfNoOthersRecognised))\r
- return invokeCatchingFailures ([&] { c.command (args); return 0; });\r
-\r
- fail ("Unrecognised arguments");\r
- return 0;\r
-}\r
-\r
-int ConsoleApplication::findAndRunCommand (int argc, char* argv[]) const\r
-{\r
- return findAndRunCommand (ArgumentList (argc, argv));\r
-}\r
-\r
-void ConsoleApplication::addCommand (Command c)\r
-{\r
- commands.emplace_back (std::move (c));\r
-}\r
-\r
-void ConsoleApplication::addHelpCommand (String arg, String helpMessage, bool invokeIfNoOtherCommandRecognised)\r
-{\r
- addCommand ({ arg, arg, "Prints this message",\r
- [this, helpMessage] (const ArgumentList& args) { printHelp (helpMessage, args); }});\r
-\r
- if (invokeIfNoOtherCommandRecognised)\r
- commandIfNoOthersRecognised = arg;\r
-}\r
-\r
-void ConsoleApplication::addVersionCommand (String arg, String versionText)\r
-{\r
- addCommand ({ arg, arg, "Prints the current version number",\r
- [versionText] (const ArgumentList&)\r
- {\r
- std::cout << versionText << std::endl;\r
- }});\r
-}\r
-\r
-void ConsoleApplication::printHelp (const String& preamble, const ArgumentList& args) const\r
-{\r
- std::cout << preamble << std::endl;\r
-\r
- auto exeName = args.executableName.fromLastOccurrenceOf ("/", false, false)\r
- .fromLastOccurrenceOf ("\\", false, false);\r
-\r
- StringArray namesAndArgs;\r
- int maxLength = 0;\r
-\r
- for (auto& c : commands)\r
- {\r
- auto nameAndArgs = exeName + " " + c.argumentDescription;\r
- namesAndArgs.add (nameAndArgs);\r
- maxLength = std::max (maxLength, nameAndArgs.length());\r
- }\r
-\r
- for (size_t i = 0; i < commands.size(); ++i)\r
- std::cout << " " << namesAndArgs[(int) i].paddedRight (' ', maxLength + 2)\r
- << commands[i].commandDescription << std::endl;\r
-\r
- std::cout << std::endl;\r
-}\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- Holds a list of command-line arguments, and provides useful methods for searching\r
- and operating on them.\r
-\r
- You can create an ArgumentList manually, or give it some argv/argc values from a\r
- main() function to parse.\r
-\r
- @see ConsoleApplication\r
-*/\r
-struct ArgumentList\r
-{\r
- /** Creates an argument list for a given executable. */\r
- ArgumentList (String executable, StringArray arguments);\r
-\r
- /** Parses a standard argv/argc pair to create an argument list. */\r
- ArgumentList (int argc, char* argv[]);\r
-\r
- /** Tokenises a string containing all the arguments to create an argument list. */\r
- ArgumentList (const String& executable, const String& arguments);\r
-\r
- ArgumentList (const ArgumentList&) = default;\r
- ArgumentList& operator= (const ArgumentList&) = default;\r
-\r
- //==============================================================================\r
- /**\r
- One of the arguments in an ArgumentList.\r
- */\r
- struct Argument\r
- {\r
- /** The original text of this argument. */\r
- String text;\r
-\r
- /** Resolves this argument as an absolute File, using the current working\r
- directory as a base for resolving relative paths, and stripping quotes, etc.\r
- */\r
- File resolveAsFile() const;\r
-\r
- /** Resolves this argument as an absolute File, using the current working\r
- directory as a base for resolving relative paths, and also doing a check to\r
- make sure the file exists.\r
- If the file doesn't exist, this will call fail() with a suitable error.\r
- @see resolveAsFile, resolveAsExistingFolder\r
- */\r
- File resolveAsExistingFile() const;\r
-\r
- /** Resolves a user-supplied folder name into an absolute File, using the current working\r
- directory as a base for resolving relative paths, and also doing a check to make\r
- sure the folder exists.\r
- If the folder doesn't exist, this will call fail() with a suitable error.\r
- @see resolveAsFile, resolveAsExistingFile\r
- */\r
- File resolveAsExistingFolder() const;\r
-\r
- /** Returns true if this argument starts with a double dash. */\r
- bool isLongOption() const;\r
-\r
- /** Returns true if this argument starts with a single dash. */\r
- bool isShortOption() const;\r
-\r
- /** Returns true if this argument starts with a double dash, followed by the given string. */\r
- bool isLongOption (const String& optionRoot) const;\r
-\r
- /** Returns true if this argument starts with a single dash and then contains the given character somewhere inside it. */\r
- bool isShortOption (char shortOptionCharacter) const;\r
-\r
- /** Compares this argument against a string.\r
- The string may be a pipe-separated list of options, e.g. "--help|-h"\r
- */\r
- bool operator== (StringRef stringToCompare) const;\r
-\r
- /** Compares this argument against a string.\r
- The string may be a pipe-separated list of options, e.g. "--help|-h"\r
- */\r
- bool operator!= (StringRef stringToCompare) const;\r
- };\r
-\r
- //==============================================================================\r
- /** Returns the number of arguments in the list. */\r
- int size() const;\r
-\r
- /** Returns one of the arguments */\r
- Argument operator[] (int index) const;\r
-\r
- /** Throws an error unless there are at least the given number of arguments. */\r
- void checkMinNumArguments (int expectedMinNumberOfArgs) const;\r
-\r
- /** Returns true if the given string matches one of the arguments.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- */\r
- bool containsOption (StringRef option) const;\r
-\r
- /** Returns the index of the given string if it matches one of the arguments, or -1 if it doesn't.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- */\r
- int indexOfOption (StringRef option) const;\r
-\r
- /** Throws an error unless the given option is found in the argument list. */\r
- void failIfOptionIsMissing (StringRef option) const;\r
-\r
- /** Looks for the given argument and returns the one that follows it in the list.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- If the argument isn't found, this returns an empty string.\r
- */\r
- Argument getArgumentAfterOption (StringRef option) const;\r
-\r
- /** Looks for a given argument and tries to parse the following argument as a file.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- If the option isn't found, or if the next argument isn't a filename, it will throw\r
- an error.\r
- */\r
- File getFileAfterOption (StringRef option) const;\r
-\r
- /** Looks for a given argument and tries to parse the following argument as a file\r
- which must exist for this to succeed.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- If the option isn't found, or if the next argument isn't a filename, or if the file\r
- doesn't exist, or if it's a folder rather than a file, then it will throw a suitable error.\r
- */\r
- File getExistingFileAfterOption (StringRef option) const;\r
-\r
- /** Looks for a given argument and tries to parse the following argument as a folder\r
- which must exist for this to succeed.\r
- The option can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- If the option isn't found, or if the next argument isn't a filename, or if it doesn't\r
- point to a folder, then it will throw a suitable error.\r
- */\r
- File getExistingFolderAfterOption (StringRef option) const;\r
-\r
- /** The name or path of the executable that was invoked, as it was specified on the command-line. */\r
- String executableName;\r
-\r
- /** The list of arguments (not including the name of the executable that was invoked). */\r
- Array<Argument> arguments;\r
-};\r
-\r
-\r
-//==============================================================================\r
-/**\r
- Represents a the set of commands that a console app can perform, and provides\r
- helper functions for performing them.\r
-\r
- When using these helper classes to implement a console app, you probably want to\r
- do something along these lines:\r
-\r
- @code\r
- int main (int argc, char* argv[])\r
- {\r
- ConsoleApplication app;\r
-\r
- app.addHelpCommand ("--help|-h", "Usage:", true);\r
- app.addVersionCommand ("--version|-v", "MyApp version 1.2.3");\r
-\r
- app.addCommand ({ "--foo",\r
- "--foo filename",\r
- "Performs a foo operation on the given file",\r
- [] (const auto& args) { doFoo (args); }});\r
-\r
- return app.findAndRunCommand (argc, argv);\r
- }\r
- @endcode\r
-\r
- @see ArgumentList\r
-*/\r
-struct ConsoleApplication\r
-{\r
- //==============================================================================\r
- /**\r
- Represents a command that can be executed if its command-line arguments are matched.\r
- @see ConsoleApplication::addCommand(), ConsoleApplication::findAndRunCommand()\r
- */\r
- struct Command\r
- {\r
- /** The option string that must appear in the argument list for this command to be invoked.\r
- This can also be a list of different versions separated by pipes, e.g. "--help|-h"\r
- */\r
- String commandOption;\r
-\r
- /** A description of the command-line arguments needed for this command, which will be\r
- printed as part of the help text.\r
- */\r
- String argumentDescription;\r
-\r
- /** A description of the meaning of this command, for use in the help text. */\r
- String commandDescription;\r
-\r
- /** The actual command that should be invoked to perform this action. */\r
- std::function<void(const ArgumentList&)> command;\r
- };\r
-\r
- //==============================================================================\r
- /** Adds a command to the list. */\r
- void addCommand (Command);\r
-\r
- /** Adds a help command to the list.\r
- This command will print the user-supplied message that's passed in here as an\r
- argument, followed by a list of all the registered commands.\r
- */\r
- void addHelpCommand (String helpArgument, String helpMessage,\r
- bool invokeIfNoOtherCommandRecognised);\r
-\r
- /** Adds a command that will print the given text in response to the "--version" option. */\r
- void addVersionCommand (String versionArgument, String versionText);\r
-\r
- //==============================================================================\r
- /** Throws a failure exception to cause a command-line app to terminate.\r
- This is intended to be called from code in a Command, so that the\r
- exception will be automatically caught and turned into a printed error message\r
- and a return code which will be returned from main().\r
- @see ConsoleApplication::invokeCatchingFailures()\r
- */\r
- static void fail (String errorMessage, int returnCode = 1);\r
-\r
- /** Invokes a function, catching any fail() calls that it might trigger, and handling\r
- them by printing their error message and returning their error code.\r
- @see ConsoleApplication::fail()\r
- */\r
- static int invokeCatchingFailures (std::function<int()>&& functionToCall);\r
-\r
- //==============================================================================\r
- /** Looks for the first command in the list which matches the given arguments, and\r
- tries to invoke it.\r
-\r
- If no command is found, it prints a help message listing the available commands.\r
- If the command calls the fail() function, this will throw an exception that gets\r
- automatically caught and handled, and this method will return the error code that\r
- was passed into the fail() call.\r
- */\r
- int findAndRunCommand (const ArgumentList&) const;\r
-\r
- /** Creates an ArgumentList object from the argc and argv variablrs, and invokes\r
- findAndRunCommand() using it.\r
- */\r
- int findAndRunCommand (int argc, char* argv[]) const;\r
-\r
-private:\r
- //==============================================================================\r
- std::vector<Command> commands;\r
- String commandIfNoOthersRecognised;\r
-\r
- void printHelp (const String& preamble, const ArgumentList&) const;\r
-};\r
-\r
-} // namespace juce\r
\r
//==============================================================================\r
/** Function type of runtime permission request callbacks. */\r
- using Callback = std::function<void (bool)>;\r
+ typedef std::function<void (bool)> Callback;\r
\r
//==============================================================================\r
/** Call this method to request a runtime permission.\r
\r
struct FunctionObject\r
{\r
- FunctionObject() = default;\r
+ FunctionObject() {}\r
\r
FunctionObject (const FunctionObject& other)\r
{\r
int operator()(int i) const { return bigData->sum() + i; }\r
\r
std::unique_ptr<BigData> bigData { new BigData() };\r
-\r
- JUCE_LEAK_DETECTOR (FunctionObject)\r
- };\r
-\r
- struct BigFunctionObject\r
- {\r
- BigFunctionObject() = default;\r
-\r
- BigFunctionObject (const BigFunctionObject& other)\r
- {\r
- bigData.reset (new BigData (*other.bigData));\r
- }\r
-\r
- int operator()(int i) const { return bigData->sum() + i; }\r
-\r
- std::unique_ptr<BigData> bigData { new BigData() };\r
-\r
- int stackUsage[32];\r
-\r
- JUCE_LEAK_DETECTOR (BigFunctionObject)\r
};\r
}\r
\r
\r
std::function<double(double, double)> f2 (FunctionTestsHelpers::multiply);\r
expectEquals (6.0, f2 (2.0, 3.0));\r
+\r
}\r
\r
{\r
beginTest ("Function objects");\r
-\r
std::function<int(int)> f1 = FunctionTestsHelpers::FunctionObject();\r
expectEquals (f1 (5), FunctionTestsHelpers::BigData::bigDataSum + 5);\r
-\r
- std::function<int(int)> f2 { FunctionTestsHelpers::BigFunctionObject() };\r
- expectEquals (f2 (5), FunctionTestsHelpers::BigData::bigDataSum + 5);\r
}\r
\r
{\r
/** Creates an empty function. */\r
function (decltype (nullptr)) noexcept {}\r
\r
- /** Creates a function targeting the provided Functor. */\r
+ /** Creates a function targetting the provided Functor. */\r
template <typename Functor>\r
function (Functor f)\r
{\r
{\r
if (functorHolderHelper != nullptr)\r
{\r
- functorHolderHelper->~FunctorHolderBase<Result, Arguments...>();\r
+ if (functorHolderHelper->getSize() > functorHolderStackSize)\r
+ delete[] reinterpret_cast<char*> (functorHolderHelper);\r
+ else\r
+ functorHolderHelper->~FunctorHolderBase<Result, Arguments...>();\r
+\r
functorHolderHelper = nullptr;\r
}\r
}\r
+++ /dev/null
-$$VideoApi21\r
- //==============================================================================\r
- public class MediaControllerCallback extends MediaController.Callback\r
- {\r
- private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);\r
- private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);\r
- private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);\r
- private native void mediaControllerSessionDestroyed (long host);\r
-\r
- MediaControllerCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onAudioInfoChanged (MediaController.PlaybackInfo info)\r
- {\r
- mediaControllerAudioInfoChanged (host, info);\r
- }\r
-\r
- @Override\r
- public void onMetadataChanged (MediaMetadata metadata)\r
- {\r
- mediaControllerMetadataChanged (host, metadata);\r
- }\r
-\r
- @Override\r
- public void onPlaybackStateChanged (PlaybackState state)\r
- {\r
- mediaControllerPlaybackStateChanged (host, state);\r
- }\r
-\r
- @Override\r
- public void onQueueChanged (List<MediaSession.QueueItem> queue) {}\r
-\r
- @Override\r
- public void onSessionDestroyed()\r
- {\r
- mediaControllerSessionDestroyed (host);\r
- }\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class MediaSessionCallback extends MediaSession.Callback\r
- {\r
- private native void mediaSessionPause (long host);\r
- private native void mediaSessionPlay (long host);\r
- private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);\r
- private native void mediaSessionSeekTo (long host, long pos);\r
- private native void mediaSessionStop (long host);\r
-\r
-\r
- MediaSessionCallback (long hostToUse)\r
- {\r
- host = hostToUse;\r
- }\r
-\r
- @Override\r
- public void onPause()\r
- {\r
- mediaSessionPause (host);\r
- }\r
-\r
- @Override\r
- public void onPlay()\r
- {\r
- mediaSessionPlay (host);\r
- }\r
-\r
- @Override\r
- public void onPlayFromMediaId (String mediaId, Bundle extras)\r
- {\r
- mediaSessionPlayFromMediaId (host, mediaId, extras);\r
- }\r
-\r
- @Override\r
- public void onSeekTo (long pos)\r
- {\r
- mediaSessionSeekTo (host, pos);\r
- }\r
-\r
- @Override\r
- public void onStop()\r
- {\r
- mediaSessionStop (host);\r
- }\r
-\r
- @Override\r
- public void onFastForward() {}\r
-\r
- @Override\r
- public boolean onMediaButtonEvent (Intent mediaButtonIntent)\r
- {\r
- return true;\r
- }\r
-\r
- @Override\r
- public void onRewind() {}\r
-\r
- @Override\r
- public void onSkipToNext() {}\r
-\r
- @Override\r
- public void onSkipToPrevious() {}\r
-\r
- @Override\r
- public void onSkipToQueueItem (long id) {}\r
-\r
- private long host;\r
- }\r
-\r
- //==============================================================================\r
- public class SystemVolumeObserver extends ContentObserver\r
- {\r
- private native void mediaSessionSystemVolumeChanged (long host);\r
-\r
- SystemVolumeObserver (Activity activityToUse, long hostToUse)\r
- {\r
- super (null);\r
-\r
- activity = activityToUse;\r
- host = hostToUse;\r
- }\r
-\r
- void setEnabled (boolean shouldBeEnabled)\r
- {\r
- if (shouldBeEnabled)\r
- activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);\r
- else\r
- activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);\r
- }\r
-\r
- @Override\r
- public void onChange (boolean selfChange, Uri uri)\r
- {\r
- if (uri.toString().startsWith ("content://settings/system/volume_music"))\r
- mediaSessionSystemVolumeChanged (host);\r
- }\r
-\r
- private Activity activity;\r
- private long host;\r
- }\r
-\r
-VideoApi21$$\r
import android.content.pm.PackageInfo;\r
import android.content.pm.PackageManager;\r
$$JuceAndroidCameraImports$$ // If you get an error here, you need to re-save your project with the Projucer!\r
-$$JuceAndroidVideoImports$$ // If you get an error here, you need to re-save your project with the Projucer!\r
import android.net.http.SslError;\r
import android.net.Uri;\r
import android.os.Bundle;\r
//==============================================================================\r
public boolean isPermissionDeclaredInManifest (int permissionID)\r
{\r
- return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));\r
- }\r
+ String permissionToCheck = getAndroidPermissionName(permissionID);\r
\r
- public boolean isPermissionDeclaredInManifest (String permissionToCheck)\r
- {\r
try\r
{\r
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);\r
public final String getClipboardContent()\r
{\r
ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);\r
-\r
- CharSequence content = clipboard.getText();\r
- return content != null ? content.toString() : new String();\r
+ return clipboard.getText().toString();\r
}\r
\r
public final void setClipboardContent (String newText)\r
implements SurfaceHolder.Callback\r
{\r
private long nativeContext = 0;\r
- private boolean forVideo;\r
\r
- NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)\r
+ NativeSurfaceView (Context context, long nativeContextPtr)\r
{\r
super (context);\r
nativeContext = nativeContextPtr;\r
- forVideo = createdForVideo;\r
}\r
\r
public Surface getNativeSurface()\r
@Override\r
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)\r
{\r
- if (forVideo)\r
- surfaceChangedNativeVideo (nativeContext, holder, format, width, height);\r
- else\r
- surfaceChangedNative (nativeContext, holder, format, width, height);\r
+ surfaceChangedNative (nativeContext, holder, format, width, height);\r
}\r
\r
@Override\r
public void surfaceCreated (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceCreatedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceCreatedNative (nativeContext, holder);\r
+ surfaceCreatedNative (nativeContext, holder);\r
}\r
\r
@Override\r
public void surfaceDestroyed (SurfaceHolder holder)\r
{\r
- if (forVideo)\r
- surfaceDestroyedNativeVideo (nativeContext, holder);\r
- else\r
- surfaceDestroyedNative (nativeContext, holder);\r
+ surfaceDestroyedNative (nativeContext, holder);\r
}\r
\r
@Override\r
protected void dispatchDraw (Canvas canvas)\r
{\r
super.dispatchDraw (canvas);\r
-\r
- if (forVideo)\r
- dispatchDrawNativeVideo (nativeContext, canvas);\r
- else\r
- dispatchDrawNative (nativeContext, canvas);\r
+ dispatchDrawNative (nativeContext, canvas);\r
}\r
\r
//==============================================================================\r
@Override\r
- protected void onAttachedToWindow()\r
+ protected void onAttachedToWindow ()\r
{\r
super.onAttachedToWindow();\r
getHolder().addCallback (this);\r
}\r
\r
@Override\r
- protected void onDetachedFromWindow()\r
+ protected void onDetachedFromWindow ()\r
{\r
super.onDetachedFromWindow();\r
getHolder().removeCallback (this);\r
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);\r
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,\r
int format, int width, int height);\r
-\r
- private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);\r
- private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);\r
- private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,\r
- int format, int width, int height);\r
}\r
\r
- public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)\r
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)\r
{\r
- return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);\r
+ return new NativeSurfaceView (this, nativeSurfacePtr);\r
}\r
\r
//==============================================================================\r
}\r
\r
$$JuceAndroidCameraCode$$ // If you get an error here, you need to re-save your project with the Projucer!\r
- $$JuceAndroidVideoCode$$ // If you get an error here, you need to re-save your project with the Projucer!\r
\r
//==============================================================================\r
public static final String getLocaleValue (boolean isRegion)\r
METHOD (disconnect, "disconnect", "()V") \\r
METHOD (scanFile, "scanFile", "(Ljava/lang/String;Ljava/lang/String;)V") \\r
\r
-DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection")\r
+DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (openInputStream, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;") \\r
METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;")\r
\r
-DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver")\r
+DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getString, "getString", "(I)Ljava/lang/String;") \\r
METHOD (close, "close", "()V") \\r
\r
-DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor")\r
+DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (getExternalStorageDirectory, "getExternalStorageDirectory", "()Ljava/io/File;") \\r
STATICMETHOD (getExternalStoragePublicDirectory, "getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;") \\r
\r
-DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment")\r
+DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (flush, "flush", "()V") \\r
METHOD (write, "write", "([BII)V")\r
\r
-DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream")\r
+DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
uri.get(), projection.get(), jSelection.get(),\r
args.get(), nullptr));\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
- {\r
- // An exception has occurred, have you acquired RuntimePermission::readExternalStorage permission?\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
if (cursor)\r
{\r
if (env->CallBooleanMethod (cursor.get(), AndroidCursor.moveToFirst) != 0)\r
uri.get(), projection.get(), nullptr,\r
nullptr, nullptr));\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
- {\r
- // An exception has occurred, have you acquired RuntimePermission::readExternalStorage permission?\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
if (cursor == 0)\r
return {};\r
\r
\r
//==============================================================================\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (createNewView, "createNewView", "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \\r
- METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \\r
- METHOD (createNativeSurfaceView, "createNativeSurfaceView", "(JZ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$NativeSurfaceView;") \\r
- METHOD (finish, "finish", "()V") \\r
- METHOD (getWindowManager, "getWindowManager", "()Landroid/view/WindowManager;") \\r
- METHOD (setRequestedOrientation, "setRequestedOrientation", "(I)V") \\r
- METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \\r
- METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \\r
- METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \\r
- METHOD (renderGlyph, "renderGlyph", "(CCLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \\r
- STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \\r
- METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \\r
- METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
- METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V") \\r
- METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
- STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \\r
- STATICMETHOD (getDocumentsFolder, "getDocumentsFolder", "()Ljava/lang/String;") \\r
- STATICMETHOD (getPicturesFolder, "getPicturesFolder", "()Ljava/lang/String;") \\r
- STATICMETHOD (getMusicFolder, "getMusicFolder", "()Ljava/lang/String;") \\r
- STATICMETHOD (getDownloadsFolder, "getDownloadsFolder", "()Ljava/lang/String;") \\r
- STATICMETHOD (getMoviesFolder, "getMoviesFolder", "()Ljava/lang/String;") \\r
- METHOD (getTypeFaceFromAsset, "getTypeFaceFromAsset", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
- METHOD (getTypeFaceFromByteArray, "getTypeFaceFromByteArray", "([B)Landroid/graphics/Typeface;") \\r
- METHOD (setScreenSaver, "setScreenSaver", "(Z)V") \\r
- METHOD (getScreenSaver, "getScreenSaver", "()Z") \\r
- METHOD (getAndroidMidiDeviceManager, "getAndroidMidiDeviceManager", "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$MidiDeviceManager;") \\r
- METHOD (getAndroidBluetoothManager, "getAndroidBluetoothManager", "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager;") \\r
- STATICMETHOD (getAndroidSDKVersion, "getAndroidSDKVersion", "()I") \\r
- METHOD (audioManagerGetProperty, "audioManagerGetProperty", "(Ljava/lang/String;)Ljava/lang/String;") \\r
- METHOD (hasSystemFeature, "hasSystemFeature", "(Ljava/lang/String;)Z" ) \\r
- METHOD (requestRuntimePermission, "requestRuntimePermission", "(IJ)V" ) \\r
- METHOD (isPermissionGranted, "isPermissionGranted", "(I)Z" ) \\r
- METHOD (isPermissionDeclaredInManifest, "isPermissionDeclaredInManifest", "(I)Z" ) \\r
- METHOD (isPermissionDeclaredInManifestString, "isPermissionDeclaredInManifest", "(Ljava/lang/String;)Z") \\r
- METHOD (getAssets, "getAssets", "()Landroid/content/res/AssetManager;") \\r
- METHOD (getSystemService, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;") \\r
- METHOD (getPackageManager, "getPackageManager", "()Landroid/content/pm/PackageManager;") \\r
- METHOD (getPackageName, "getPackageName", "()Ljava/lang/String;") \\r
- METHOD (getResources, "getResources", "()Landroid/content/res/Resources;") \\r
- METHOD (createInvocationHandler, "createInvocationHandler", "(J)Ljava/lang/reflect/InvocationHandler;") \\r
- METHOD (invocationHandlerContextDeleted, "invocationHandlerContextDeleted", "(Ljava/lang/reflect/InvocationHandler;)V") \\r
- METHOD (bindService, "bindService", "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z") \\r
- METHOD (unbindService, "unbindService", "(Landroid/content/ServiceConnection;)V") \\r
- METHOD (startIntentSenderForResult, "startIntentSenderForResult", "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V") \\r
- METHOD (moveTaskToBack, "moveTaskToBack", "(Z)Z") \\r
- METHOD (startActivity, "startActivity", "(Landroid/content/Intent;)V") \\r
- METHOD (startActivityForResult, "startActivityForResult", "(Landroid/content/Intent;I)V") \\r
- METHOD (getContentResolver, "getContentResolver", "()Landroid/content/ContentResolver;") \\r
- METHOD (addAppPausedResumedListener, "addAppPausedResumedListener", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V") \\r
- METHOD (removeAppPausedResumedListener, "removeAppPausedResumedListener", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V")\r
-\r
-DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH)\r
+ METHOD (createNewView, "createNewView", "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \\r
+ METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \\r
+ METHOD (createNativeSurfaceView, "createNativeSurfaceView", "(J)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$NativeSurfaceView;") \\r
+ METHOD (finish, "finish", "()V") \\r
+ METHOD (getWindowManager, "getWindowManager", "()Landroid/view/WindowManager;") \\r
+ METHOD (setRequestedOrientation, "setRequestedOrientation", "(I)V") \\r
+ METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \\r
+ METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \\r
+ METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \\r
+ METHOD (renderGlyph, "renderGlyph", "(CCLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \\r
+ STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \\r
+ METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \\r
+ METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
+ METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V") \\r
+ METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \\r
+ STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \\r
+ STATICMETHOD (getDocumentsFolder, "getDocumentsFolder", "()Ljava/lang/String;") \\r
+ STATICMETHOD (getPicturesFolder, "getPicturesFolder", "()Ljava/lang/String;") \\r
+ STATICMETHOD (getMusicFolder, "getMusicFolder", "()Ljava/lang/String;") \\r
+ STATICMETHOD (getDownloadsFolder, "getDownloadsFolder", "()Ljava/lang/String;") \\r
+ STATICMETHOD (getMoviesFolder, "getMoviesFolder", "()Ljava/lang/String;") \\r
+ METHOD (getTypeFaceFromAsset, "getTypeFaceFromAsset", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
+ METHOD (getTypeFaceFromByteArray, "getTypeFaceFromByteArray", "([B)Landroid/graphics/Typeface;") \\r
+ METHOD (setScreenSaver, "setScreenSaver", "(Z)V") \\r
+ METHOD (getScreenSaver, "getScreenSaver", "()Z") \\r
+ METHOD (getAndroidMidiDeviceManager, "getAndroidMidiDeviceManager", "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$MidiDeviceManager;") \\r
+ METHOD (getAndroidBluetoothManager, "getAndroidBluetoothManager", "()L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$BluetoothManager;") \\r
+ STATICMETHOD (getAndroidSDKVersion, "getAndroidSDKVersion", "()I") \\r
+ METHOD (audioManagerGetProperty, "audioManagerGetProperty", "(Ljava/lang/String;)Ljava/lang/String;") \\r
+ METHOD (hasSystemFeature, "hasSystemFeature", "(Ljava/lang/String;)Z" ) \\r
+ METHOD (requestRuntimePermission, "requestRuntimePermission", "(IJ)V" ) \\r
+ METHOD (isPermissionGranted, "isPermissionGranted", "(I)Z" ) \\r
+ METHOD (isPermissionDeclaredInManifest, "isPermissionDeclaredInManifest", "(I)Z" ) \\r
+ METHOD (getAssets, "getAssets", "()Landroid/content/res/AssetManager;") \\r
+ METHOD (getSystemService, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;") \\r
+ METHOD (getPackageManager, "getPackageManager", "()Landroid/content/pm/PackageManager;") \\r
+ METHOD (getPackageName, "getPackageName", "()Ljava/lang/String;") \\r
+ METHOD (getResources, "getResources", "()Landroid/content/res/Resources;") \\r
+ METHOD (createInvocationHandler, "createInvocationHandler", "(J)Ljava/lang/reflect/InvocationHandler;") \\r
+ METHOD (invocationHandlerContextDeleted, "invocationHandlerContextDeleted", "(Ljava/lang/reflect/InvocationHandler;)V") \\r
+ METHOD (bindService, "bindService", "(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z") \\r
+ METHOD (unbindService, "unbindService", "(Landroid/content/ServiceConnection;)V") \\r
+ METHOD (startIntentSenderForResult, "startIntentSenderForResult", "(Landroid/content/IntentSender;ILandroid/content/Intent;III)V") \\r
+ METHOD (moveTaskToBack, "moveTaskToBack", "(Z)Z") \\r
+ METHOD (startActivity, "startActivity", "(Landroid/content/Intent;)V") \\r
+ METHOD (startActivityForResult, "startActivityForResult", "(Landroid/content/Intent;I)V") \\r
+ METHOD (getContentResolver, "getContentResolver", "()Landroid/content/ContentResolver;") \\r
+ METHOD (addAppPausedResumedListener, "addAppPausedResumedListener", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V") \\r
+ METHOD (removeAppPausedResumedListener, "removeAppPausedResumedListener", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener;J)V")\r
+\r
+DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH);\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
-#if __ANDROID_API__ >= 21\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (build, "build", "()Landroid/media/AudioAttributes;") \\r
- METHOD (constructor, "<init>", "()V") \\r
- METHOD (setContentType, "setContentType", "(I)Landroid/media/AudioAttributes$Builder;") \\r
- METHOD (setUsage, "setUsage", "(I)Landroid/media/AudioAttributes$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidAudioAttributesBuilder, "android/media/AudioAttributes$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-#endif\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (abandonAudioFocus, "abandonAudioFocus", "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I") \\r
- METHOD (requestAudioFocus, "requestAudioFocus", "(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I")\r
-\r
-DECLARE_JNI_CLASS (AndroidAudioManager, "android/media/AudioManager")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (createBitmap, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;") \\r
STATICMETHOD (createBitmapFrom, "createBitmap", "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;") \\r
METHOD (recycle, "recycle", "()V") \\r
METHOD (setPixel, "setPixel", "(III)V")\r
\r
-DECLARE_JNI_CLASS (AndroidBitmap, "android/graphics/Bitmap")\r
+DECLARE_JNI_CLASS (AndroidBitmap, "android/graphics/Bitmap");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;")\r
\r
-DECLARE_JNI_CLASS (AndroidBitmapConfig, "android/graphics/Bitmap$Config")\r
+DECLARE_JNI_CLASS (AndroidBitmapConfig, "android/graphics/Bitmap$Config");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (decodeByteArray, "decodeByteArray", "([BII)Landroid/graphics/Bitmap;")\r
\r
-DECLARE_JNI_CLASS (AndroidBitmapFactory, "android/graphics/BitmapFactory")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "()V") \\r
- METHOD (containsKey, "containsKey", "(Ljava/lang/String;)Z") \\r
- METHOD (get, "get", "(Ljava/lang/String;)Ljava/lang/Object;") \\r
- METHOD (getBoolean, "getBoolean", "(Ljava/lang/String;)Z") \\r
- METHOD (getBundle, "getBundle", "(Ljava/lang/String;)Landroid/os/Bundle;") \\r
- METHOD (getCharSequence, "getCharSequence", "(Ljava/lang/String;)Ljava/lang/CharSequence;") \\r
- METHOD (getInt, "getInt", "(Ljava/lang/String;)I") \\r
- METHOD (getLong, "getLong", "(Ljava/lang/String;)J") \\r
- METHOD (getLongArray, "getLongArray", "(Ljava/lang/String;)[J") \\r
- METHOD (getParcelable, "getParcelable", "(Ljava/lang/String;)Landroid/os/Parcelable;") \\r
- METHOD (getString, "getString", "(Ljava/lang/String;)Ljava/lang/String;") \\r
- METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \\r
- METHOD (keySet, "keySet", "()Ljava/util/Set;") \\r
- METHOD (putBoolean, "putBoolean", "(Ljava/lang/String;Z)V") \\r
- METHOD (putBundle, "putBundle", "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
- METHOD (putFloat, "putFloat", "(Ljava/lang/String;F)V") \\r
- METHOD (putInt, "putInt", "(Ljava/lang/String;I)V") \\r
- METHOD (putLong, "putLong", "(Ljava/lang/String;J)V") \\r
- METHOD (putLongArray, "putLongArray", "(Ljava/lang/String;[J)V") \\r
- METHOD (putString, "putString", "(Ljava/lang/String;Ljava/lang/String;)V") \\r
- METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidBundle, "android/os/Bundle")\r
+DECLARE_JNI_CLASS (AndroidBitmapFactory, "android/graphics/BitmapFactory");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (dumpReferenceTables, "dumpReferenceTables", "()V")\r
\r
- DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug")\r
+ DECLARE_JNI_CLASS (AndroidDebug, "android/os/Debug");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JUCE_LOG_JNI_REFERENCES_TABLE getEnv()->CallStaticVoidMethod (AndroidDebug, AndroidDebug.dumpReferenceTables);\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getRotation, "getRotation", "()I")\r
\r
-DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display")\r
+DECLARE_JNI_CLASS (AndroidDisplay, "android/view/Display");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (post, "post", "(Ljava/lang/Runnable;)Z") \\r
METHOD (postDelayed, "postDelayed", "(Ljava/lang/Runnable;J)Z") \\r
\r
-DECLARE_JNI_CLASS (AndroidHandler, "android/os/Handler")\r
+DECLARE_JNI_CLASS (AndroidHandler, "android/os/Handler");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (quitSafely, "quitSafely", "()Z") \\r
METHOD (start, "start", "()V")\r
\r
-DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread")\r
+DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setPackage, "setPackage", "(Ljava/lang/String;)Landroid/content/Intent;") \\r
METHOD (setType, "setType", "(Ljava/lang/String;)Landroid/content/Intent;") \\r
\r
-DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent")\r
+DECLARE_JNI_CLASS (AndroidIntent, "android/content/Intent");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (postTranslate, "postTranslate", "(FF)Z") \\r
METHOD (setValues, "setValues", "([F)V")\r
\r
-DECLARE_JNI_CLASS (AndroidMatrix, "android/graphics/Matrix")\r
+DECLARE_JNI_CLASS (AndroidMatrix, "android/graphics/Matrix");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getPackageInfo, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;")\r
\r
-DECLARE_JNI_CLASS (AndroidPackageManager, "android/content/pm/PackageManager")\r
+DECLARE_JNI_CLASS (AndroidPackageManager, "android/content/pm/PackageManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \\r
METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \\r
\r
-DECLARE_JNI_CLASS (AndroidPaint, "android/graphics/Paint")\r
+DECLARE_JNI_CLASS (AndroidPaint, "android/graphics/Paint");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (getActivity, "getActivity", "(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;") \\r
METHOD (getIntentSender, "getIntentSender", "()Landroid/content/IntentSender;")\r
\r
-DECLARE_JNI_CLASS (AndroidPendingIntent, "android/app/PendingIntent")\r
+DECLARE_JNI_CLASS (AndroidPendingIntent, "android/app/PendingIntent");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (toString, "toString", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (AndroidRange, "android/util/Range")\r
+DECLARE_JNI_CLASS (AndroidRange, "android/util/Range");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
FIELD (top, "top", "I") \\r
FIELD (bottom, "bottom", "I") \\r
\r
-DECLARE_JNI_CLASS (AndroidRect, "android/graphics/Rect")\r
+DECLARE_JNI_CLASS (AndroidRect, "android/graphics/Rect");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getHeight, "getHeight", "()I") \\r
METHOD (getWidth, "getWidth", "()I")\r
\r
-DECLARE_JNI_CLASS (AndroidSize, "android/util/Size")\r
+DECLARE_JNI_CLASS (AndroidSize, "android/util/Size");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (parse, "parse", "(Ljava/lang/String;)Landroid/net/Uri;") \\r
METHOD (toString, "toString", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri")\r
+DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (invalidate, "invalidate", "(IIII)V") \\r
METHOD (setVisibility, "setVisibility", "(I)V")\r
\r
-DECLARE_JNI_CLASS (AndroidView, "android/view/View")\r
+DECLARE_JNI_CLASS (AndroidView, "android/view/View");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getDefaultDisplay, "getDefaultDisplay", "()Landroid/view/Display;")\r
\r
-DECLARE_JNI_CLASS (AndroidWindowManager, "android/view/WindowManager")\r
+DECLARE_JNI_CLASS (AndroidWindowManager, "android/view/WindowManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
METHOD (get, "get", "(I)Ljava/lang/Object;") \\r
METHOD (size, "size", "()I")\r
\r
-DECLARE_JNI_CLASS (JavaArrayList, "java/util/ArrayList")\r
+DECLARE_JNI_CLASS (JavaArrayList, "java/util/ArrayList");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (valueOf, "valueOf", "(Z)Ljava/lang/Boolean;") \\r
METHOD (booleanValue, "booleanValue", "()Z")\r
\r
-DECLARE_JNI_CLASS (JavaBoolean, "java/lang/Boolean")\r
+DECLARE_JNI_CLASS (JavaBoolean, "java/lang/Boolean");\r
+#undef JNI_CLASS_MEMBERS\r
+\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
+ METHOD (constructor, "<init>", "()V") \\r
+ METHOD (containsKey, "containsKey", "(Ljava/lang/String;)Z") \\r
+ METHOD (get, "get", "(Ljava/lang/String;)Ljava/lang/Object;") \\r
+ METHOD (getBoolean, "getBoolean", "(Ljava/lang/String;)Z") \\r
+ METHOD (getBundle, "getBundle", "(Ljava/lang/String;)Landroid/os/Bundle;") \\r
+ METHOD (getCharSequence, "getCharSequence", "(Ljava/lang/String;)Ljava/lang/CharSequence;") \\r
+ METHOD (getInt, "getInt", "(Ljava/lang/String;)I") \\r
+ METHOD (getLong, "getLong", "(Ljava/lang/String;)J") \\r
+ METHOD (getLongArray, "getLongArray", "(Ljava/lang/String;)[J") \\r
+ METHOD (getParcelable, "getParcelable", "(Ljava/lang/String;)Landroid/os/Parcelable;") \\r
+ METHOD (getString, "getString", "(Ljava/lang/String;)Ljava/lang/String;") \\r
+ METHOD (getStringArrayList, "getStringArrayList", "(Ljava/lang/String;)Ljava/util/ArrayList;") \\r
+ METHOD (keySet, "keySet", "()Ljava/util/Set;") \\r
+ METHOD (putBoolean, "putBoolean", "(Ljava/lang/String;Z)V") \\r
+ METHOD (putBundle, "putBundle", "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
+ METHOD (putInt, "putInt", "(Ljava/lang/String;I)V") \\r
+ METHOD (putLong, "putLong", "(Ljava/lang/String;J)V") \\r
+ METHOD (putLongArray, "putLongArray", "(Ljava/lang/String;[J)V") \\r
+ METHOD (putString, "putString", "(Ljava/lang/String;Ljava/lang/String;)V") \\r
+ METHOD (putStringArrayList, "putStringArrayList", "(Ljava/lang/String;Ljava/util/ArrayList;)V")\r
+\r
+DECLARE_JNI_CLASS (JavaBundle, "android/os/Bundle");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (get, "get", "([B)Ljava/nio/ByteBuffer;") \\r
METHOD (remaining, "remaining", "()I")\r
\r
-DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer")\r
+DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (toString, "toString", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence")\r
+DECLARE_JNI_CLASS (JavaCharSequence, "java/lang/CharSequence");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getSuperclass, "getSuperclass", "()Ljava/lang/Class;") \\r
METHOD (getClassLoader, "getClassLoader", "()Ljava/lang/ClassLoader;") \\r
\r
-DECLARE_JNI_CLASS (JavaClass, "java/lang/Class")\r
+DECLARE_JNI_CLASS (JavaClass, "java/lang/Class");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (toString, "toString", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (JavaEnum, "java/lang/Enum")\r
+DECLARE_JNI_CLASS (JavaEnum, "java/lang/Enum");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getAbsolutePath, "getAbsolutePath", "()Ljava/lang/String;") \\r
METHOD (length, "length", "()J")\r
\r
-DECLARE_JNI_CLASS (JavaFile, "java/io/File")\r
+DECLARE_JNI_CLASS (JavaFile, "java/io/File");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (close, "close", "()V") \\r
METHOD (read, "read", "([B)I")\r
\r
-DECLARE_JNI_CLASS (JavaFileInputStream, "java/io/FileInputStream")\r
+DECLARE_JNI_CLASS (JavaFileInputStream, "java/io/FileInputStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (close, "close", "()V") \\r
METHOD (write, "write", "([BII)V")\r
\r
-DECLARE_JNI_CLASS (JavaFileOutputStream, "java/io/FileOutputStream")\r
+DECLARE_JNI_CLASS (JavaFileOutputStream, "java/io/FileOutputStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "()V") \\r
METHOD (constructorWithCapacity, "<init>", "(I)V")\r
\r
-DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap")\r
+DECLARE_JNI_CLASS (JavaHashMap, "java/util/HashMap");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (valueOf, "valueOf", "(I)Ljava/lang/Integer;") \\r
METHOD (intValue, "intValue", "()I")\r
\r
-DECLARE_JNI_CLASS (JavaInteger, "java/lang/Integer")\r
+DECLARE_JNI_CLASS (JavaInteger, "java/lang/Integer");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (hasNext, "hasNext", "()Z") \\r
METHOD (next, "next", "()Ljava/lang/Object;")\r
\r
-DECLARE_JNI_CLASS (JavaIterator, "java/util/Iterator")\r
+DECLARE_JNI_CLASS (JavaIterator, "java/util/Iterator");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (get, "get", "(I)Ljava/lang/Object;") \\r
METHOD (size, "size", "()I")\r
\r
-DECLARE_JNI_CLASS (JavaList, "java/util/List")\r
+DECLARE_JNI_CLASS (JavaList, "java/util/List");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(J)V")\r
\r
-DECLARE_JNI_CLASS (JavaLong, "java/lang/Long")\r
+DECLARE_JNI_CLASS (JavaLong, "java/lang/Long");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (keySet, "keySet", "()Ljava/util/Set;") \\r
METHOD (put, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")\r
\r
-DECLARE_JNI_CLASS (JavaMap, "java/util/Map")\r
+DECLARE_JNI_CLASS (JavaMap, "java/util/Map");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (hashCode, "hashCode", "()I") \\r
METHOD (equals, "equals", "(Ljava/lang/Object;)Z") \\r
\r
-DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method")\r
+DECLARE_JNI_CLASS (JavaMethod, "java/lang/reflect/Method");\r
#undef JNI_CLASS_MEMBERS\r
\r
\r
METHOD (getClass, "getClass", "()Ljava/lang/Class;") \\r
METHOD (toString, "toString", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (JavaObject, "java/lang/Object")\r
+DECLARE_JNI_CLASS (JavaObject, "java/lang/Object");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (iterator, "iterator", "()Ljava/util/Iterator;") \\r
METHOD (size, "size", "()I")\r
\r
-DECLARE_JNI_CLASS (JavaSet, "java/util/Set")\r
+DECLARE_JNI_CLASS (JavaSet, "java/util/Set");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (concat, "concat", "(Ljava/lang/String;)Ljava/lang/String;") \\r
METHOD (getBytes, "getBytes", "()[B")\r
\r
-DECLARE_JNI_CLASS (JavaString, "java/lang/String")\r
+DECLARE_JNI_CLASS (JavaString, "java/lang/String");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
\r
return result;\r
}\r
-\r
- inline bool jniCheckHasExceptionOccurredAndClear()\r
- {\r
- auto* env = getEnv();\r
-\r
- LocalRef<jobject> exception (env->ExceptionOccurred());\r
-\r
- if (exception != nullptr)\r
- {\r
- env->ExceptionClear();\r
- return true;\r
- }\r
-\r
- return false;\r
- }\r
}\r
\r
//==============================================================================\r
LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,\r
const String& interfaceName);\r
\r
-//==============================================================================\r
-class AppPausedResumedListener : public AndroidInterfaceImplementer\r
-{\r
-public:\r
- struct Owner\r
- {\r
- virtual ~Owner() {}\r
-\r
- virtual void appPaused() = 0;\r
- virtual void appResumed() = 0;\r
- };\r
-\r
- AppPausedResumedListener (Owner&);\r
-\r
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override;\r
-\r
-private:\r
- Owner& owner;\r
-};\r
-\r
} // namespace juce\r
METHOD (constructor, "<init>", "()V") \\r
METHOD (toString, "toString", "()Ljava/lang/String;") \\r
\r
-DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer")\r
+DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
METHOD (isExhausted, "isExhausted", "()Z") \\r
METHOD (setPosition, "setPosition", "(J)Z") \\r
\r
-DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream")\r
+DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
METHOD (close, "close", "()V") \\r
METHOD (read, "read", "([BII)I") \\r
\r
-DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream")\r
+DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
-#if __ANDROID_API__ < 24 // Android support for getifadds was added in Android 7.0 (API 24) so the posix implementation does not apply\r
-\r
-static IPAddress makeAddress (const sockaddr_in *addr_in)\r
+static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& result)\r
{\r
- if (addr_in->sin_addr.s_addr == INADDR_NONE)\r
- return {};\r
+ in_addr_t addr = addr_in->sin_addr.s_addr;\r
\r
- return IPAddress (ntohl (addr_in->sin_addr.s_addr));\r
+ if (addr != INADDR_NONE)\r
+ result.addIfNotAlreadyThere (IPAddress (ntohl (addr)));\r
}\r
\r
-struct InterfaceInfo\r
-{\r
- IPAddress interfaceAddress, broadcastAddress;\r
-};\r
-\r
-static Array<InterfaceInfo> findIPAddresses (int dummySocket)\r
+static void findIPAddresses (int sock, Array<IPAddress>& result)\r
{\r
ifconf cfg;\r
HeapBlock<char> buffer;\r
cfg.ifc_len = bufferSize;\r
cfg.ifc_buf = buffer;\r
\r
- if (ioctl (dummySocket, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL)\r
- return {};\r
+ if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL)\r
+ return;\r
\r
} while (bufferSize < cfg.ifc_len + 2 * (int) (IFNAMSIZ + sizeof (struct sockaddr_in6)));\r
\r
- Array<InterfaceInfo> result;\r
+ #if JUCE_MAC || JUCE_IOS\r
+ while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in)))\r
+ {\r
+ if (cfg.ifc_req->ifr_addr.sa_family == AF_INET) // Skip non-internet addresses\r
+ addAddress ((const sockaddr_in*) &cfg.ifc_req->ifr_addr, result);\r
\r
+ cfg.ifc_len -= IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len;\r
+ cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len;\r
+ }\r
+ #else\r
for (size_t i = 0; i < (size_t) cfg.ifc_len / (size_t) sizeof (struct ifreq); ++i)\r
{\r
- auto& item = cfg.ifc_req[i];\r
+ const ifreq& item = cfg.ifc_req[i];\r
\r
if (item.ifr_addr.sa_family == AF_INET)\r
- {\r
- InterfaceInfo info;\r
- info.interfaceAddress = makeAddress ((const sockaddr_in*) &item.ifr_addr);\r
-\r
- if (! info.interfaceAddress.isNull())\r
- {\r
- if (ioctl (dummySocket, SIOCGIFBRDADDR, &item) == 0)\r
- info.broadcastAddress = makeAddress ((const sockaddr_in*) &item.ifr_broadaddr);\r
-\r
- result.add (info);\r
- }\r
- }\r
- else if (item.ifr_addr.sa_family == AF_INET6)\r
- {\r
- // TODO: IPv6\r
- }\r
+ addAddress ((const sockaddr_in*) &item.ifr_addr, result);\r
}\r
-\r
- return result;\r
-}\r
-\r
-static Array<InterfaceInfo> findIPAddresses()\r
-{\r
- auto dummySocket = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control\r
-\r
- if (dummySocket < 0)\r
- return {};\r
-\r
- auto result = findIPAddresses (dummySocket);\r
- ::close (dummySocket);\r
- return result;\r
+ #endif\r
}\r
\r
void IPAddress::findAllAddresses (Array<IPAddress>& result, bool /*includeIPv6*/)\r
{\r
- for (auto& a : findIPAddresses())\r
- result.add (a.interfaceAddress);\r
-}\r
-\r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& address)\r
-{\r
- for (auto& a : findIPAddresses())\r
- if (a.interfaceAddress == address)\r
- return a.broadcastAddress;\r
+ const int sock = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control\r
\r
- return {};\r
+ if (sock >= 0)\r
+ {\r
+ findIPAddresses (sock, result);\r
+ ::close (sock);\r
+ }\r
}\r
\r
-#endif\r
-\r
} // namespace juce\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (newProxyInstance, "newProxyInstance", "(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;") \\r
\r
- DECLARE_JNI_CLASS (JavaProxy, "java/lang/reflect/Proxy")\r
+ DECLARE_JNI_CLASS (JavaProxy, "java/lang/reflect/Proxy");\r
#undef JNI_CLASS_MEMBERS\r
\r
JNIClassBase::JNIClassBase (const char* cp) : classPath (cp), classRef (0)\r
juce_dispatchDelete (env, thisPtr);\r
}\r
\r
-//==============================================================================\r
-AppPausedResumedListener::AppPausedResumedListener (Owner& ownerToUse)\r
- : owner (ownerToUse)\r
-{\r
-}\r
-\r
-jobject AppPausedResumedListener::invoke (jobject proxy, jobject method, jobjectArray args)\r
-{\r
- auto* env = getEnv();\r
-\r
- auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
- int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
- if (methodName == "appPaused" && numArgs == 0)\r
- {\r
- owner.appPaused();\r
- return nullptr;\r
- }\r
-\r
- if (methodName == "appResumed" && numArgs == 0)\r
- {\r
- owner.appResumed();\r
- return nullptr;\r
- }\r
-\r
- return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
-}\r
-\r
//==============================================================================\r
JavaVM* androidJNIJavaVM = nullptr;\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (getProperty, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;")\r
\r
- DECLARE_JNI_CLASS (SystemClass, "java/lang/System")\r
+ DECLARE_JNI_CLASS (SystemClass, "java/lang/System");\r
#undef JNI_CLASS_MEMBERS\r
\r
static inline String getSystemProperty (const String& name)\r
}\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD)\r
- DECLARE_JNI_CLASS (BuildClass, "android/os/Build")\r
+ DECLARE_JNI_CLASS (BuildClass, "android/os/Build");\r
#undef JNI_CLASS_MEMBERS\r
\r
static inline String getAndroidOsBuildValue (const char* fieldName)\r
return readPosixConfigFileValue ("/proc/cpuinfo", "Hardware");\r
}\r
\r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
{\r
int maxFreqKHz = 0;\r
\r
namespace juce\r
{\r
\r
-struct CURLSymbols\r
-{\r
- CURL* (*curl_easy_init) (void);\r
- CURLcode (*curl_easy_setopt) (CURL *curl, CURLoption option, ...);\r
- void (*curl_easy_cleanup) (CURL *curl);\r
- CURLcode (*curl_easy_getinfo) (CURL *curl, CURLINFO info, ...);\r
- CURLMcode (*curl_multi_add_handle) (CURLM *multi_handle, CURL *curl_handle);\r
- CURLMcode (*curl_multi_cleanup) (CURLM *multi_handle);\r
- CURLMcode (*curl_multi_fdset) (CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd);\r
- CURLMsg* (*curl_multi_info_read) (CURLM *multi_handle, int *msgs_in_queue);\r
- CURLM* (*curl_multi_init) (void);\r
- CURLMcode (*curl_multi_perform) (CURLM *multi_handle, int *running_handles);\r
- CURLMcode (*curl_multi_remove_handle) (CURLM *multi_handle, CURL *curl_handle);\r
- CURLMcode (*curl_multi_timeout) (CURLM *multi_handle, long *milliseconds);\r
- struct curl_slist* (*curl_slist_append) (struct curl_slist *, const char *);\r
- void (*curl_slist_free_all) (struct curl_slist *);\r
- curl_version_info_data* (*curl_version_info) (CURLversion);\r
-\r
- static std::unique_ptr<CURLSymbols> create()\r
- {\r
- std::unique_ptr<CURLSymbols> symbols (new CURLSymbols);\r
-\r
- #if JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- const ScopedLock sl (getLibcurlLock());\r
- #define JUCE_INIT_CURL_SYMBOL(name) if (! symbols->loadSymbol (symbols->name, #name)) return nullptr;\r
- #else\r
- #define JUCE_INIT_CURL_SYMBOL(name) symbols->name = ::name;\r
- #endif\r
-\r
- JUCE_INIT_CURL_SYMBOL (curl_easy_init)\r
- JUCE_INIT_CURL_SYMBOL (curl_easy_setopt)\r
- JUCE_INIT_CURL_SYMBOL (curl_easy_cleanup)\r
- JUCE_INIT_CURL_SYMBOL (curl_easy_getinfo)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_add_handle)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_cleanup)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_fdset)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_info_read)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_init)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_perform)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_remove_handle)\r
- JUCE_INIT_CURL_SYMBOL (curl_multi_timeout)\r
- JUCE_INIT_CURL_SYMBOL (curl_slist_append)\r
- JUCE_INIT_CURL_SYMBOL (curl_slist_free_all)\r
- JUCE_INIT_CURL_SYMBOL (curl_version_info)\r
-\r
- return symbols;\r
- }\r
-\r
- // liburl's curl_multi_init calls curl_global_init which is not thread safe\r
- // so we need to get a lock during calls to curl_multi_init and curl_multi_cleanup\r
- static CriticalSection& getLibcurlLock() noexcept\r
- {\r
- static CriticalSection cs;\r
- return cs;\r
- }\r
-\r
-private:\r
- CURLSymbols() = default;\r
-\r
- #if JUCE_LOAD_CURL_SYMBOLS_LAZILY\r
- static DynamicLibrary& getLibcurl()\r
- {\r
- const ScopedLock sl (getLibcurlLock());\r
- static DynamicLibrary libcurl;\r
-\r
- if (libcurl.getNativeHandle() == nullptr)\r
- for (auto libName : { "libcurl.so", "libcurl.so.4", "libcurl.so.3" })\r
- if (libcurl.open (libName))\r
- break;\r
-\r
- return libcurl;\r
- }\r
-\r
- template <typename FuncPtr>\r
- bool loadSymbol (FuncPtr& dst, const char* name)\r
- {\r
- dst = reinterpret_cast<FuncPtr> (getLibcurl().getFunction (name));\r
- return (dst != nullptr);\r
- }\r
- #endif\r
-};\r
-\r
-\r
-//==============================================================================\r
class WebInputStream::Pimpl\r
{\r
public:\r
: owner (ownerStream), url (urlToCopy), isPost (shouldUsePost),\r
httpRequest (isPost ? "POST" : "GET")\r
{\r
- jassert (symbols); // Unable to load libcurl!\r
-\r
- {\r
- const ScopedLock sl (CURLSymbols::getLibcurlLock());\r
- multi = symbols->curl_multi_init();\r
- }\r
+ multi = curl_multi_init();\r
\r
if (multi != nullptr)\r
{\r
- curl = symbols->curl_easy_init();\r
+ curl = curl_easy_init();\r
\r
if (curl != nullptr)\r
- if (symbols->curl_multi_add_handle (multi, curl) == CURLM_OK)\r
+ if (curl_multi_add_handle (multi, curl) == CURLM_OK)\r
return;\r
}\r
\r
void cleanup()\r
{\r
const ScopedLock lock (cleanupLock);\r
- const ScopedLock sl (CURLSymbols::getLibcurlLock());\r
\r
if (curl != nullptr)\r
{\r
- symbols->curl_multi_remove_handle (multi, curl);\r
+ curl_multi_remove_handle (multi, curl);\r
\r
if (headerList != nullptr)\r
{\r
- symbols->curl_slist_free_all (headerList);\r
+ curl_slist_free_all (headerList);\r
headerList = nullptr;\r
}\r
\r
- symbols->curl_easy_cleanup (curl);\r
+ curl_easy_cleanup (curl);\r
curl = nullptr;\r
}\r
\r
if (multi != nullptr)\r
{\r
- symbols->curl_multi_cleanup (multi);\r
+ curl_multi_cleanup (multi);\r
multi = nullptr;\r
}\r
}\r
{\r
auto address = url.toString (! isPost);\r
\r
- curl_version_info_data* data = symbols->curl_version_info (CURLVERSION_NOW);\r
+ curl_version_info_data* data = curl_version_info (CURLVERSION_NOW);\r
jassert (data != nullptr);\r
\r
if (! requestHeaders.endsWithChar ('\n'))\r
\r
auto userAgent = String ("curl/") + data->version;\r
\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_URL, address.toRawUTF8()) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_WRITEDATA, this) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, StaticCurlWrite) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_MAXREDIRS, static_cast<long> (maxRedirects)) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_USERAGENT, userAgent.toRawUTF8()) == CURLE_OK\r
- && symbols->curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, (maxRedirects > 0 ? 1 : 0)) == CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_URL, address.toRawUTF8()) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_WRITEDATA, this) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, StaticCurlWrite) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_MAXREDIRS, static_cast<long> (maxRedirects)) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_USERAGENT, userAgent.toRawUTF8()) == CURLE_OK\r
+ && curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, (maxRedirects > 0 ? 1 : 0)) == CURLE_OK)\r
{\r
if (isPost)\r
{\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_READDATA, this) != CURLE_OK\r
- || symbols->curl_easy_setopt (curl, CURLOPT_READFUNCTION, StaticCurlRead) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_READDATA, this) != CURLE_OK\r
+ || curl_easy_setopt (curl, CURLOPT_READFUNCTION, StaticCurlRead) != CURLE_OK)\r
return false;\r
\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_POST, 1) != CURLE_OK\r
- || symbols->curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t> (headersAndPostData.getSize())) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_POST, 1) != CURLE_OK\r
+ || curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t> (headersAndPostData.getSize())) != CURLE_OK)\r
return false;\r
}\r
\r
bool hasSpecialRequestCmd = isPost ? (httpRequest != "POST") : (httpRequest != "GET");\r
\r
if (hasSpecialRequestCmd)\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST, httpRequest.toRawUTF8()) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST, httpRequest.toRawUTF8()) != CURLE_OK)\r
return false;\r
\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_HEADERDATA, this) != CURLE_OK\r
- || symbols->curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, StaticCurlHeader) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_HEADERDATA, this) != CURLE_OK\r
+ || curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, StaticCurlHeader) != CURLE_OK)\r
return false;\r
\r
if (timeOutMs > 0)\r
{\r
auto timeOutSecs = ((long) timeOutMs + 999) / 1000;\r
\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, timeOutSecs) != CURLE_OK\r
- || symbols->curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, 100) != CURLE_OK\r
- || symbols->curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, timeOutSecs) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, timeOutSecs) != CURLE_OK\r
+ || curl_easy_setopt (curl, CURLOPT_LOW_SPEED_LIMIT, 100) != CURLE_OK\r
+ || curl_easy_setopt (curl, CURLOPT_LOW_SPEED_TIME, timeOutSecs) != CURLE_OK)\r
return false;\r
}\r
\r
\r
// fromLines will always return at least one line if the string is not empty\r
jassert (headerLines.size() > 0);\r
- headerList = symbols->curl_slist_append (headerList, headerLines [0].toRawUTF8());\r
+ headerList = curl_slist_append (headerList, headerLines [0].toRawUTF8());\r
\r
for (int i = 1; (i < headerLines.size() && headerList != nullptr); ++i)\r
- headerList = symbols->curl_slist_append (headerList, headerLines [i].toRawUTF8());\r
+ headerList = curl_slist_append (headerList, headerLines [i].toRawUTF8());\r
\r
if (headerList == nullptr)\r
{\r
return false;\r
}\r
\r
- if (symbols->curl_easy_setopt (curl, CURLOPT_HTTPHEADER, headerList) != CURLE_OK)\r
+ if (curl_easy_setopt (curl, CURLOPT_HTTPHEADER, headerList) != CURLE_OK)\r
{\r
cleanup();\r
return false;\r
return false;\r
\r
long responseCode;\r
- if (symbols->curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode) == CURLE_OK)\r
+ if (curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode) == CURLE_OK)\r
statusCode = static_cast<int> (responseCode);\r
\r
// get content length size\r
double curlLength;\r
- if (symbols->curl_easy_getinfo (curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &curlLength) == CURLE_OK)\r
+ if (curl_easy_getinfo (curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &curlLength) == CURLE_OK)\r
contentLength = static_cast<int64> (curlLength);\r
}\r
\r
{\r
int cnt = 0;\r
\r
- if (CURLMsg* msg = symbols->curl_multi_info_read (multi, &cnt))\r
+ if (CURLMsg* msg = curl_multi_info_read (multi, &cnt))\r
{\r
if (msg->msg == CURLMSG_DONE && msg->easy_handle == curl)\r
{\r
if (multi == nullptr)\r
return;\r
\r
- if ((lastError = (int) symbols->curl_multi_timeout (multi, &curl_timeo)) != CURLM_OK)\r
+ if ((lastError = (int) curl_multi_timeout (multi, &curl_timeo)) != CURLM_OK)\r
return;\r
}\r
\r
if (multi == nullptr)\r
return;\r
\r
- if ((lastError = (int) symbols->curl_multi_fdset (multi, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK)\r
+ if ((lastError = (int) curl_multi_fdset (multi, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK)\r
return;\r
}\r
\r
{\r
const ScopedLock lock (cleanupLock);\r
\r
- while ((curlRet = (int) symbols->curl_multi_perform (multi, &still_running)) == CURLM_CALL_MULTI_PERFORM)\r
+ while ((curlRet = (int) curl_multi_perform (multi, &still_running)) == CURLM_CALL_MULTI_PERFORM)\r
{}\r
}\r
\r
//==============================================================================\r
WebInputStream& owner;\r
const URL url;\r
- std::unique_ptr<CURLSymbols> symbols { CURLSymbols::create() };\r
\r
//==============================================================================\r
// curl stuff\r
return getCpuInfo ("model name");\r
}\r
\r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
{\r
return roundToInt (getCpuInfo ("cpu MHz").getFloatValue());\r
}\r
void CPUInformation::initialise() noexcept\r
{\r
auto flags = getCpuInfo ("flags");\r
- hasMMX = flags.contains ("mmx");\r
- hasSSE = flags.contains ("sse");\r
- hasSSE2 = flags.contains ("sse2");\r
- hasSSE3 = flags.contains ("sse3");\r
- has3DNow = flags.contains ("3dnow");\r
- hasSSSE3 = flags.contains ("ssse3");\r
- hasSSE41 = flags.contains ("sse4_1");\r
- hasSSE42 = flags.contains ("sse4_2");\r
- hasAVX = flags.contains ("avx");\r
- hasAVX2 = flags.contains ("avx2");\r
- hasAVX512F = flags.contains ("avx512f");\r
- hasAVX512BW = flags.contains ("avx512bw");\r
- hasAVX512CD = flags.contains ("avx512cd");\r
- hasAVX512DQ = flags.contains ("avx512dq");\r
- hasAVX512ER = flags.contains ("avx512er");\r
- hasAVX512IFMA = flags.contains ("avx512ifma");\r
- hasAVX512PF = flags.contains ("avx512pf");\r
- hasAVX512VBMI = flags.contains ("avx512vbmi");\r
- hasAVX512VL = flags.contains ("avx512vl");\r
- hasAVX512VPOPCNTDQ = flags.contains ("avx512_vpopcntdq");\r
+ hasMMX = flags.contains ("mmx");\r
+ hasSSE = flags.contains ("sse");\r
+ hasSSE2 = flags.contains ("sse2");\r
+ hasSSE3 = flags.contains ("sse3");\r
+ has3DNow = flags.contains ("3dnow");\r
+ hasSSSE3 = flags.contains ("ssse3");\r
+ hasSSE41 = flags.contains ("sse4_1");\r
+ hasSSE42 = flags.contains ("sse4_2");\r
+ hasAVX = flags.contains ("avx");\r
+ hasAVX2 = flags.contains ("avx2");\r
\r
numLogicalCPUs = getCpuInfo ("processor").getIntValue() + 1;\r
\r
{\r
const String type (buf.f_fstypename);\r
\r
- while (*types != nullptr)\r
+ while (*types != 0)\r
if (type.equalsIgnoreCase (*types++))\r
return true;\r
}\r
#else\r
static bool launchExecutable (const String& pathAndArguments)\r
{\r
- auto cpid = fork();\r
+ const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), 0 };\r
+\r
+ const int cpid = fork();\r
\r
if (cpid == 0)\r
{\r
- const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr };\r
-\r
// Child process\r
- if (execve (argv[0], (char**) argv, nullptr) < 0)\r
+ if (execve (argv[0], (char**) argv, 0) < 0)\r
exit (0);\r
}\r
else\r
JUCE_AUTORELEASEPOOL\r
{\r
NSString* fileNameAsNS (juceStringToNS (fileName));\r
- NSURL* filenameAsURL = File::createFileWithoutCheckingPath (fileName).exists() ? [NSURL fileURLWithPath: fileNameAsNS]\r
- : [NSURL URLWithString: fileNameAsNS];\r
+ NSURL* filenameAsURL ([NSURL URLWithString: fileNameAsNS]);\r
+\r
+ if (filenameAsURL == nil)\r
+ filenameAsURL = [NSURL fileURLWithPath: fileNameAsNS];\r
\r
#if JUCE_IOS\r
ignoreUnused (parameters);\r
StringArray params;\r
params.addTokens (parameters, true);\r
\r
- NSMutableDictionary* dict = [[NSMutableDictionary new] autorelease];\r
-\r
- NSMutableArray* paramArray = [[NSMutableArray new] autorelease];\r
-\r
+ NSMutableArray* paramArray = [[[NSMutableArray alloc] init] autorelease];\r
for (int i = 0; i < params.size(); ++i)\r
[paramArray addObject: juceStringToNS (params[i])];\r
\r
+ NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease];\r
[dict setObject: paramArray\r
forKey: nsStringLiteral ("NSWorkspaceLaunchConfigurationArguments")];\r
\r
for (const ifaddrs* cursor = addrs; cursor != nullptr; cursor = cursor->ifa_next)\r
{\r
// Required to avoid misaligned pointer access\r
- sockaddr sto;\r
- std::memcpy (&sto, cursor->ifa_addr, sizeof (sockaddr));\r
+ sockaddr_storage sto;\r
+ std::memcpy (&sto, cursor->ifa_addr, sizeof (sockaddr_storage));\r
\r
- if (sto.sa_family == AF_LINK)\r
+ if (sto.ss_family == AF_LINK)\r
{\r
auto sadd = (const sockaddr_dl*) cursor->ifa_addr;\r
\r
NSMutableData* data = nil;\r
NSDictionary* headers = nil;\r
int statusCode = 0;\r
- std::atomic<bool> initialised { false };\r
- bool hasFailed = false, hasFinished = false, isBeingDeleted = false;\r
+ bool initialised = false, hasFailed = false, hasFinished = false, isBeingDeleted = false;\r
const int numRedirectsToFollow;\r
int numRedirects = 0;\r
int64 latestTotalBytes = 0;\r
{\r
DBG (nsStringToJuce ([error description])); ignoreUnused (error);\r
nsUrlErrorCode = [error code];\r
- hasFailed = true;\r
- initialised = true;\r
+ hasFailed = initialised = true;\r
signalThreadShouldExit();\r
}\r
\r
\r
void finishedLoading()\r
{\r
- hasFinished = true;\r
- initialised = true;\r
+ hasFinished = initialised = true;\r
signalThreadShouldExit();\r
}\r
\r
NSDictionary* headers = nil;\r
NSInteger nsUrlErrorCode = 0;\r
int statusCode = 0;\r
- std::atomic<bool> initialised { false }, hasFailed { false }, hasFinished { false };\r
+ bool initialised = false, hasFailed = false, hasFinished = false;\r
const int numRedirectsToFollow;\r
int numRedirects = 0;\r
int latestTotalBytes = 0;\r
\r
String String::fromCFString (CFStringRef cfString)\r
{\r
- if (cfString == nullptr)\r
+ if (cfString == 0)\r
return {};\r
\r
CFRange range = { 0, CFStringGetLength (cfString) };\r
\r
map.mappingVersion = kUnicodeUseLatestMapping;\r
\r
- UnicodeToTextInfo conversionInfo = {};\r
+ UnicodeToTextInfo conversionInfo = 0;\r
String result;\r
\r
if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr)\r
if (ConvertFromUnicodeToText (conversionInfo,\r
bytesNeeded, (ConstUniCharArrayPtr) toUTF16().getAddress(),\r
kUnicodeDefaultDirectionMask,\r
- 0, {}, {}, {},\r
+ 0, 0, 0, 0,\r
bytesNeeded, &bytesRead,\r
&outputBufferSize, tempOut) == noErr)\r
{\r
{\r
uint32 la = a, lb = b, lc = c, ld = d;\r
\r
- #if JUCE_32BIT && defined (__pic__)\r
- asm ("mov %%ebx, %%edi\n"\r
- "cpuid\n"\r
- "xchg %%edi, %%ebx\n"\r
- : "=a" (la), "=D" (lb), "=c" (lc), "=d" (ld)\r
- : "a" (type), "c" (0));\r
- #else\r
- asm ("cpuid\n"\r
- : "=a" (la), "=b" (lb), "=c" (lc), "=d" (ld)\r
- : "a" (type), "c" (0));\r
- #endif\r
+ asm ("mov %%ebx, %%esi \n\t"\r
+ "cpuid \n\t"\r
+ "xchg %%esi, %%ebx"\r
+ : "=a" (la), "=S" (lb), "=c" (lc), "=d" (ld) : "a" (type)\r
+ #if JUCE_64BIT\r
+ , "b" (lb), "c" (lc), "d" (ld)\r
+ #endif\r
+ );\r
\r
a = la; b = lb; c = lc; d = ld;\r
}\r
hasAVX = (c & (1u << 28)) != 0;\r
\r
SystemStatsHelpers::doCPUID (a, b, c, d, 7);\r
- hasAVX2 = (b & (1u << 5)) != 0;\r
- hasAVX512F = (b & (1u << 16)) != 0;\r
- hasAVX512DQ = (b & (1u << 17)) != 0;\r
- hasAVX512IFMA = (b & (1u << 21)) != 0;\r
- hasAVX512PF = (b & (1u << 26)) != 0;\r
- hasAVX512ER = (b & (1u << 27)) != 0;\r
- hasAVX512CD = (b & (1u << 28)) != 0;\r
- hasAVX512BW = (b & (1u << 30)) != 0;\r
- hasAVX512VL = (b & (1u << 31)) != 0;\r
- hasAVX512VBMI = (c & (1u << 1)) != 0;\r
- hasAVX512VPOPCNTDQ = (c & (1u << 14)) != 0;\r
+ hasAVX2 = (b & (1u << 5)) != 0;\r
#endif\r
\r
numLogicalCPUs = (int) [[NSProcessInfo processInfo] activeProcessorCount];\r
String SystemStats::getDeviceDescription()\r
{\r
#if JUCE_IOS\r
- const char* name = "hw.machine";\r
+ return nsStringToJuce ([[UIDevice currentDevice] model]);\r
#else\r
- const char* name = "hw.model";\r
- #endif\r
-\r
size_t size;\r
- if (sysctlbyname (name, nullptr, &size, nullptr, 0) >= 0)\r
+ if (sysctlbyname ("hw.model", nullptr, &size, nullptr, 0) >= 0)\r
{\r
HeapBlock<char> model (size);\r
- if (sysctlbyname (name, model, &size, nullptr, 0) >= 0)\r
+ if (sysctlbyname ("hw.model", model, &size, nullptr, 0) >= 0)\r
return model.get();\r
}\r
-\r
return {};\r
+ #endif\r
}\r
\r
String SystemStats::getDeviceManufacturer()\r
uint64 mem = 0;\r
size_t memSize = sizeof (mem);\r
int mib[] = { CTL_HW, HW_MEMSIZE };\r
- sysctl (mib, 2, &mem, &memSize, nullptr, 0);\r
+ sysctl (mib, 2, &mem, &memSize, 0, 0);\r
return (int) (mem / (1024 * 1024));\r
}\r
\r
return {};\r
}\r
\r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
{\r
uint64 speedHz = 0;\r
size_t speedSize = sizeof (speedHz);\r
int mib[] = { CTL_HW, HW_CPU_FREQ };\r
- sysctl (mib, 2, &speedHz, &speedSize, nullptr, 0);\r
+ sysctl (mib, 2, &speedHz, &speedSize, 0, 0);\r
\r
#if JUCE_BIG_ENDIAN\r
if (speedSize == 4)\r
struct kinfo_proc info;\r
int m[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() };\r
size_t sz = sizeof (info);\r
- sysctl (m, 4, &info, &sz, nullptr, 0);\r
+ sysctl (m, 4, &info, &sz, 0, 0);\r
return (info.kp_proc.p_flag & P_TRACED) != 0;\r
}\r
\r
\r
static inline NSArray* createNSArrayFromStringArray (const StringArray& strings)\r
{\r
- auto array = [[NSMutableArray alloc] init];\r
+ auto* array = [[NSMutableArray alloc] init];\r
\r
for (auto string: strings)\r
[array addObject:juceStringToNS (string)];\r
\r
static NSDictionary* varObjectToNSDictionary (const var& varToParse)\r
{\r
- auto dictionary = [NSMutableDictionary dictionary];\r
+ auto* dictionary = [NSMutableDictionary dictionary];\r
\r
if (varToParse.isObject())\r
{\r
\r
const auto* varArray = varToParse.getArray();\r
\r
- auto array = [NSMutableArray arrayWithCapacity: (NSUInteger) varArray->size()];\r
+ auto* array = [NSMutableArray arrayWithCapacity: (NSUInteger) varArray->size()];\r
\r
for (const auto& aVar : *varArray)\r
{\r
return array;\r
}\r
\r
-static var nsObjectToVar (NSObject* array);\r
+static var nsArrayToVar (NSArray* array);\r
\r
static var nsDictionaryToVar (NSDictionary* dictionary)\r
{\r
- DynamicObject::Ptr dynamicObject (new DynamicObject());\r
+ DynamicObject::Ptr dynamicObject = new DynamicObject();\r
\r
for (NSString* key in dictionary)\r
- dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key]));\r
+ {\r
+ const auto keyString = nsStringToJuce (key);\r
+\r
+ id value = dictionary[key];\r
+\r
+ if ([value isKindOfClass: [NSString class]])\r
+ dynamicObject->setProperty (keyString, nsStringToJuce ((NSString*) value));\r
+ else if ([value isKindOfClass: [NSNumber class]])\r
+ dynamicObject->setProperty (keyString, nsStringToJuce ([(NSNumber*) value stringValue]));\r
+ else if ([value isKindOfClass: [NSDictionary class]])\r
+ dynamicObject->setProperty (keyString, nsDictionaryToVar ((NSDictionary*) value));\r
+ else if ([value isKindOfClass: [NSArray class]])\r
+ dynamicObject->setProperty (keyString, nsArrayToVar ((NSArray*) value));\r
+ else\r
+ jassertfalse; // Unsupported yet, add here!\r
+ }\r
\r
return var (dynamicObject.get());\r
}\r
Array<var> resultArray;\r
\r
for (id value in array)\r
- resultArray.add (nsObjectToVar (value));\r
-\r
- return var (resultArray);\r
-}\r
-\r
-static var nsObjectToVar (NSObject* obj)\r
-{\r
- if ([obj isKindOfClass: [NSString class]]) return nsStringToJuce ((NSString*) obj);\r
- else if ([obj isKindOfClass: [NSNumber class]]) return nsStringToJuce ([(NSNumber*) obj stringValue]);\r
- else if ([obj isKindOfClass: [NSDictionary class]]) return nsDictionaryToVar ((NSDictionary*) obj);\r
- else if ([obj isKindOfClass: [NSArray class]]) return nsArrayToVar ((NSArray*) obj);\r
- else\r
{\r
- // Unsupported yet, add here!\r
- jassertfalse;\r
+ if ([value isKindOfClass: [NSString class]])\r
+ resultArray.add (var (nsStringToJuce ((NSString*) value)));\r
+ else if ([value isKindOfClass: [NSNumber class]])\r
+ resultArray.add (var (nsStringToJuce ([(NSNumber*) value stringValue])));\r
+ else if ([value isKindOfClass: [NSDictionary class]])\r
+ resultArray.add (nsDictionaryToVar ((NSDictionary*) value));\r
+ else if ([value isKindOfClass: [NSArray class]])\r
+ resultArray.add (nsArrayToVar ((NSArray*) value));\r
+ else\r
+ jassertfalse; // Unsupported yet, add here!\r
}\r
\r
- return {};\r
+ return var (resultArray);\r
}\r
\r
#if JUCE_MAC\r
template <typename ReturnValue, typename... Params>\r
static inline ReturnValue ObjCMsgSendSuper (struct objc_super* s, SEL sel, Params... params)\r
{\r
- using SuperFn = ReturnValue (*)(struct objc_super*, SEL, Params...);\r
+ typedef ReturnValue (*SuperFn)(struct objc_super*, SEL, Params...);\r
SuperFn fn = reinterpret_cast<SuperFn> (objc_msgSendSuper);\r
return fn (s, sel, params...);\r
}\r
#endif\r
#endif\r
\r
+//==============================================================================\r
+template <typename ObjectType>\r
+struct NSObjectRetainer\r
+{\r
+ inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; }\r
+ inline ~NSObjectRetainer() { [object release]; }\r
+\r
+ ObjectType* object;\r
+};\r
+\r
//==============================================================================\r
struct NSObjectDeleter\r
{\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-namespace\r
-{\r
- static IPAddress makeAddress (const sockaddr_in6* addr_in)\r
- {\r
- if (addr_in == nullptr)\r
- return {};\r
-\r
- auto addr = addr_in->sin6_addr;\r
-\r
- IPAddressByteUnion temp;\r
- uint16 arr[8];\r
-\r
- for (int i = 0; i < 8; ++i) // Swap bytes from network to host order\r
- {\r
- temp.split[0] = addr.s6_addr[i * 2 + 1];\r
- temp.split[1] = addr.s6_addr[i * 2];\r
-\r
- arr[i] = temp.combined;\r
- }\r
-\r
- return IPAddress (arr);\r
- }\r
-\r
- static IPAddress makeAddress (const sockaddr_in* addr_in)\r
- {\r
- if (addr_in->sin_addr.s_addr == INADDR_NONE)\r
- return {};\r
-\r
- return IPAddress (ntohl (addr_in->sin_addr.s_addr));\r
- }\r
-\r
- struct InterfaceInfo\r
- {\r
- IPAddress interfaceAddress, broadcastAddress;\r
- };\r
-\r
- bool operator== (const InterfaceInfo& lhs, const InterfaceInfo& rhs)\r
- {\r
- return lhs.interfaceAddress == rhs.interfaceAddress\r
- && lhs.broadcastAddress == rhs.broadcastAddress;\r
- }\r
-\r
- bool populateInterfaceInfo (struct ifaddrs* ifa, InterfaceInfo& interfaceInfo)\r
- {\r
- if (ifa->ifa_addr != nullptr)\r
- {\r
- if (ifa->ifa_addr->sa_family == AF_INET)\r
- {\r
- auto interfaceAddressInfo = (sockaddr_in*) ifa->ifa_addr;\r
- auto broadcastAddressInfo = (sockaddr_in*) ifa->ifa_dstaddr;\r
-\r
- if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE)\r
- {\r
- interfaceInfo.interfaceAddress = makeAddress (interfaceAddressInfo);\r
- interfaceInfo.broadcastAddress = makeAddress (broadcastAddressInfo);\r
- return true;\r
- }\r
- }\r
- else if (ifa->ifa_addr->sa_family == AF_INET6)\r
- {\r
- interfaceInfo.interfaceAddress = makeAddress ((sockaddr_in6*) ifa->ifa_addr);\r
- interfaceInfo.broadcastAddress = makeAddress ((sockaddr_in6*) ifa->ifa_dstaddr);\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
-\r
- Array<InterfaceInfo> getAllInterfaceInfo()\r
- {\r
- Array<InterfaceInfo> interfaces;\r
- struct ifaddrs* ifaddr = nullptr;\r
-\r
- if (getifaddrs (&ifaddr) != -1)\r
- {\r
- for (auto* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)\r
- {\r
- InterfaceInfo i;\r
-\r
- if (populateInterfaceInfo (ifa, i))\r
- interfaces.addIfNotAlreadyThere (i);\r
- }\r
-\r
- freeifaddrs (ifaddr);\r
- }\r
-\r
- return interfaces;\r
- }\r
-}\r
-\r
-void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)\r
-{\r
- for (auto& i : getAllInterfaceInfo())\r
- if (includeIPv6 || ! i.interfaceAddress.isIPv6)\r
- result.addIfNotAlreadyThere (i.interfaceAddress);\r
-}\r
-\r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& interfaceAddress)\r
-{\r
- for (auto& i : getAllInterfaceInfo())\r
- if (i.interfaceAddress == interfaceAddress)\r
- return i.broadcastAddress;\r
-\r
- return {};\r
-}\r
-\r
-} // namespace juce\r
}\r
}\r
\r
- bool connect (int timeOutMilliseconds)\r
- {\r
- return openPipe (true, getTimeoutEnd (timeOutMilliseconds));\r
- }\r
-\r
int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds)\r
{\r
auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds);\r
+\r
+ if (pipeIn == -1)\r
+ {\r
+ pipeIn = openPipe (createdPipe ? pipeInName : pipeOutName, O_RDWR | O_NONBLOCK, timeoutEnd);\r
+\r
+ if (pipeIn == -1)\r
+ return -1;\r
+ }\r
+\r
int bytesRead = 0;\r
\r
while (bytesRead < maxBytesToRead)\r
{\r
auto timeoutEnd = getTimeoutEnd (timeOutMilliseconds);\r
\r
- if (! openPipe (false, timeoutEnd))\r
- return -1;\r
+ if (pipeOut == -1)\r
+ {\r
+ pipeOut = openPipe (createdPipe ? pipeOutName : pipeInName, O_WRONLY, timeoutEnd);\r
+\r
+ if (pipeOut == -1)\r
+ return -1;\r
+ }\r
\r
int bytesWritten = 0;\r
\r
}\r
}\r
\r
- bool openPipe (bool isInput, uint32 timeoutEnd)\r
- {\r
- auto& pipe = isInput ? pipeIn : pipeOut;\r
- int flags = isInput ? O_RDWR | O_NONBLOCK : O_WRONLY;\r
-\r
- const String& pipeName = isInput ? (createdPipe ? pipeInName : pipeOutName)\r
- : (createdPipe ? pipeOutName : pipeInName);\r
-\r
- if (pipe == -1)\r
- {\r
- pipe = openPipe (pipeName, flags, timeoutEnd);\r
-\r
- if (pipe == -1)\r
- return false;\r
- }\r
-\r
- return true;\r
- }\r
-\r
static void waitForInput (int handle, int timeoutMsecs) noexcept\r
{\r
struct timeval timeout;\r
FD_ZERO (&rset);\r
FD_SET (handle, &rset);\r
\r
- select (handle + 1, &rset, nullptr, nullptr, &timeout);\r
+ select (handle + 1, &rset, nullptr, 0, &timeout);\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
return false;\r
}\r
\r
- if (! pimpl->connect (200))\r
- {\r
- pimpl.reset();\r
- return false;\r
- }\r
-\r
return true;\r
}\r
\r
WaitableEvent::WaitableEvent (bool useManualReset) noexcept\r
: triggered (false), manualReset (useManualReset)\r
{\r
- pthread_cond_init (&condition, {});\r
+ pthread_cond_init (&condition, 0);\r
\r
pthread_mutexattr_t atts;\r
pthread_mutexattr_init (&atts);\r
else\r
{\r
struct timeval now;\r
- gettimeofday (&now, nullptr);\r
+ gettimeofday (&now, 0);\r
\r
struct timespec time;\r
time.tv_sec = now.tv_sec + (timeOutMillisecs / 1000);\r
#endif\r
\r
//==============================================================================\r
-JUCE_DECLARE_DEPRECATED_STATIC (const juce_wchar File::separator = '/';)\r
-JUCE_DECLARE_DEPRECATED_STATIC (const StringRef File::separatorString ("/");)\r
+#ifndef JUCE_GCC\r
+ const juce_wchar File::separator = '/';\r
+ const StringRef File::separatorString ("/");\r
+#endif\r
\r
juce_wchar File::getSeparatorChar() { return '/'; }\r
StringRef File::getSeparatorString() { return "/"; }\r
\r
bool File::deleteFile() const\r
{\r
- if (! isSymbolicLink())\r
- {\r
- if (! exists())\r
- return true;\r
+ if (! exists() && ! isSymbolicLink())\r
+ return true;\r
\r
- if (isDirectory())\r
- return rmdir (fullPath.toUTF8()) == 0;\r
- }\r
+ if (isDirectory())\r
+ return rmdir (fullPath.toUTF8()) == 0;\r
\r
return remove (fullPath.toUTF8()) == 0;\r
}\r
//==============================================================================\r
int64 juce_fileSetPosition (void* handle, int64 pos)\r
{\r
- if (handle != nullptr && lseek (getFD (handle), (off_t) pos, SEEK_SET) == pos)\r
+ if (handle != 0 && lseek (getFD (handle), (off_t) pos, SEEK_SET) == pos)\r
return pos;\r
\r
return -1;\r
\r
FileInputStream::~FileInputStream()\r
{\r
- if (fileHandle != nullptr)\r
+ if (fileHandle != 0)\r
close (getFD (fileHandle));\r
}\r
\r
{\r
ssize_t result = 0;\r
\r
- if (fileHandle != nullptr)\r
+ if (fileHandle != 0)\r
{\r
result = ::read (getFD (fileHandle), buffer, numBytes);\r
\r
\r
void FileOutputStream::closeHandle()\r
{\r
- if (fileHandle != nullptr)\r
+ if (fileHandle != 0)\r
{\r
close (getFD (fileHandle));\r
- fileHandle = nullptr;\r
+ fileHandle = 0;\r
}\r
}\r
\r
ssize_t FileOutputStream::writeInternal (const void* data, size_t numBytes)\r
{\r
- if (fileHandle == nullptr)\r
+ if (fileHandle == 0)\r
return 0;\r
\r
auto result = ::write (getFD (fileHandle), data, numBytes);\r
#ifndef JUCE_ANDROID\r
void FileOutputStream::flushInternal()\r
{\r
- if (fileHandle != nullptr && fsync (getFD (fileHandle)) == -1)\r
+ if (fileHandle != 0 && fsync (getFD (fileHandle)) == -1)\r
status = getResultForErrno();\r
}\r
#endif\r
\r
Result FileOutputStream::truncate()\r
{\r
- if (fileHandle == nullptr)\r
+ if (fileHandle == 0)\r
return status;\r
\r
flush();\r
\r
if (fileHandle != -1)\r
{\r
- auto m = mmap (nullptr, (size_t) range.getLength(),\r
- mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ,\r
- exclusive ? MAP_PRIVATE : MAP_SHARED, fileHandle,\r
- (off_t) range.getStart());\r
+ void* m = mmap (0, (size_t) range.getLength(),\r
+ mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ,\r
+ exclusive ? MAP_PRIVATE : MAP_SHARED, fileHandle,\r
+ (off_t) range.getStart());\r
\r
if (m != MAP_FAILED)\r
{\r
\r
int File::getVolumeSerialNumber() const\r
{\r
- return 0;\r
+ int result = 0;\r
+/* int fd = open (getFullPathName().toUTF8(), O_RDONLY | O_NONBLOCK);\r
+\r
+ char info[512];\r
+\r
+ #ifndef HDIO_GET_IDENTITY\r
+ #define HDIO_GET_IDENTITY 0x030d\r
+ #endif\r
+\r
+ if (ioctl (fd, HDIO_GET_IDENTITY, info) == 0)\r
+ {\r
+ DBG (String (info + 20, 20));\r
+ result = String (info + 20, 20).trim().getIntValue();\r
+ }\r
+\r
+ close (fd);*/\r
+ return result;\r
}\r
\r
//==============================================================================\r
extern JavaVM* androidJNIJavaVM;\r
#endif\r
\r
-static void* threadEntryProc (void* userData)\r
+extern "C" void* threadEntryProc (void*);\r
+extern "C" void* threadEntryProc (void* userData)\r
{\r
#if JUCE_ANDROID\r
+ // JNI_OnLoad was not called - make sure you load the JUCE shared library\r
+ // using System.load inside of Java\r
+ jassert (androidJNIJavaVM != nullptr);\r
\r
- if (androidJNIJavaVM != nullptr)\r
- {\r
- JNIEnv* env;\r
- androidJNIJavaVM->AttachCurrentThread (&env, nullptr);\r
- setEnv (env);\r
- }\r
- else\r
- {\r
- // JNI_OnLoad was not called - make sure you load the JUCE shared library\r
- // using System.load inside of Java\r
- jassertfalse;\r
- }\r
+ JNIEnv* env;\r
+ androidJNIJavaVM->AttachCurrentThread (&env, nullptr);\r
+ setEnv (env);\r
#endif\r
\r
JUCE_AUTORELEASEPOOL\r
}\r
#endif\r
\r
- threadHandle = {};\r
- pthread_t handle = {};\r
+ threadHandle = 0;\r
+ pthread_t handle = 0;\r
pthread_attr_t attr;\r
pthread_attr_t* attrPtr = nullptr;\r
\r
\r
void Thread::closeThreadHandle()\r
{\r
- threadId = {};\r
- threadHandle = {};\r
+ threadId = 0;\r
+ threadHandle = 0;\r
}\r
\r
void Thread::killThread()\r
{\r
- if (threadHandle.get() != nullptr)\r
+ if (threadHandle.get() != 0)\r
{\r
#if JUCE_ANDROID\r
jassertfalse; // pthread_cancel not available!\r
{\r
isRunning = false;\r
\r
- if (thread == pthread_t())\r
+ if (thread == 0)\r
return;\r
\r
if (thread == pthread_self())\r
pthread_mutex_unlock (&timerMutex);\r
\r
pthread_join (thread, nullptr);\r
- thread = {};\r
+ thread = 0;\r
}\r
\r
HighResolutionTimer& owner;\r
\r
File getSpecialFolderPath (int type)\r
{\r
- WCHAR path[MAX_PATH + 256];\r
+ WCHAR path [MAX_PATH + 256];\r
\r
if (SHGetSpecialFolderPath (0, path, type, FALSE))\r
return File (String (path));\r
\r
File getModuleFileName (HINSTANCE moduleHandle)\r
{\r
- WCHAR dest[MAX_PATH + 256];\r
+ WCHAR dest [MAX_PATH + 256];\r
dest[0] = 0;\r
GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest));\r
return File (String (dest));\r
\r
Result getResultForLastError()\r
{\r
- TCHAR messageBuffer[256] = { 0 };\r
+ TCHAR messageBuffer [256] = { 0 };\r
\r
FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r
nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
}\r
\r
//==============================================================================\r
-JUCE_DECLARE_DEPRECATED_STATIC (const juce_wchar File::separator = '\\';)\r
-JUCE_DECLARE_DEPRECATED_STATIC (const StringRef File::separatorString ("\\");)\r
+#ifndef JUCE_GCC\r
+ const juce_wchar File::separator = '\\';\r
+ const StringRef File::separatorString ("\\");\r
+#endif\r
\r
juce_wchar File::getSeparatorChar() { return '\\'; }\r
StringRef File::getSeparatorString() { return "\\"; }\r
\r
bool File::isDirectory() const\r
{\r
- auto attr = WindowsFileHelpers::getAtts (fullPath);\r
+ const DWORD attr = WindowsFileHelpers::getAtts (fullPath);\r
return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES;\r
}\r
\r
\r
bool File::copyInternal (const File& dest) const\r
{\r
- return CopyFile (fullPath.toWideCharPointer(),\r
- dest.getFullPathName().toWideCharPointer(), false) != 0;\r
+ return CopyFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer(), false) != 0;\r
}\r
\r
bool File::moveInternal (const File& dest) const\r
{\r
- return MoveFile (fullPath.toWideCharPointer(),\r
- dest.getFullPathName().toWideCharPointer()) != 0;\r
+ return MoveFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer()) != 0;\r
}\r
\r
bool File::replaceInternal (const File& dest) const\r
{\r
- return ReplaceFile (dest.getFullPathName().toWideCharPointer(),\r
- fullPath.toWideCharPointer(),\r
- 0, REPLACEFILE_IGNORE_MERGE_ERRORS | 4 /*REPLACEFILE_IGNORE_ACL_ERRORS*/,\r
- nullptr, nullptr) != 0;\r
+ void* lpExclude = 0;\r
+ void* lpReserved = 0;\r
+\r
+ return ReplaceFile (dest.getFullPathName().toWideCharPointer(), fullPath.toWideCharPointer(),\r
+ 0, REPLACEFILE_IGNORE_MERGE_ERRORS | REPLACEFILE_IGNORE_ACL_ERRORS,\r
+ lpExclude, lpReserved) != 0;\r
}\r
\r
Result File::createDirectoryInternal (const String& fileName) const\r
{\r
LARGE_INTEGER li;\r
li.QuadPart = pos;\r
- li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart,\r
- &li.HighPart, FILE_BEGIN); // (returns -1 if it fails)\r
+ li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart, &li.HighPart, FILE_BEGIN); // (returns -1 if it fails)\r
return li.QuadPart;\r
}\r
\r
void FileInputStream::openHandle()\r
{\r
- auto h = CreateFile (file.getFullPathName().toWideCharPointer(),\r
- GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,\r
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
+ HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,\r
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
\r
if (h != INVALID_HANDLE_VALUE)\r
fileHandle = (void*) h;\r
if (fileHandle != 0)\r
{\r
DWORD actualNum = 0;\r
-\r
if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0))\r
status = WindowsFileHelpers::getResultForLastError();\r
\r
//==============================================================================\r
void FileOutputStream::openHandle()\r
{\r
- auto h = CreateFile (file.getFullPathName().toWideCharPointer(),\r
- GENERIC_WRITE, FILE_SHARE_READ, 0,\r
- OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
+ HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,\r
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
\r
if (h != INVALID_HANDLE_VALUE)\r
{\r
\r
ssize_t FileOutputStream::writeInternal (const void* bufferToWrite, size_t numBytes)\r
{\r
- DWORD actualNum = 0;\r
-\r
if (fileHandle != nullptr)\r
+ {\r
+ DWORD actualNum = 0;\r
if (! WriteFile ((HANDLE) fileHandle, bufferToWrite, (DWORD) numBytes, &actualNum, 0))\r
status = WindowsFileHelpers::getResultForLastError();\r
\r
- return (ssize_t) actualNum;\r
+ return (ssize_t) actualNum;\r
+ }\r
+\r
+ return 0;\r
}\r
\r
void FileOutputStream::flushInternal()\r
access = FILE_MAP_ALL_ACCESS;\r
}\r
\r
- auto h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,\r
- exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,\r
- createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
+ HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,\r
+ exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,\r
+ createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);\r
\r
if (h != INVALID_HANDLE_VALUE)\r
{\r
fileHandle = (void*) h;\r
\r
- auto mappingHandle = CreateFileMapping (h, 0, protect,\r
- (DWORD) (range.getEnd() >> 32),\r
- (DWORD) range.getEnd(), 0);\r
+ HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (range.getEnd() >> 32), (DWORD) range.getEnd(), 0);\r
\r
if (mappingHandle != 0)\r
{\r
using namespace WindowsFileHelpers;\r
\r
bool ok = false;\r
- auto h = CreateFile (fullPath.toWideCharPointer(),\r
- GENERIC_WRITE, FILE_SHARE_READ, 0,\r
- OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
+ HANDLE h = CreateFile (fullPath.toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,\r
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
\r
if (h != INVALID_HANDLE_VALUE)\r
{\r
//==============================================================================\r
void File::findFileSystemRoots (Array<File>& destArray)\r
{\r
- TCHAR buffer[2048] = { 0 };\r
+ TCHAR buffer [2048] = { 0 };\r
GetLogicalDriveStrings (2048, buffer);\r
\r
const TCHAR* n = buffer;\r
roots.sort (true);\r
\r
for (int i = 0; i < roots.size(); ++i)\r
- destArray.add (roots[i]);\r
+ destArray.add (roots [i]);\r
}\r
\r
//==============================================================================\r
String File::getVolumeLabel() const\r
{\r
TCHAR dest[64];\r
-\r
if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest,\r
(DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0))\r
dest[0] = 0;\r
{\r
uint64 result = 0;\r
\r
- auto h = CreateFile (getFullPathName().toWideCharPointer(),\r
- GENERIC_READ, FILE_SHARE_READ, nullptr,\r
- OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);\r
+ HANDLE h = CreateFile (getFullPathName().toWideCharPointer(),\r
+ GENERIC_READ, FILE_SHARE_READ, nullptr,\r
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);\r
\r
if (h != INVALID_HANDLE_VALUE)\r
{\r
if (fullPath.isEmpty())\r
return false;\r
\r
- auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
+ const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
\r
if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':')\r
return n != DRIVE_REMOVABLE;\r
if (fullPath.isEmpty())\r
return false;\r
\r
- auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
+ const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());\r
\r
return n == DRIVE_CDROM\r
|| n == DRIVE_REMOTE\r
\r
case tempDirectory:\r
{\r
- WCHAR dest[2048];\r
+ WCHAR dest [2048];\r
dest[0] = 0;\r
GetTempPath ((DWORD) numElementsInArray (dest), dest);\r
return File (String (dest));\r
\r
case windowsSystemDirectory:\r
{\r
- WCHAR dest[2048];\r
+ WCHAR dest [2048];\r
dest[0] = 0;\r
GetSystemDirectoryW (dest, (UINT) numElementsInArray (dest));\r
return File (String (dest));\r
//==============================================================================\r
File File::getCurrentWorkingDirectory()\r
{\r
- WCHAR dest[MAX_PATH + 256];\r
+ WCHAR dest [MAX_PATH + 256];\r
dest[0] = 0;\r
GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest);\r
return File (String (dest));\r
&& (! wantsAbsolutePath || SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI))))\r
{\r
WIN32_FIND_DATA winFindData;\r
- WCHAR resolvedPath[MAX_PATH];\r
+ WCHAR resolvedPath [MAX_PATH];\r
\r
DWORD flags = SLGP_UNCPRIORITY;\r
\r
{\r
pimpl.reset (new Pimpl (pipeName, createPipe, mustNotExist));\r
\r
- if (createPipe)\r
- {\r
- if (pimpl->pipeH == INVALID_HANDLE_VALUE)\r
- {\r
- pimpl.reset();\r
- return false;\r
- }\r
- }\r
- else if (! pimpl->connect (200))\r
+ if (createPipe && pimpl->pipeH == INVALID_HANDLE_VALUE)\r
{\r
pimpl.reset();\r
return false;\r
split[1] = sa_in6->sin6_addr.u.Byte[off];\r
#endif\r
}\r
-\r
- static IPAddress createAddress (const sockaddr_in6* sa_in6)\r
- {\r
- IPAddressByteUnion temp;\r
- uint16 arr[8];\r
-\r
- for (int i = 0; i < 8; ++i)\r
- {\r
- split (sa_in6, i * 2, temp.split);\r
- arr[i] = temp.combined;\r
- }\r
-\r
- return IPAddress (arr);\r
- }\r
-\r
- static IPAddress createAddress (const sockaddr_in* sa_in)\r
- {\r
- return IPAddress ((uint8*) &sa_in->sin_addr.s_addr, false);\r
- }\r
-\r
- template <typename Type>\r
- static void findAddresses (Array<IPAddress>& result, bool includeIPv6, Type start)\r
- {\r
- for (auto addr = start; addr != nullptr; addr = addr->Next)\r
- {\r
- if (addr->Address.lpSockaddr->sa_family == AF_INET)\r
- result.addIfNotAlreadyThere (createAddress ((sockaddr_in*) addr->Address.lpSockaddr));\r
- else if (addr->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
- result.addIfNotAlreadyThere (createAddress ((sockaddr_in6*) addr->Address.lpSockaddr));\r
- }\r
- }\r
}\r
\r
void MACAddress::findAllAddresses (Array<MACAddress>& result)\r
result.addIfNotAlreadyThere (IPAddress::local (true));\r
\r
GetAdaptersAddressesHelper addressesHelper;\r
-\r
if (addressesHelper.callGetAdaptersAddresses())\r
{\r
for (PIP_ADAPTER_ADDRESSES adapter = addressesHelper.adaptersAddresses; adapter != nullptr; adapter = adapter->Next)\r
{\r
- MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstUnicastAddress);\r
- MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstAnycastAddress);\r
- MACAddressHelpers::findAddresses (result, includeIPv6, adapter->FirstMulticastAddress);\r
+ PIP_ADAPTER_UNICAST_ADDRESS pUnicast = nullptr;\r
+ for (pUnicast = adapter->FirstUnicastAddress; pUnicast != nullptr; pUnicast = pUnicast->Next)\r
+ {\r
+ if (pUnicast->Address.lpSockaddr->sa_family == AF_INET)\r
+ {\r
+ const sockaddr_in* sa_in = (sockaddr_in*)pUnicast->Address.lpSockaddr;\r
+ IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+ {\r
+ const sockaddr_in6* sa_in6 = (sockaddr_in6*)pUnicast->Address.lpSockaddr;\r
+\r
+ ByteUnion temp;\r
+ uint16 arr[8];\r
+\r
+ for (int i = 0; i < 8; ++i)\r
+ {\r
+ MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+ arr[i] = temp.combined;\r
+ }\r
+\r
+ IPAddress ip (arr);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ }\r
+\r
+ PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = nullptr;\r
+ for (pAnycast = adapter->FirstAnycastAddress; pAnycast != nullptr; pAnycast = pAnycast->Next)\r
+ {\r
+ if (pAnycast->Address.lpSockaddr->sa_family == AF_INET)\r
+ {\r
+ const sockaddr_in* sa_in = (sockaddr_in*)pAnycast->Address.lpSockaddr;\r
+ IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ else if (pAnycast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+ {\r
+ const sockaddr_in6* sa_in6 = (sockaddr_in6*)pAnycast->Address.lpSockaddr;\r
+\r
+ ByteUnion temp;\r
+ uint16 arr[8];\r
+\r
+ for (int i = 0; i < 8; ++i)\r
+ {\r
+ MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+ arr[i] = temp.combined;\r
+ }\r
+\r
+ IPAddress ip (arr);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ }\r
+\r
+ PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = nullptr;\r
+ for (pMulticast = adapter->FirstMulticastAddress; pMulticast != nullptr; pMulticast = pMulticast->Next)\r
+ {\r
+ if (pMulticast->Address.lpSockaddr->sa_family == AF_INET)\r
+ {\r
+ const sockaddr_in* sa_in = (sockaddr_in*)pMulticast->Address.lpSockaddr;\r
+ IPAddress ip ((uint8*)&sa_in->sin_addr.s_addr, false);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ else if (pMulticast->Address.lpSockaddr->sa_family == AF_INET6 && includeIPv6)\r
+ {\r
+ const sockaddr_in6* sa_in6 = (sockaddr_in6*)pMulticast->Address.lpSockaddr;\r
+\r
+ ByteUnion temp;\r
+ uint16 arr[8];\r
+\r
+ for (int i = 0; i < 8; ++i)\r
+ {\r
+ MACAddressHelpers::split (sa_in6, i * 2, temp.split);\r
+ arr[i] = temp.combined;\r
+ }\r
+\r
+ IPAddress ip (arr);\r
+ result.addIfNotAlreadyThere (ip);\r
+ }\r
+ }\r
}\r
}\r
}\r
\r
-IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&)\r
-{\r
- // TODO\r
- return {};\r
-}\r
-\r
-\r
//==============================================================================\r
bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress,\r
const String& emailSubject,\r
\r
callCPUID (info, 7);\r
\r
- hasAVX2 = (info[1] & (1 << 5)) != 0;\r
- hasAVX512F = (info[1] & (1u << 16)) != 0;\r
- hasAVX512DQ = (info[1] & (1u << 17)) != 0;\r
- hasAVX512IFMA = (info[1] & (1u << 21)) != 0;\r
- hasAVX512PF = (info[1] & (1u << 26)) != 0;\r
- hasAVX512ER = (info[1] & (1u << 27)) != 0;\r
- hasAVX512CD = (info[1] & (1u << 28)) != 0;\r
- hasAVX512BW = (info[1] & (1u << 30)) != 0;\r
- hasAVX512VL = (info[1] & (1u << 31)) != 0;\r
- hasAVX512VBMI = (info[2] & (1u << 1)) != 0;\r
- hasAVX512VPOPCNTDQ = (info[2] & (1u << 14)) != 0;\r
+ hasAVX2 = (info[1] & (1 << 5)) != 0;\r
\r
SYSTEM_INFO systemInfo;\r
GetNativeSystemInfo (&systemInfo);\r
//==============================================================================\r
String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue)\r
{\r
- auto len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0);\r
-\r
- if (len == 0)\r
+ DWORD len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0);\r
+ if (GetLastError() == ERROR_ENVVAR_NOT_FOUND)\r
return String (defaultValue);\r
\r
HeapBlock<WCHAR> buffer (len);\r
#endif\r
\r
#if JUCE_WIN32_TIMER_PERIOD > 0\r
- auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
+ const MMRESULT res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
ignoreUnused (res);\r
jassert (res == TIMERR_NOERROR);\r
#endif\r
#endif\r
}\r
\r
-int SystemStats::getCpuSpeedInMegahertz()\r
+int SystemStats::getCpuSpeedInMegaherz()\r
{\r
- auto cycles = juce_getClockCycleCounter();\r
- auto millis = Time::getMillisecondCounter();\r
+ const int64 cycles = juce_getClockCycleCounter();\r
+ const uint32 millis = Time::getMillisecondCounter();\r
int lastResult = 0;\r
\r
for (;;)\r
int n = 1000000;\r
while (--n > 0) {}\r
\r
- auto millisElapsed = Time::getMillisecondCounter() - millis;\r
- auto cyclesNow = juce_getClockCycleCounter();\r
+ const uint32 millisElapsed = Time::getMillisecondCounter() - millis;\r
+ const int64 cyclesNow = juce_getClockCycleCounter();\r
\r
if (millisElapsed > 80)\r
{\r
- auto newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000);\r
+ const int newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000);\r
\r
if (millisElapsed > 500 || (lastResult == newResult && newResult > 100))\r
return newResult;\r
// first one sets it up, the second one kicks it in.\r
// NB: the local variable is here to avoid analysers warning about having\r
// two identical sub-expressions in the return statement\r
- auto firstCallToSetTimezone = SetLocalTime (&st) != 0;\r
+ bool firstCallToSetTimezone = SetLocalTime (&st) != 0;\r
return firstCallToSetTimezone && SetLocalTime (&st) != 0;\r
}\r
\r
String SystemStats::getLogonName()\r
{\r
TCHAR text [256] = { 0 };\r
- auto len = (DWORD) numElementsInArray (text) - 1;\r
+ DWORD len = (DWORD) numElementsInArray (text) - 1;\r
GetUserName (text, &len);\r
return String (text, len);\r
}\r
String SystemStats::getComputerName()\r
{\r
TCHAR text[128] = { 0 };\r
- auto len = (DWORD) numElementsInArray (text) - 1;\r
+ DWORD len = (DWORD) numElementsInArray (text) - 1;\r
GetComputerName (text, &len);\r
return String (text, len);\r
}\r
if (getUserDefaultUILanguage == nullptr)\r
return "en";\r
\r
- auto langID = MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT);\r
+ const DWORD langID = MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT);\r
\r
- auto mainLang = getLocaleValue (langID, LOCALE_SISO639LANGNAME, "en");\r
- auto region = getLocaleValue (langID, LOCALE_SISO3166CTRYNAME, nullptr);\r
+ String mainLang (getLocaleValue (langID, LOCALE_SISO639LANGNAME, "en"));\r
+ String region (getLocaleValue (langID, LOCALE_SISO3166CTRYNAME, nullptr));\r
\r
if (region.isNotEmpty())\r
mainLang << '-' << region;\r
namespace juce\r
{\r
\r
-/** Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa */\r
-union IPAddressByteUnion\r
-{\r
- uint16 combined;\r
- uint8 split[2];\r
-};\r
-\r
-static void zeroUnusedBytes (uint8* address) noexcept\r
-{\r
- for (int i = 4; i < 16; ++i)\r
- address[i] = 0;\r
-}\r
-\r
-IPAddress::IPAddress() noexcept\r
+IPAddress::IPAddress (bool IPv6) noexcept : isIPv6 (IPv6)\r
{\r
for (int i = 0; i < 16; ++i)\r
address[i] = 0;\r
address[i] = bytes[i];\r
\r
if (! isIPv6)\r
- zeroUnusedBytes (address);\r
+ zeroUnusedBytes();\r
}\r
\r
IPAddress::IPAddress (const uint16 bytes[8]) noexcept : isIPv6 (true)\r
{\r
- IPAddressByteUnion temp;\r
+ ByteUnion temp;\r
\r
for (int i = 0; i < 8; ++i)\r
{\r
address[0] = a0; address[1] = a1;\r
address[2] = a2; address[3] = a3;\r
\r
- zeroUnusedBytes (address);\r
+ zeroUnusedBytes();\r
}\r
\r
IPAddress::IPAddress (uint16 a1, uint16 a2, uint16 a3, uint16 a4,\r
{\r
uint16 array[8] = { a1, a2, a3, a4, a5, a6, a7, a8 };\r
\r
- IPAddressByteUnion temp;\r
+ ByteUnion temp;\r
\r
for (int i = 0; i < 8; ++i)\r
{\r
address[2] = (n >> 8) & 255;\r
address[3] = (n & 255);\r
\r
- zeroUnusedBytes (address);\r
-}\r
-\r
-bool IPAddress::isNull() const\r
-{\r
- for (int i = 0; i < 16; ++i)\r
- if (address[i] != 0)\r
- return false;\r
-\r
- return true;\r
-}\r
-\r
-static String removePort (const String& adr)\r
-{\r
- if (adr.containsAnyOf ("[]"))\r
- return adr.fromFirstOccurrenceOf ("[", false, true).upToLastOccurrenceOf ("]", false, true);\r
-\r
- if (adr.indexOf (":") == adr.lastIndexOf (":"))\r
- return adr.upToLastOccurrenceOf (":", false, true);\r
-\r
- return adr;\r
+ zeroUnusedBytes();\r
}\r
\r
IPAddress::IPAddress (const String& adr)\r
{\r
- auto ipAddress = removePort (adr);\r
-\r
- isIPv6 = ipAddress.contains (":");\r
+ isIPv6 = adr.contains (":");\r
\r
if (! isIPv6)\r
{\r
- auto tokens = StringArray::fromTokens (ipAddress, ".", {});\r
+ StringArray tokens;\r
+ tokens.addTokens (adr, ".", String());\r
\r
for (int i = 0; i < 4; ++i)\r
address[i] = (uint8) tokens[i].getIntValue();\r
-\r
- zeroUnusedBytes (address);\r
}\r
else\r
{\r
- auto tokens = StringArray::fromTokens (ipAddress, ":", {});\r
+ StringArray tokens;\r
+ tokens.addTokens (adr.removeCharacters ("[]"), ":", String());\r
\r
- if (tokens.contains ({})) // if :: shorthand has been used\r
+ if (tokens.contains (StringRef())) // if :: shorthand has been used\r
{\r
- auto idx = tokens.indexOf ({});\r
+ int idx = tokens.indexOf (StringRef());\r
tokens.set (idx, "0");\r
- tokens.removeEmptyStrings();\r
-\r
- // mapped IPv4 address will be treated as a single token, so pad the end of the StringArray\r
- if (tokens[tokens.size() - 1].containsChar ('.'))\r
- tokens.add ({});\r
\r
while (tokens.size() < 8)\r
tokens.insert (idx, "0");\r
\r
for (int i = 0; i < 8; ++i)\r
{\r
- if (i == 6 && isIPv4MappedAddress (IPAddress (address, true)))\r
- {\r
- IPAddress v4Address (tokens[i]);\r
-\r
- address[12] = v4Address.address[0];\r
- address[13] = v4Address.address[1];\r
- address[14] = v4Address.address[2];\r
- address[15] = v4Address.address[3];\r
-\r
- break;\r
- }\r
-\r
- IPAddressByteUnion temp;\r
+ ByteUnion temp;\r
temp.combined = (uint16) CharacterFunctions::HexParser<int>::parse (tokens[i].getCharPointer());\r
\r
address[i * 2] = temp.split[0];\r
return s;\r
}\r
\r
- IPAddressByteUnion temp;\r
+ String addressString;\r
+ ByteUnion temp;\r
\r
temp.split[0] = address[0];\r
temp.split[1] = address[1];\r
\r
- auto addressString = String::toHexString (temp.combined);\r
+ addressString = String (String::toHexString (temp.combined));\r
\r
for (int i = 1; i < 8; ++i)\r
{\r
temp.split[0] = address[i * 2];\r
temp.split[1] = address[i * 2 + 1];\r
\r
- addressString << ':' << String::toHexString (temp.combined);\r
+ addressString << ':' << String (String::toHexString (temp.combined));\r
}\r
\r
return getFormattedAddress (addressString);\r
}\r
\r
-bool IPAddress::operator== (const IPAddress& other) const noexcept { return compare (other) == 0; }\r
-bool IPAddress::operator!= (const IPAddress& other) const noexcept { return compare (other) != 0; }\r
-bool IPAddress::operator< (const IPAddress& other) const noexcept { return compare (other) < 0; }\r
-bool IPAddress::operator<= (const IPAddress& other) const noexcept { return compare (other) <= 0; }\r
-bool IPAddress::operator> (const IPAddress& other) const noexcept { return compare (other) > 0; }\r
-bool IPAddress::operator>= (const IPAddress& other) const noexcept { return compare (other) >= 0; }\r
-\r
-int IPAddress::compare (const IPAddress& other) const noexcept\r
-{\r
- if (isIPv6 != other.isIPv6)\r
- {\r
- if (isIPv6)\r
- {\r
- if (isIPv4MappedAddress (*this))\r
- return convertIPv4MappedAddressToIPv4 (*this).compare (other);\r
-\r
- return 1;\r
- }\r
-\r
- if (isIPv4MappedAddress (other))\r
- return compare (convertIPv4MappedAddressToIPv4 (other));\r
-\r
- return -1;\r
- }\r
-\r
- for (int i = 0; i < (isIPv6 ? 16 : 4); ++i)\r
- {\r
- if (address[i] > other.address[i]) return 1;\r
- if (address[i] < other.address[i]) return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-IPAddress IPAddress::any() noexcept { return IPAddress(); }\r
-IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); }\r
-IPAddress IPAddress::local (bool IPv6) noexcept { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1)\r
- : IPAddress (127, 0, 0, 1); }\r
+IPAddress IPAddress::any (bool IPv6) noexcept { return IPAddress (IPv6); }\r
+IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); }\r
+IPAddress IPAddress::local (bool IPv6) noexcept { return IPv6 ? IPAddress (0, 0, 0, 0, 0, 0, 0, 1)\r
+ : IPAddress (127, 0, 0, 1); }\r
\r
String IPAddress::getFormattedAddress (const String& unformattedAddress)\r
{\r
\r
for (int i = 0; i < tokens.size(); ++i)\r
{\r
- auto& t = tokens.getReference (i);\r
+ const auto& t = tokens.getReference (i);\r
\r
if (t.getHexValue32() == 0x0000)\r
{\r
return addressString;\r
}\r
\r
-bool IPAddress::isIPv4MappedAddress (const IPAddress& mappedAddress)\r
+bool IPAddress::operator== (const IPAddress& other) const noexcept\r
{\r
- if (! mappedAddress.isIPv6)\r
- return false;\r
-\r
- for (int i = 0; i < 10; ++i)\r
- if (mappedAddress.address[i] != 0)\r
+ for (int i = 0; i < (isIPv6 ? 16 : 4); ++i)\r
+ if (address[i] != other.address[i])\r
return false;\r
\r
- if (mappedAddress.address[10] != 255 || mappedAddress.address[11] != 255)\r
- return false;\r
-\r
return true;\r
-}\r
\r
-IPAddress IPAddress::convertIPv4MappedAddressToIPv4 (const IPAddress& mappedAddress)\r
-{\r
- // The address that you're converting needs to be IPv6!\r
- jassert (mappedAddress.isIPv6);\r
-\r
- if (isIPv4MappedAddress (mappedAddress))\r
- return { mappedAddress.address[12], mappedAddress.address[13],\r
- mappedAddress.address[14], mappedAddress.address[15] };\r
-\r
- return {};\r
}\r
\r
-IPAddress IPAddress::convertIPv4AddressToIPv4Mapped (const IPAddress& addressToMap)\r
+bool IPAddress::operator!= (const IPAddress& other) const noexcept\r
{\r
- // The address that you're converting needs to be IPv4!\r
- jassert (! addressToMap.isIPv6);\r
-\r
- return { 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff,\r
- static_cast<uint16> ((addressToMap.address[0] << 8) | addressToMap.address[1]),\r
- static_cast<uint16> ((addressToMap.address[2] << 8) | addressToMap.address[3]) };\r
+ return ! operator== (other);\r
}\r
\r
-IPAddress IPAddress::getLocalAddress (bool includeIPv6)\r
+#if (! JUCE_WINDOWS) && (! JUCE_ANDROID)\r
+static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& result)\r
{\r
- auto addresses = getAllAddresses (includeIPv6);\r
-\r
- for (auto& a : addresses)\r
- if (a != local())\r
- return a;\r
+ auto addr = addr_in->sin_addr.s_addr;\r
\r
- return local();\r
+ if (addr != INADDR_NONE)\r
+ result.addIfNotAlreadyThere (IPAddress (ntohl (addr)));\r
}\r
\r
-Array<IPAddress> IPAddress::getAllAddresses (bool includeIPv6)\r
+static void addAddress (const sockaddr_in6* addr_in, Array<IPAddress>& result)\r
{\r
- Array<IPAddress> addresses;\r
- findAllAddresses (addresses, includeIPv6);\r
- return addresses;\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
+ in6_addr addr = addr_in->sin6_addr;\r
\r
-struct IPAddressTests : public UnitTest\r
-{\r
- IPAddressTests()\r
- : UnitTest ("IPAddress", "Networking")\r
+ typedef union\r
{\r
- }\r
+ uint16 combined;\r
+ uint8 split[2];\r
+ } ByteUnion;\r
\r
- void runTest() override\r
- {\r
- testConstructors();\r
- testFindAllAddresses();\r
- testFindBroadcastAddress();\r
- }\r
+ ByteUnion temp;\r
+ uint16 arr[8];\r
\r
- void testConstructors()\r
+ for (int i = 0; i < 8; ++i) // Swap bytes from network to host order\r
{\r
- beginTest ("constructors");\r
-\r
- // Default IPAdress should be null\r
- IPAddress defaultConstructed;\r
- expect (defaultConstructed.isNull());\r
-\r
- auto local = IPAddress::local();\r
- expect (! local.isNull());\r
+ temp.split[0] = addr.s6_addr[i * 2 + 1];\r
+ temp.split[1] = addr.s6_addr[i * 2];\r
\r
- IPAddress ipv4{1, 2, 3, 4};\r
- expect (! ipv4.isNull());\r
- expect (! ipv4.isIPv6);\r
- expect (ipv4.toString() == "1.2.3.4");\r
+ arr[i] = temp.combined;\r
}\r
\r
- void testFindAllAddresses()\r
- {\r
- beginTest ("find all addresses");\r
-\r
- Array<IPAddress> ipv4Addresses;\r
- Array<IPAddress> allAddresses;\r
-\r
- IPAddress::findAllAddresses (ipv4Addresses, false);\r
- IPAddress::findAllAddresses (allAddresses, true);\r
-\r
- expect (allAddresses.size() >= ipv4Addresses.size());\r
+ IPAddress ip (arr);\r
+ result.addIfNotAlreadyThere (ip);\r
+}\r
\r
- for (auto& a : ipv4Addresses)\r
- {\r
- expect (! a.isNull());\r
- expect (! a.isIPv6);\r
- }\r
+void IPAddress::findAllAddresses (Array<IPAddress>& result, bool includeIPv6)\r
+{\r
+ struct ifaddrs *ifaddr, *ifa;\r
\r
- for (auto& a : allAddresses)\r
- {\r
- expect (! a.isNull());\r
- }\r
- }\r
+ if (getifaddrs (&ifaddr) == -1)\r
+ return;\r
\r
- void testFindBroadcastAddress()\r
+ for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)\r
{\r
- beginTest ("broadcast addresses");\r
-\r
- Array<IPAddress> addresses;\r
+ if (ifa->ifa_addr == nullptr)\r
+ continue;\r
\r
- // Only IPv4 interfaces have broadcast\r
- IPAddress::findAllAddresses (addresses, false);\r
-\r
- for (auto& a : addresses)\r
- {\r
- expect (! a.isNull());\r
-\r
- auto broadcastAddress = IPAddress::getInterfaceBroadcastAddress (a);\r
-\r
- // If we retrieve an address, it should be an IPv4 address\r
- if (! broadcastAddress.isNull())\r
- {\r
- expect (! a.isIPv6);\r
- }\r
- }\r
-\r
- // Expect to fail to find a broadcast for this address\r
- IPAddress address{1, 2, 3, 4};\r
- expect (IPAddress::getInterfaceBroadcastAddress (address).isNull());\r
+ if (ifa->ifa_addr->sa_family == AF_INET) addAddress ((const sockaddr_in*) ifa->ifa_addr, result);\r
+ else if (ifa->ifa_addr->sa_family == AF_INET6 && includeIPv6) addAddress ((const sockaddr_in6*) ifa->ifa_addr, result);\r
}\r
-};\r
-\r
-static IPAddressTests iPAddressTests;\r
\r
+ freeifaddrs (ifaddr);\r
+}\r
#endif\r
\r
} // namespace juce\r
class JUCE_API IPAddress final\r
{\r
public:\r
- //==============================================================================\r
- /** Returns an IP address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6) */\r
- static IPAddress any() noexcept;\r
-\r
- /** Returns an IPv4 address meaning "broadcast" (255.255.255.255) */\r
- static IPAddress broadcast() noexcept;\r
-\r
- /** Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) */\r
- static IPAddress local (bool IPv6 = false) noexcept;\r
-\r
//==============================================================================\r
/** Populates a list of all the IP addresses that this machine is using. */\r
static void findAllAddresses (Array<IPAddress>& results, bool includeIPv6 = false);\r
\r
- /** Populates a list of all the IP addresses that this machine is using. */\r
- static Array<IPAddress> getAllAddresses (bool includeIPv6 = false);\r
-\r
- /** Returns the first 'real' address for the local machine.\r
- Unlike local(), this will attempt to find the machine's actual assigned\r
- address rather than "127.0.0.1". If there are multiple network cards, this\r
- may return any of their addresses. If it doesn't find any, then it'll return\r
- local() as a fallback.\r
- */\r
- static IPAddress getLocalAddress (bool includeIPv6 = false);\r
-\r
//==============================================================================\r
- /** Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6) */\r
- IPAddress() noexcept;\r
+ /** Creates a null address - 0.0.0.0 (IPv4) or ::, (IPv6)\r
+ @param IPv6 if true indicates that this is an IPv6 address\r
+ */\r
+ IPAddress (bool IPv6 = false) noexcept;\r
\r
/** Creates an IPv4 or IPv6 address by reading 4 or 16 bytes from an array.\r
@param bytes The array containing the bytes to read.\r
@param IPv6 if true indicates that 16 bytes should be read instead of 4.\r
*/\r
- explicit IPAddress (const uint8* bytes, bool IPv6 = false) noexcept;\r
+ explicit IPAddress (const uint8 bytes[], bool IPv6 = false) noexcept;\r
\r
/** Creates an IPv6 address from an array of 8 16-bit integers\r
@param bytes The array containing the bytes to read.\r
*/\r
- explicit IPAddress (const uint16* bytes) noexcept;\r
+ explicit IPAddress (const uint16 bytes[8]) noexcept;\r
\r
/** Creates an IPv4 address from 4 bytes. */\r
IPAddress (uint8 address1, uint8 address2, uint8 address3, uint8 address4) noexcept;\r
/** Parses a string IP address of the form "1.2.3.4" (IPv4) or "1:2:3:4:5:6:7:8" (IPv6). */\r
explicit IPAddress (const String& address);\r
\r
- /** Returns whether the address contains the null address (e.g. 0.0.0.0). */\r
- bool isNull() const;\r
-\r
- //==============================================================================\r
/** Returns a dot- or colon-separated string in the form "1.2.3.4" (IPv4) or "1:2:3:4:5:6:7:8" (IPv6). */\r
String toString() const;\r
\r
- /** Compares this IPAddress with another.\r
+ /** Returns an IPv4 or IPv6 address meaning "any", equivalent to 0.0.0.0 (IPv4) or ::, (IPv6) */\r
+ static IPAddress any (bool IPv6 = false) noexcept;\r
\r
- @returns 0 if the two addresses are identical, negative if this address is smaller than\r
- the other one, or positive if is greater.\r
- */\r
- int compare (const IPAddress&) const noexcept;\r
-\r
- bool operator== (const IPAddress&) const noexcept;\r
- bool operator!= (const IPAddress&) const noexcept;\r
- bool operator< (const IPAddress&) const noexcept;\r
- bool operator> (const IPAddress&) const noexcept;\r
- bool operator<= (const IPAddress&) const noexcept;\r
- bool operator>= (const IPAddress&) const noexcept;\r
-\r
- //==============================================================================\r
- /** The elements of the IP address. */\r
- uint8 address[16];\r
+ /** Returns an IPv4 address meaning "broadcast" (255.255.255.255) */\r
+ static IPAddress broadcast() noexcept;\r
\r
- bool isIPv6 = false;\r
+ /** Returns an IPv4 or IPv6 address meaning "localhost", equivalent to 127.0.0.1 (IPv4) or ::1 (IPv6) */\r
+ static IPAddress local (bool IPv6 = false) noexcept;\r
\r
- //==============================================================================\r
/** Returns a formatted version of the provided IPv6 address conforming to RFC 5952 with leading zeros suppressed,\r
lower case characters, and double-colon notation used to represent contiguous 16-bit fields of zeros.\r
\r
- @param unformattedAddress the IPv6 address to be formatted\r
+ @param unformattedAddress the IPv6 address to be formatted\r
*/\r
static String getFormattedAddress (const String& unformattedAddress);\r
\r
- /** Returns true if the given IP address is an IPv4-mapped IPv6 address. */\r
- static bool isIPv4MappedAddress (const IPAddress& mappedAddress);\r
-\r
- /** Converts an IPv4-mapped IPv6 address to an IPv4 address.\r
- If the address is not IPv4-mapped, this will return a null address.\r
- */\r
- static IPAddress convertIPv4MappedAddressToIPv4 (const IPAddress& mappedAddress);\r
+ bool operator== (const IPAddress& other) const noexcept;\r
+ bool operator!= (const IPAddress& other) const noexcept;\r
\r
- /** Converts an IPv4 address to an IPv4-mapped IPv6 address. */\r
- static IPAddress convertIPv4AddressToIPv4Mapped (const IPAddress& addressToMap);\r
+ /** The elements of the IP address. */\r
+ uint8 address[16];\r
\r
- /** If the IPAdress is the address of an interface on the machine, returns the associated broadcast address.\r
- If the address is not an interface, it will return a null address.\r
- */\r
- static IPAddress getInterfaceBroadcastAddress (const IPAddress& interfaceAddress);\r
+ bool isIPv6;\r
+\r
+private:\r
+ /** Union used to split a 16-bit unsigned integer into 2 8-bit unsigned integers or vice-versa */\r
+ typedef union\r
+ {\r
+ uint16 combined;\r
+ uint8 split[2];\r
+ } ByteUnion;\r
+\r
+ /** Method used to zero the remaining bytes of the address array when creating IPv4 addresses */\r
+ void zeroUnusedBytes()\r
+ {\r
+ for (int i = 4; i < 16; ++i)\r
+ address[i] = 0;\r
+ }\r
};\r
\r
} // namespace juce\r
return n;\r
}\r
\r
-Array<MACAddress> MACAddress::getAllAddresses()\r
-{\r
- Array<MACAddress> addresses;\r
- findAllAddresses (addresses);\r
- return addresses;\r
-}\r
-\r
bool MACAddress::isNull() const noexcept { return toInt64() == 0; }\r
\r
bool MACAddress::operator== (const MACAddress& other) const noexcept { return memcmp (address, other.address, sizeof (address)) == 0; }\r
{\r
public:\r
//==============================================================================\r
- /** Returns a list of the MAC addresses of all the available network cards. */\r
- static Array<MACAddress> getAllAddresses();\r
-\r
/** Populates a list of the MAC addresses of all the available network cards. */\r
static void findAllAddresses (Array<MACAddress>& results);\r
\r
\r
// other methods for this class are implemented in the platform-specific files\r
\r
-//==============================================================================\r
-\r
-#if JUCE_UNIT_TESTS\r
-\r
-class NamedPipeTests : public UnitTest\r
-{\r
-public:\r
- //==============================================================================\r
- NamedPipeTests()\r
- : UnitTest ("NamedPipe", "Networking")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- const String pipeName ("TestPipe");\r
-\r
- beginTest ("Pre test cleanup");\r
- {\r
- NamedPipe pipe;\r
- expect (pipe.createNewPipe (pipeName, false));\r
- }\r
-\r
- beginTest ("Create pipe");\r
- {\r
- NamedPipe pipe;\r
- expect (! pipe.isOpen());\r
-\r
- expect (pipe.createNewPipe (pipeName, true));\r
- expect (pipe.isOpen());\r
-\r
- expect (pipe.createNewPipe (pipeName, false));\r
- expect (pipe.isOpen());\r
-\r
- NamedPipe otherPipe;\r
- expect (! otherPipe.createNewPipe (pipeName, true));\r
- expect (! otherPipe.isOpen());\r
- }\r
-\r
- beginTest ("Existing pipe");\r
- {\r
- NamedPipe pipe;\r
-\r
- expect (! pipe.openExisting (pipeName));\r
- expect (! pipe.isOpen());\r
-\r
- expect (pipe.createNewPipe (pipeName, true));\r
-\r
- NamedPipe otherPipe;\r
- expect (otherPipe.openExisting (pipeName));\r
- expect (otherPipe.isOpen());\r
- }\r
-\r
- int sendData = 4684682;\r
-\r
- beginTest ("Receive message created pipe");\r
- {\r
- NamedPipe pipe;\r
- expect (pipe.createNewPipe (pipeName, true));\r
-\r
- WaitableEvent senderFinished;\r
- SenderThread sender (pipeName, false, senderFinished, sendData);\r
-\r
- sender.startThread();\r
-\r
- int recvData = -1;\r
- auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);\r
-\r
- expect (senderFinished.wait (4000));\r
-\r
- expectEquals (bytesRead, (int) sizeof (recvData));\r
- expectEquals (sender.result, (int) sizeof (sendData));\r
- expectEquals (recvData, sendData);\r
- }\r
-\r
- beginTest ("Receive message existing pipe");\r
- {\r
- WaitableEvent senderFinished;\r
- SenderThread sender (pipeName, true, senderFinished, sendData);\r
-\r
- NamedPipe pipe;\r
- expect (pipe.openExisting (pipeName));\r
-\r
- sender.startThread();\r
-\r
- int recvData = -1;\r
- auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);\r
-\r
- expect (senderFinished.wait (4000));\r
-\r
- expectEquals (bytesRead, (int) sizeof (recvData));\r
- expectEquals (sender.result, (int) sizeof (sendData));\r
- expectEquals (recvData, sendData);\r
- }\r
-\r
- beginTest ("Send message created pipe");\r
- {\r
- NamedPipe pipe;\r
- expect (pipe.createNewPipe (pipeName, true));\r
-\r
- WaitableEvent receiverFinished;\r
- ReceiverThread receiver (pipeName, false, receiverFinished);\r
-\r
- receiver.startThread();\r
-\r
- auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);\r
-\r
- expect (receiverFinished.wait (4000));\r
-\r
- expectEquals (bytesWritten, (int) sizeof (sendData));\r
- expectEquals (receiver.result, (int) sizeof (receiver.recvData));\r
- expectEquals (receiver.recvData, sendData);\r
- }\r
-\r
- beginTest ("Send message existing pipe");\r
- {\r
- WaitableEvent receiverFinished;\r
- ReceiverThread receiver (pipeName, true, receiverFinished);\r
-\r
- NamedPipe pipe;\r
- expect (pipe.openExisting (pipeName));\r
-\r
- receiver.startThread();\r
-\r
- auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);\r
-\r
- expect (receiverFinished.wait (4000));\r
-\r
- expectEquals (bytesWritten, (int) sizeof (sendData));\r
- expectEquals (receiver.result, (int) sizeof (receiver.recvData));\r
- expectEquals (receiver.recvData, sendData);\r
- }\r
- }\r
-\r
-private:\r
- //==============================================================================\r
- struct NamedPipeThread : public Thread\r
- {\r
- NamedPipeThread (const String& threadName, const String& pName,\r
- bool shouldCreatePipe, WaitableEvent& completed)\r
- : Thread (threadName), pipeName (pName), workCompleted (completed)\r
- {\r
- if (shouldCreatePipe)\r
- pipe.createNewPipe (pipeName);\r
- else\r
- pipe.openExisting (pipeName);\r
- }\r
-\r
- NamedPipe pipe;\r
- const String& pipeName;\r
- WaitableEvent& workCompleted;\r
-\r
- int result = -2;\r
- };\r
-\r
- //==============================================================================\r
- struct SenderThread : public NamedPipeThread\r
- {\r
- SenderThread (const String& pName, bool shouldCreatePipe,\r
- WaitableEvent& completed, int sData)\r
- : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed),\r
- sendData (sData)\r
- {}\r
-\r
- void run() override\r
- {\r
- result = pipe.write (&sendData, sizeof (sendData), 2000);\r
- workCompleted.signal();\r
- }\r
-\r
- const int sendData;\r
- };\r
-\r
- //==============================================================================\r
- struct ReceiverThread : public NamedPipeThread\r
- {\r
- ReceiverThread (const String& pName, bool shouldCreatePipe,\r
- WaitableEvent& completed)\r
- : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed)\r
- {}\r
-\r
- void run() override\r
- {\r
- result = pipe.read (&recvData, sizeof (recvData), 2000);\r
- workCompleted.signal();\r
- }\r
-\r
- int recvData = -2;\r
- };\r
-};\r
-\r
-static NamedPipeTests namedPipeTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
}\r
else\r
{\r
- timeoutp = nullptr;\r
+ timeoutp = 0;\r
}\r
\r
fd_set rset, wset;\r
#else\r
{\r
int result;\r
-\r
- while ((result = select (h + 1, prset, pwset, nullptr, timeoutp)) < 0\r
+ while ((result = select (h + 1, prset, pwset, 0, timeoutp)) < 0\r
&& errno == EINTR)\r
{\r
}\r
if (! isConnected())\r
return false;\r
\r
+ Array<IPAddress> localAddresses;\r
+ IPAddress::findAllAddresses (localAddresses);\r
IPAddress currentIP (SocketHelpers::getConnectedAddress (handle));\r
\r
- for (auto& a : IPAddress::getAllAddresses())\r
+ for (auto& a : localAddresses)\r
if (a == currentIP)\r
return true;\r
\r
network address otherwise this function will fail.\r
@returns true on success; false may indicate that another socket is already bound\r
on the same port\r
- @see bindToPort(int localPortNumber), IPAddress::getAllAddresses\r
+ @see bindToPort(int localPortNumber), IPAddress::findAllAddresses\r
*/\r
bool bindToPort (int localPortNumber, const String& localAddress);\r
\r
network address otherwise this function will fail.\r
@returns true on success; false may indicate that another socket is already bound\r
on the same port\r
- @see bindToPort(int localPortNumber), IPAddress::getAllAddresses\r
+ @see bindToPort(int localPortNumber), IPAddress::findAllAddresses\r
*/\r
bool bindToPort (int localPortNumber, const String& localAddress);\r
\r
if (listener != nullptr)\r
listener->progress (this, downloaded, contentLength);\r
\r
- auto max = jmin ((int) bufferSize, contentLength < 0 ? std::numeric_limits<int>::max()\r
- : static_cast<int> (contentLength - downloaded));\r
+ const int max = jmin ((int) bufferSize, contentLength < 0 ? std::numeric_limits<int>::max()\r
+ : static_cast<int> (contentLength - downloaded));\r
\r
- auto actual = stream->read (buffer.get(), max);\r
+ const int actual = stream->read (buffer.get(), max);\r
\r
if (actual < 0 || threadShouldExit() || stream->isError())\r
break;\r
const size_t bufferSize = 0x8000;\r
targetFileToUse.deleteFile();\r
\r
- if (auto outputStream = std::unique_ptr<FileOutputStream> (targetFileToUse.createOutputStream (bufferSize)))\r
+ std::unique_ptr<FileOutputStream> outputStream (targetFileToUse.createOutputStream (bufferSize));\r
+\r
+ if (outputStream != nullptr)\r
{\r
std::unique_ptr<WebInputStream> stream (new WebInputStream (urlToUse, usePostRequest));\r
stream->withExtraHeaders (extraHeadersToUse);\r
{\r
do\r
{\r
- auto nextAmp = url.indexOfChar (i + 1, '&');\r
- auto equalsPos = url.indexOfChar (i + 1, '=');\r
+ const int nextAmp = url.indexOfChar (i + 1, '&');\r
+ const int equalsPos = url.indexOfChar (i + 1, '=');\r
\r
if (nextAmp < 0)\r
{\r
parameterValues.add (value);\r
}\r
\r
-String URL::toString (bool includeGetParameters) const\r
+String URL::toString (const bool includeGetParameters) const\r
{\r
if (includeGetParameters && parameterNames.size() > 0)\r
return url + "?" + URLHelpers::getMangledParameters (*this);\r
BOOL isBookmarkStale = false;\r
NSError* error = nil;\r
\r
- auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
- options: 0\r
- relativeToURL: nil\r
- bookmarkDataIsStale: &isBookmarkStale\r
- error: &error];\r
+ auto* nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
+ options: 0\r
+ relativeToURL: nil\r
+ bookmarkDataIsStale: &isBookmarkStale\r
+ error: &error];\r
\r
if (error == nil)\r
{\r
}\r
else\r
{\r
- auto desc = [error localizedDescription];\r
+ auto* desc = [error localizedDescription];\r
ignoreUnused (desc);\r
jassertfalse;\r
}\r
BOOL isBookmarkStale = false;\r
NSError* error = nil;\r
\r
- auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
- options: 0\r
- relativeToURL: nil\r
- bookmarkDataIsStale: &isBookmarkStale\r
+ auto* nsURL = [NSURL URLByResolvingBookmarkData: bookmark\r
+ options: 0\r
+ relativeToURL: nil\r
+ bookmarkDataIsStale: &isBookmarkStale\r
error: &error];\r
\r
if (error == nil)\r
}\r
else\r
{\r
- auto desc = [error localizedDescription];\r
+ auto* desc = [error localizedDescription];\r
ignoreUnused (desc);\r
jassertfalse;\r
}\r
#endif\r
\r
//==============================================================================\r
-InputStream* URL::createInputStream (bool usePostCommand,\r
- OpenStreamProgressCallback* progressCallback,\r
- void* progressCallbackContext,\r
+InputStream* URL::createInputStream (const bool usePostCommand,\r
+ OpenStreamProgressCallback* const progressCallback,\r
+ void* const progressCallbackContext,\r
String headers,\r
- int timeOutMs,\r
- StringPairArray* responseHeaders,\r
+ const int timeOutMs,\r
+ StringPairArray* const responseHeaders,\r
int* statusCode,\r
- int numRedirectsToFollow,\r
+ const int numRedirectsToFollow,\r
String httpRequestCmd) const\r
{\r
if (isLocalFile())\r
\r
bool postDataSendProgress (WebInputStream&, int bytesSent, int totalBytes) override\r
{\r
- return callback (data, bytesSent, totalBytes);\r
+ return callback(data, bytesSent, totalBytes);\r
}\r
\r
- OpenStreamProgressCallback* callback;\r
+ OpenStreamProgressCallback* const callback;\r
void* const data;\r
\r
// workaround a MSVC 2013 compiler warning\r
{\r
if (utf8.getUnchecked(i) == '%')\r
{\r
- auto hexDigit1 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 1]);\r
- auto hexDigit2 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 2]);\r
+ const int hexDigit1 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 1]);\r
+ const int hexDigit2 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 2]);\r
\r
if (hexDigit1 >= 0 && hexDigit2 >= 0)\r
{\r
It allows your app to receive progress updates during a lengthy POST operation. If you\r
want to continue the operation, this should return true, or false to abort.\r
*/\r
- using OpenStreamProgressCallback = bool (void* context, int bytesSent, int totalBytes);\r
+ typedef bool (OpenStreamProgressCallback) (void* context, int bytesSent, int totalBytes);\r
\r
/** Attempts to open a stream that can read from this URL.\r
\r
\r
//==============================================================================\r
/** Represents a download task.\r
- Returned by downloadToFile to allow querying and controlling the download task.\r
+ Returned by downloadToFile to allow querying and controling the download task.\r
*/\r
class DownloadTask\r
{\r
If it fails, or if the text that it reads can't be parsed as XML, this will\r
return nullptr.\r
\r
- When it returns a valid XmlElement object, the caller is responsible for deleting\r
+ When it returns a valid XmlElement object, the caller is responsibile for deleting\r
this object when no longer needed.\r
\r
Note that on some platforms (Android, for example) it's not permitted to do any network\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Upload)\r
};\r
\r
+ friend struct ContainerDeletePolicy<Upload>;\r
ReferenceCountedArray<Upload> filesToUpload;\r
\r
#if JUCE_IOS\r
\r
If getResponseHeaders is called without an established connection, then\r
getResponseHeaders will call connect internally and block until connect\r
- returns - either due to a successful connection or a connection\r
+ returns - either due to a succesful connection or a connection\r
error.\r
\r
@see connect\r
\r
If getStatusCode is called without an established connection, then\r
getStatusCode will call connect internally and block until connect\r
- returns - either due to a successful connection or a connection\r
+ returns - either due to a succesful connection or a connection\r
error.\r
\r
@see connect\r
\r
If getTotalLength is called without an established connection, then\r
getTotalLength will call connect internally and block until connect\r
- returns - either due to a successful connection or a connection\r
+ returns - either due to a succesful connection or a connection\r
error.\r
\r
If the size of the stream isn't actually known, this will return -1.\r
return InputStream::readString();\r
}\r
\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct BufferedInputStreamTests : public UnitTest\r
-{\r
- BufferedInputStreamTests()\r
- : UnitTest ("BufferedInputStream", "Streams")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
- MemoryInputStream mi (data, true);\r
-\r
- BufferedInputStream stream (mi, (int) data.getSize());\r
-\r
- beginTest ("Read");\r
-\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- size_t numBytesRead = 0;\r
- MemoryBlock readBuffer (data.getSize());\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- expectEquals (stream.peekByte(), *(char*) (data.begin() + numBytesRead));\r
-\r
- numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- expect (readBuffer == data);\r
-\r
- beginTest ("Skip");\r
-\r
- stream.setPosition (0);\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- numBytesRead = 0;\r
- const int numBytesToSkip = 5;\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- expectEquals (stream.peekByte(), *(char*) (data.begin() + numBytesRead));\r
-\r
- stream.skipNextBytes (numBytesToSkip);\r
- numBytesRead += numBytesToSkip;\r
- numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
- }\r
-};\r
-\r
-static BufferedInputStreamTests bufferedInputStreamTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
/** Destructor. */\r
~FileInputSource();\r
\r
- InputStream* createInputStream() override;\r
- InputStream* createInputStreamFor (const String& relatedItemPath) override;\r
- int64 hashCode() const override;\r
+ InputStream* createInputStream();\r
+ InputStream* createInputStreamFor (const String& relatedItemPath);\r
+ int64 hashCode() const;\r
\r
private:\r
//==============================================================================\r
\r
/** Reads and discards a number of bytes from the stream.\r
\r
- Some input streams might implement this more efficiently, but the base\r
+ Some input streams might implement this efficiently, but the base\r
class will just keep reading data until the requisite number of bytes\r
- have been done. For large skips it may be quicker to call setPosition()\r
- with the required position.\r
+ have been done.\r
*/\r
virtual void skipNextBytes (int64 numBytesToSkip);\r
\r
return (int64) position;\r
}\r
\r
-void MemoryInputStream::skipNextBytes (int64 numBytesToSkip)\r
-{\r
- if (numBytesToSkip > 0)\r
- setPosition (getPosition() + numBytesToSkip);\r
-}\r
\r
//==============================================================================\r
#if JUCE_UNIT_TESTS\r
class MemoryStreamTests : public UnitTest\r
{\r
public:\r
- MemoryStreamTests()\r
- : UnitTest ("MemoryInputStream & MemoryOutputStream", "Streams")\r
- {}\r
+ MemoryStreamTests() : UnitTest ("MemoryInputStream & MemoryOutputStream", "Memory Streams") {}\r
\r
void runTest() override\r
{\r
expect (mi.readInt64BigEndian() == randomInt64);\r
expect (mi.readDouble() == randomDouble);\r
expect (mi.readDoubleBigEndian() == randomDouble);\r
-\r
- const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
- MemoryInputStream stream (data, true);\r
-\r
- beginTest ("Read");\r
-\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- size_t numBytesRead = 0;\r
- MemoryBlock readBuffer (data.getSize());\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- expect (readBuffer == data);\r
-\r
- beginTest ("Skip");\r
-\r
- stream.setPosition (0);\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- numBytesRead = 0;\r
- const int numBytesToSkip = 5;\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- stream.skipNextBytes (numBytesToSkip);\r
- numBytesRead += numBytesToSkip;\r
- numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
}\r
\r
static String createRandomWideCharString (Random& r)\r
int64 getTotalLength() override;\r
bool isExhausted() override;\r
int read (void* destBuffer, int maxBytesToRead) override;\r
- void skipNextBytes (int64 numBytesToSkip) override;\r
\r
private:\r
//==============================================================================\r
\r
bool MemoryOutputStream::write (const void* const buffer, size_t howMany)\r
{\r
+ jassert (buffer != nullptr);\r
+\r
if (howMany == 0)\r
return true;\r
\r
- jassert (buffer != nullptr);\r
-\r
if (auto* dest = prepareToWrite (howMany))\r
{\r
memcpy (dest, buffer, howMany);\r
public:\r
//==============================================================================\r
/** Creates an empty memory stream, ready to be written into.\r
- @param initialSize the initial amount of capacity to allocate for writing into\r
+ @param initialSize the intial amount of capacity to allocate for writing into\r
*/\r
MemoryOutputStream (size_t initialSize = 256);\r
\r
return source->isExhausted();\r
}\r
\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct SubregionInputStreamTests : public UnitTest\r
-{\r
- SubregionInputStreamTests()\r
- : UnitTest ("SubregionInputStream", "Streams")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- const MemoryBlock data ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52);\r
- MemoryInputStream mi (data, true);\r
-\r
- const int offset = getRandom().nextInt ((int) data.getSize());\r
- const size_t subregionSize = data.getSize() - (size_t) offset;\r
-\r
- SubregionStream stream (&mi, offset, (int) subregionSize, false);\r
-\r
- beginTest ("Read");\r
-\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) subregionSize);\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- size_t numBytesRead = 0;\r
- MemoryBlock readBuffer (subregionSize);\r
-\r
- while (numBytesRead < subregionSize)\r
- {\r
- numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (subregionSize - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == subregionSize));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) subregionSize);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- const MemoryBlock memoryBlockToCheck (data.begin() + (size_t) offset, data.getSize() - (size_t) offset);\r
- expect (readBuffer == memoryBlockToCheck);\r
-\r
- beginTest ("Skip");\r
-\r
- stream.setPosition (0);\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) subregionSize);\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- numBytesRead = 0;\r
- const int64 numBytesToSkip = 5;\r
-\r
- while (numBytesRead < subregionSize)\r
- {\r
- stream.skipNextBytes (numBytesToSkip);\r
- numBytesRead += numBytesToSkip;\r
- numBytesRead = std::min (numBytesRead, subregionSize);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (subregionSize - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == subregionSize));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) subregionSize);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
- }\r
-};\r
-\r
-static SubregionInputStreamTests subregionInputStreamTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
/** Destructor. */\r
~URLInputSource();\r
\r
- InputStream* createInputStream() override;\r
- InputStream* createInputStreamFor (const String& relatedItemPath) override;\r
- int64 hashCode() const override;\r
+ InputStream* createInputStream();\r
+ InputStream* createInputStreamFor (const String& relatedItemPath);\r
+ int64 hashCode() const;\r
\r
private:\r
//==============================================================================\r
#define JUCE_CONSTEXPR\r
#endif\r
\r
-#if (! JUCE_MSVC) && (! JUCE_CXX14_IS_AVAILABLE)\r
-namespace std\r
-{\r
- template<typename T, typename... Args>\r
- unique_ptr<T> make_unique (Args&&... args)\r
- {\r
- return unique_ptr<T> (new T (forward<Args> (args)...));\r
- }\r
-}\r
-#endif\r
-\r
#if ! DOXYGEN\r
// These are old flags that are now supported on all compatible build targets\r
#define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1\r
\r
#if JUCE_ALLOW_STATIC_NULL_VARIABLES\r
#if ! (defined (DOXYGEN) || defined (JUCE_GCC) || (JUCE_MSVC && _MSC_VER <= 1900))\r
- #define JUCE_DEPRECATED_STATIC(valueDef) JUCE_DEPRECATED_ATTRIBUTE valueDef\r
+ #define JUCE_DEPRECATED_STATIC(valueDef) JUCE_DEPRECATED (valueDef)\r
\r
#if JUCE_MSVC\r
#define JUCE_DECLARE_DEPRECATED_STATIC(valueDef) \\r
See also SystemStats::getJUCEVersion() for a string version.\r
*/\r
#define JUCE_MAJOR_VERSION 5\r
-#define JUCE_MINOR_VERSION 4\r
-#define JUCE_BUILDNUMBER 1\r
+#define JUCE_MINOR_VERSION 3\r
+#define JUCE_BUILDNUMBER 2\r
\r
/** Current JUCE version number.\r
\r
#include <algorithm>\r
#include <limits>\r
#include <atomic>\r
-#include <sstream>\r
-#include <iomanip>\r
\r
//==============================================================================\r
#include "juce_CompilerSupport.h"\r
}\r
else\r
{\r
- for (auto& address : MACAddress::getAllAddresses())\r
+ Array<MACAddress> addresses;\r
+ MACAddress::findAllAddresses (addresses);\r
+ for (auto& address : addresses)\r
ids.add (address.toString());\r
}\r
\r
- jassert (! ids.isEmpty()); // Failed to create any IDs!\r
+ jassert (ids.size() > 0); // Failed to create any IDs!\r
return ids;\r
}\r
\r
\r
int numLogicalCPUs = 0, numPhysicalCPUs = 0;\r
\r
- bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false,\r
- has3DNow = false, hasSSSE3 = false, hasSSE41 = false,\r
- hasSSE42 = false, hasAVX = false, hasAVX2 = false,\r
- hasAVX512F = false, hasAVX512BW = false, hasAVX512CD = false,\r
- hasAVX512DQ = false, hasAVX512ER = false, hasAVX512IFMA = false,\r
- hasAVX512PF = false, hasAVX512VBMI = false, hasAVX512VL = false,\r
- hasAVX512VPOPCNTDQ = false,\r
- hasNeon = false;\r
+ bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false,\r
+ has3DNow = false, hasSSSE3 = false, hasSSE41 = false,\r
+ hasSSE42 = false, hasAVX = false, hasAVX2 = false, hasNeon = false;\r
};\r
\r
static const CPUInformation& getCPUInformation() noexcept\r
bool SystemStats::hasSSE42() noexcept { return getCPUInformation().hasSSE42; }\r
bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; }\r
bool SystemStats::hasAVX2() noexcept { return getCPUInformation().hasAVX2; }\r
-bool SystemStats::hasAVX512F() noexcept { return getCPUInformation().hasAVX512F; }\r
-bool SystemStats::hasAVX512BW() noexcept { return getCPUInformation().hasAVX512BW; }\r
-bool SystemStats::hasAVX512CD() noexcept { return getCPUInformation().hasAVX512CD; }\r
-bool SystemStats::hasAVX512DQ() noexcept { return getCPUInformation().hasAVX512DQ; }\r
-bool SystemStats::hasAVX512ER() noexcept { return getCPUInformation().hasAVX512ER; }\r
-bool SystemStats::hasAVX512IFMA() noexcept { return getCPUInformation().hasAVX512IFMA; }\r
-bool SystemStats::hasAVX512PF() noexcept { return getCPUInformation().hasAVX512PF; }\r
-bool SystemStats::hasAVX512VBMI() noexcept { return getCPUInformation().hasAVX512VBMI; }\r
-bool SystemStats::hasAVX512VL() noexcept { return getCPUInformation().hasAVX512VL; }\r
-bool SystemStats::hasAVX512VPOPCNTDQ() noexcept { return getCPUInformation().hasAVX512VPOPCNTDQ; }\r
bool SystemStats::hasNeon() noexcept { return getCPUInformation().hasNeon; }\r
\r
\r
@returns the speed in megahertz, e.g. 1500, 2500, 32000 (depending on\r
what year you're reading this...)\r
*/\r
- static int getCpuSpeedInMegahertz();\r
+ static int getCpuSpeedInMegaherz();\r
\r
/** Returns a string to indicate the CPU vendor.\r
Might not be known on some systems.\r
*/\r
static String getCpuModel();\r
\r
- static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */\r
- static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */\r
- static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */\r
- static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */\r
- static bool hasSSE3() noexcept; /**< Returns true if Intel SSE3 instructions are available. */\r
- static bool hasSSSE3() noexcept; /**< Returns true if Intel SSSE3 instructions are available. */\r
- static bool hasSSE41() noexcept; /**< Returns true if Intel SSE4.1 instructions are available. */\r
- static bool hasSSE42() noexcept; /**< Returns true if Intel SSE4.2 instructions are available. */\r
- static bool hasAVX() noexcept; /**< Returns true if Intel AVX instructions are available. */\r
- static bool hasAVX2() noexcept; /**< Returns true if Intel AVX2 instructions are available. */\r
- static bool hasAVX512F() noexcept; /**< Returns true if Intel AVX-512 Foundation instructions are available. */\r
- static bool hasAVX512BW() noexcept; /**< Returns true if Intel AVX-512 Byte and Word instructions are available. */\r
- static bool hasAVX512CD() noexcept; /**< Returns true if Intel AVX-512 Conflict Detection instructions are available. */\r
- static bool hasAVX512DQ() noexcept; /**< Returns true if Intel AVX-512 Doubleword and Quadword instructions are available. */\r
- static bool hasAVX512ER() noexcept; /**< Returns true if Intel AVX-512 Exponential and Reciprocal instructions are available. */\r
- static bool hasAVX512IFMA() noexcept; /**< Returns true if Intel AVX-512 Integer Fused Multiply-Add instructions are available. */\r
- static bool hasAVX512PF() noexcept; /**< Returns true if Intel AVX-512 Prefetch instructions are available. */\r
- static bool hasAVX512VBMI() noexcept; /**< Returns true if Intel AVX-512 Vector Bit Manipulation instructions are available. */\r
- static bool hasAVX512VL() noexcept; /**< Returns true if Intel AVX-512 Vector Length instructions are available. */\r
- static bool hasAVX512VPOPCNTDQ() noexcept; /**< Returns true if Intel AVX-512 Vector Population Count Double and Quad-word instructions are available. */\r
- static bool hasNeon() noexcept; /**< Returns true if ARM NEON instructions are available. */\r
+ static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */\r
+ static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */\r
+ static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */\r
+ static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */\r
+ static bool hasSSE3() noexcept; /**< Returns true if Intel SSE3 instructions are available. */\r
+ static bool hasSSSE3() noexcept; /**< Returns true if Intel SSSE3 instructions are available. */\r
+ static bool hasSSE41() noexcept; /**< Returns true if Intel SSE4.1 instructions are available. */\r
+ static bool hasSSE42() noexcept; /**< Returns true if Intel SSE4.2 instructions are available. */\r
+ static bool hasAVX() noexcept; /**< Returns true if Intel AVX instructions are available. */\r
+ static bool hasAVX2() noexcept; /**< Returns true if Intel AVX2 instructions are available. */\r
+ static bool hasNeon() noexcept; /**< Returns true if ARM NEON instructions are available. */\r
\r
//==============================================================================\r
/** Finds out how much RAM is in the machine.\r
*/\r
static String getStackBacktrace();\r
\r
- /** A function type for use in setApplicationCrashHandler().\r
- When called, its void* argument will contain platform-specific data about the crash.\r
+ /** A function type for use in setApplicationCrashHandler(). The parameter will contain\r
+ platform-specific data about the crash.\r
*/\r
- using CrashHandlerFunction = void(*)(void*);\r
+ typedef void (*CrashHandlerFunction) (void*);\r
\r
/** Sets up a global callback function that will be called if the application\r
executes some kind of illegal instruction.\r
static void setApplicationCrashHandler (CrashHandlerFunction);\r
\r
/** Returns true if this code is running inside an app extension sandbox.\r
+\r
This function will always return false on windows, linux and android.\r
*/\r
static bool isRunningInAppExtensionSandbox() noexcept;\r
\r
-\r
+private:\r
//==============================================================================\r
- // This method was spelt wrong! Please change your code to use getCpuSpeedInMegahertz() instead\r
- JUCE_DEPRECATED_WITH_BODY (static int getCpuSpeedInMegaherz(), { return getCpuSpeedInMegahertz(); })\r
+ SystemStats();\r
\r
-private:\r
- SystemStats() = delete; // uses only static methods\r
JUCE_DECLARE_NON_COPYABLE (SystemStats)\r
};\r
\r
StringArray countryCodes;\r
StringPairArray translations;\r
std::unique_ptr<LocalisedStrings> fallback;\r
+ friend struct ContainerDeletePolicy<LocalisedStrings>;\r
\r
void loadFromText (const String&, bool ignoreCase);\r
\r
}\r
};\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const String String::empty;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const String String::empty);\r
\r
//==============================================================================\r
String::String() noexcept : text (&(emptyString.text))\r
String::String (const CharPointer_UTF32 t) : text (StringHolder::createFromCharPointer (t)) {}\r
String::String (const CharPointer_ASCII t) : text (StringHolder::createFromCharPointer (t)) {}\r
\r
-String::String (CharPointer_UTF8 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (CharPointer_UTF16 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (CharPointer_UTF32 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
-String::String (const wchar_t* t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {}\r
+String::String (const CharPointer_UTF8 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const CharPointer_UTF16 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const CharPointer_UTF32 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {}\r
+String::String (const wchar_t* const t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {}\r
\r
-String::String (CharPointer_UTF8 start, CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
-String::String (CharPointer_UTF16 start, CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
-String::String (CharPointer_UTF32 start, CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF8 start, const CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF16 start, const CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
+String::String (const CharPointer_UTF32 start, const CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {}\r
\r
String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {}\r
String::String (StringRef s) : text (StringHolder::createFromCharPointer (s.text)) {}\r
\r
-String String::charToString (juce_wchar character)\r
+String String::charToString (const juce_wchar character)\r
{\r
String result (PreallocationBytes (CharPointerType::getBytesRequiredFor (character)));\r
CharPointerType t (result.text);\r
}\r
\r
// pass in a pointer to the END of a buffer..\r
- static char* numberToString (char* t, int64 n) noexcept\r
+ static char* numberToString (char* t, const int64 n) noexcept\r
{\r
if (n >= 0)\r
return printDigits (t, static_cast<uint64> (n));\r
return printDigits (t, v);\r
}\r
\r
- static char* numberToString (char* t, int n) noexcept\r
+ static char* numberToString (char* t, const int n) noexcept\r
{\r
if (n >= 0)\r
return printDigits (t, static_cast<unsigned int> (n));\r
return t;\r
}\r
\r
- static char* numberToString (char* t, unsigned int v) noexcept\r
+ static char* numberToString (char* t, const unsigned int v) noexcept\r
{\r
return printDigits (t, v);\r
}\r
\r
- static char* numberToString (char* t, long n) noexcept\r
+ static char* numberToString (char* t, const long n) noexcept\r
{\r
if (n >= 0)\r
return printDigits (t, static_cast<unsigned long> (n));\r
return t;\r
}\r
\r
- static char* numberToString (char* t, unsigned long v) noexcept\r
+ static char* numberToString (char* t, const unsigned long v) noexcept\r
{\r
return printDigits (t, v);\r
}\r
o << n;\r
}\r
\r
- return findLengthWithoutTrailingZeros (pbase(), pptr());\r
- }\r
-\r
- static size_t findLengthWithoutTrailingZeros (const char* const start,\r
- const char* const end)\r
- {\r
- for (auto e = end; e > start + 1; --e)\r
- {\r
- auto lastChar = *(e - 1);\r
-\r
- if (lastChar != '0')\r
- {\r
- if (lastChar == '.')\r
- return (size_t) (e + 1 - start);\r
-\r
- for (auto s = start; s < e; ++s)\r
- if (*s == '.')\r
- return (size_t) (e - start);\r
-\r
- break;\r
- }\r
- }\r
-\r
- return (size_t) (end - start);\r
+ return (size_t) (pptr() - pbase());\r
}\r
};\r
\r
- static char* doubleToString (char* buffer, int numChars, double n, int numDecPlaces, size_t& len) noexcept\r
+ static char* doubleToString (char* buffer, const int numChars, double n, int numDecPlaces, size_t& len) noexcept\r
{\r
if (numDecPlaces > 0 && numDecPlaces < 7 && n > -1.0e20 && n < 1.0e20)\r
{\r
auto v = (int64) (std::pow (10.0, numDecPlaces) * std::abs (n) + 0.5);\r
*--t = (char) 0;\r
\r
- // skip trailing zeros\r
- while (numDecPlaces > 1 && (v % 10) == 0)\r
- {\r
- v /= 10;\r
- --numDecPlaces;\r
- }\r
-\r
- while (v > 0 || numDecPlaces >= 0)\r
+ while (numDecPlaces >= 0 || v > 0)\r
{\r
if (numDecPlaces == 0)\r
*--t = '.';\r
}\r
\r
template <typename IntegerType>\r
- static String::CharPointerType createFromInteger (IntegerType number)\r
+ static String::CharPointerType createFromInteger (const IntegerType number)\r
{\r
char buffer [charsNeededForInt];\r
auto* end = buffer + numElementsInArray (buffer);\r
return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1));\r
}\r
\r
- static String::CharPointerType createFromDouble (double number, int numberOfDecimalPlaces)\r
+ static String::CharPointerType createFromDouble (const double number, const int numberOfDecimalPlaces)\r
{\r
char buffer [charsNeededForDouble];\r
size_t len;\r
{\r
auto& source = const_cast<String&> (s);\r
\r
- using DestChar = typename CharPointerType_Dest::CharType;\r
+ typedef typename CharPointerType_Dest::CharType DestChar;\r
\r
if (source.isEmpty())\r
return CharPointerType_Dest (reinterpret_cast<const DestChar*> (&emptyChar));\r
//==============================================================================\r
//==============================================================================\r
#if JUCE_UNIT_TESTS\r
-\r
-#define STRINGIFY2(X) #X\r
-#define STRINGIFY(X) STRINGIFY2(X)\r
-\r
+ #define STRINGIFY2(X) #X\r
+ #define STRINGIFY(X) STRINGIFY2(X)\r
class StringTests : public UnitTest\r
{\r
public:\r
expect (String::toHexString (data, 8, 1).equalsIgnoreCase ("01 02 03 04 0a 0b 0c 0d"));\r
expect (String::toHexString (data, 8, 2).equalsIgnoreCase ("0102 0304 0a0b 0c0d"));\r
\r
- expectEquals (String (2589410.5894, 7), String ("2589410.5894"));\r
- expectEquals (String (2589410.5894, 4), String ("2589410.5894"));\r
- expectEquals (String (100000.0, 1), String ("100000.0"));\r
- expectEquals (String (100000.0, 10), String ("100000.0"));\r
- expectEquals (String (100000.001, 8), String ("100000.001"));\r
- expectEquals (String (100000.001, 4), String ("100000.001"));\r
- expectEquals (String (100000.001, 3), String ("100000.001"));\r
- expectEquals (String (100000.001, 2), String ("100000.0"));\r
+ expectEquals (String (2589410.5894, 7), String ("2589410.5894000"));\r
\r
beginTest ("Subsections");\r
String s3;\r
expect (! v2.equals (v4));\r
expect (! v4.equals (v2));\r
}\r
-\r
- {\r
- beginTest ("Significant figures");\r
-\r
- // Integers\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (13, 1), String ("10"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (13, 2), String ("13"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (13, 3), String ("13.0"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (13, 4), String ("13.00"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19368, 1), String ("20000"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19348, 3), String ("19300"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (-5, 1), String ("-5"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (-5, 3), String ("-5.00"));\r
-\r
- // Zero\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (0, 1), String ("0"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (0, 2), String ("0.0"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (0, 3), String ("0.00"));\r
-\r
- // Floating point\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 1), String ("20"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 2), String ("19"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 3), String ("19.0"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (19.0, 4), String ("19.00"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (-5.45, 1), String ("-5"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (-5.45, 3), String ("-5.45"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 9), String ("12345.6789"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 8), String ("12345.679"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (12345.6789, 5), String ("12346"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (0.00028647, 6), String ("0.000286470"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (0.0028647, 6), String ("0.00286470"));\r
- expectEquals (String::toDecimalStringWithSignificantFigures (2.8647, 6), String ("2.86470"));\r
-\r
- expectEquals (String::toDecimalStringWithSignificantFigures (-0.0000000000019, 1), String ("-0.000000000002"));\r
- }\r
}\r
};\r
\r
toUTF32() methods let you access the string's content in any of the other formats.\r
*/\r
#if (JUCE_STRING_UTF_TYPE == 32)\r
- using CharPointerType = CharPointer_UTF32;\r
+ typedef CharPointer_UTF32 CharPointerType;\r
#elif (JUCE_STRING_UTF_TYPE == 16)\r
- using CharPointerType = CharPointer_UTF16;\r
+ typedef CharPointer_UTF16 CharPointerType;\r
#elif (DOXYGEN || JUCE_STRING_UTF_TYPE == 8)\r
- using CharPointerType = CharPointer_UTF8;\r
+ typedef CharPointer_UTF8 CharPointerType;\r
#else\r
#error "You must set the value of JUCE_STRING_UTF_TYPE to be either 8, 16, or 32!"\r
#endif\r
\r
/** Creates a string representing this floating-point number.\r
@param floatValue the value to convert to a string\r
- @param maxNumberOfDecimalPlaces if this is > 0, it will format the number using no more\r
- decimal places than this amount, and will not use exponent\r
- notation. If 0 or less, it will use a default format, and\r
- exponent notation if necessary.\r
+ @param numberOfDecimalPlaces if this is > 0, it will format the number using that many\r
+ decimal places, and will not use exponent notation. If 0 or\r
+ less, it will use exponent notation if necessary.\r
@see getDoubleValue, getIntValue\r
*/\r
- String (float floatValue, int maxNumberOfDecimalPlaces);\r
+ String (float floatValue, int numberOfDecimalPlaces);\r
\r
/** Creates a string representing this floating-point number.\r
@param doubleValue the value to convert to a string\r
- @param maxNumberOfDecimalPlaces if this is > 0, it will format the number using no more\r
- decimal places than this amount, and will not use exponent\r
- notation. If 0 or less, it will use a default format, and\r
- exponent notation if necessary.\r
+ @param numberOfDecimalPlaces if this is > 0, it will format the number using that many\r
+ decimal places, and will not use exponent notation. If 0 or\r
+ less, it will use exponent notation if necessary.\r
@see getFloatValue, getIntValue\r
*/\r
- String (double doubleValue, int maxNumberOfDecimalPlaces);\r
+ String (double doubleValue, int numberOfDecimalPlaces);\r
\r
// Automatically creating a String from a bool opens up lots of nasty type conversion edge cases.\r
// If you want a String representation of a bool you can cast the bool to an int first.\r
*/\r
static String toHexString (const void* data, int size, int groupSize = 1);\r
\r
- /** Returns a string containing a decimal with a set number of significant figures.\r
-\r
- @param number the intput number\r
- @param numberOfSignificantFigures the number of significant figures to use\r
- */\r
- template <typename DecimalType>\r
- static String toDecimalStringWithSignificantFigures (DecimalType number, int numberOfSignificantFigures)\r
- {\r
- jassert (numberOfSignificantFigures > 0);\r
-\r
- if (number == 0)\r
- {\r
- if (numberOfSignificantFigures > 1)\r
- {\r
- String result ("0.0");\r
-\r
- for (int i = 2; i < numberOfSignificantFigures; ++i)\r
- result += "0";\r
-\r
- return result;\r
- }\r
-\r
- return "0";\r
- }\r
-\r
- auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));\r
-\r
- #if JUCE_PROJUCER_LIVE_BUILD\r
- auto doubleNumber = (double) number;\r
- constexpr int bufferSize = 311;\r
- char buffer[bufferSize];\r
- auto* ptr = &(buffer[0]);\r
- auto* const safeEnd = ptr + (bufferSize - 1);\r
- auto numSigFigsParsed = 0;\r
-\r
- auto writeToBuffer = [safeEnd] (char* destination, char data)\r
- {\r
- *destination++ = data;\r
-\r
- if (destination == safeEnd)\r
- {\r
- *destination = '\0';\r
- return true;\r
- }\r
-\r
- return false;\r
- };\r
-\r
- auto truncateOrRound = [numberOfSignificantFigures] (double fractional, int sigFigsParsed)\r
- {\r
- return (sigFigsParsed == numberOfSignificantFigures - 1) ? (int) std::round (fractional)\r
- : (int) fractional;\r
- };\r
-\r
- if (doubleNumber < 0)\r
- {\r
- doubleNumber *= -1;\r
- *ptr++ = '-';\r
- }\r
-\r
- if (numDigitsBeforePoint > 0)\r
- {\r
- doubleNumber /= std::pow (10.0, numDigitsBeforePoint);\r
-\r
- while (numDigitsBeforePoint-- > 0)\r
- {\r
- if (numSigFigsParsed == numberOfSignificantFigures)\r
- {\r
- if (writeToBuffer (ptr++, '0'))\r
- return buffer;\r
-\r
- continue;\r
- }\r
-\r
- doubleNumber *= 10;\r
- auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);\r
-\r
- if (writeToBuffer (ptr++, (char) ('0' + digit)))\r
- return buffer;\r
-\r
- ++numSigFigsParsed;\r
- doubleNumber -= digit;\r
- }\r
-\r
- if (numSigFigsParsed == numberOfSignificantFigures)\r
- {\r
- *ptr++ = '\0';\r
- return buffer;\r
- }\r
- }\r
- else\r
- {\r
- *ptr++ = '0';\r
- }\r
-\r
- if (writeToBuffer (ptr++, '.'))\r
- return buffer;\r
-\r
- while (numSigFigsParsed < numberOfSignificantFigures)\r
- {\r
- doubleNumber *= 10;\r
- auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);\r
-\r
- if (writeToBuffer (ptr++, (char) ('0' + digit)))\r
- return buffer;\r
-\r
- if (numSigFigsParsed != 0 || digit != 0)\r
- ++numSigFigsParsed;\r
-\r
- doubleNumber -= digit;\r
- }\r
-\r
- *ptr++ = '\0';\r
- return buffer;\r
- #else\r
- auto shift = numberOfSignificantFigures - numDigitsBeforePoint;\r
- auto factor = std::pow (10.0, shift);\r
- auto rounded = std::round (number * factor) / factor;\r
-\r
- std::stringstream ss;\r
- ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;\r
- return ss.str();\r
- #endif\r
- }\r
-\r
//==============================================================================\r
/** Returns the character pointer currently being used to store this string.\r
\r
empty string from a function by reference, but if you need to do that, it's easy enough to use\r
a function-local static String object and return that, avoiding any order-of-initialisation issues.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const String empty;)\r
+ JUCE_DEPRECATED_STATIC (static const String empty);\r
\r
private:\r
//==============================================================================\r
static String createHex (uint64);\r
\r
template <typename Type>\r
- static String createHex (Type n) { return createHex (static_cast<typename TypeHelpers::UnsignedTypeWithSize<(int) sizeof (n)>::type> (n)); }\r
+ static String createHex (Type n) { return createHex (static_cast<typename TypeHelpers::UnsignedTypeWithSize<sizeof (n)>::type> (n)); }\r
};\r
\r
//==============================================================================\r
{\r
}\r
\r
-StringArray::StringArray (Array<String>&& other) noexcept\r
- : strings (static_cast<Array<String>&&> (other))\r
-{\r
-}\r
-\r
StringArray::StringArray (const String& firstValue)\r
{\r
strings.add (firstValue);\r
return strings.getReference (index);\r
}\r
\r
-void StringArray::add (String newString)\r
+void StringArray::add (const String& newString)\r
+{\r
+ strings.add (newString);\r
+}\r
+\r
+void StringArray::add (String&& stringToAdd)\r
{\r
- // NB: the local temp copy is to avoid a dangling pointer if the\r
- // argument being passed-in is a reference into this array.\r
- strings.add (std::move (newString));\r
+ strings.add (static_cast<String&&> (stringToAdd));\r
}\r
\r
-void StringArray::insert (int index, String newString)\r
+void StringArray::insert (int index, const String& newString)\r
{\r
- // NB: the local temp copy is to avoid a dangling pointer if the\r
- // argument being passed-in is a reference into this array.\r
- strings.insert (index, std::move (newString));\r
+ strings.insert (index, newString);\r
}\r
\r
bool StringArray::addIfNotAlreadyThere (const String& newString, bool ignoreCase)\r
\r
void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd)\r
{\r
- jassert (this != &otherArray); // can't add from our own elements!\r
-\r
if (startIndex < 0)\r
{\r
jassertfalse;\r
\r
void StringArray::mergeArray (const StringArray& otherArray, bool ignoreCase)\r
{\r
- jassert (this != &otherArray); // can't add from our own elements!\r
-\r
for (auto& s : otherArray)\r
addIfNotAlreadyThere (s, ignoreCase);\r
}\r
\r
-void StringArray::set (int index, String newString)\r
+void StringArray::set (int index, const String& newString)\r
{\r
- strings.set (index, std::move (newString));\r
+ strings.set (index, newString);\r
}\r
\r
bool StringArray::contains (StringRef stringToLookFor, bool ignoreCase) const\r
/** Creates an array containing a list of strings. */\r
StringArray (const std::initializer_list<const char*>& strings);\r
\r
- /** Creates a StringArray by moving from an Array<String> */\r
- StringArray (Array<String>&&) noexcept;\r
-\r
- /** Creates a StringArray from an array of objects which can be implicitly converted to Strings. */\r
- template <typename Type>\r
- StringArray (const Array<Type>& stringArray)\r
- {\r
- addArray (stringArray.begin(), stringArray.end());\r
- }\r
-\r
/** Creates an array from a raw array of strings.\r
@param strings an array of strings to add\r
@param numberOfStrings how many items there are in the array\r
/** Move assignment operator */\r
StringArray& operator= (StringArray&&) noexcept;\r
\r
- /** Copies a StringArray from an array of objects which can be implicitly converted to Strings. */\r
- template <typename Type>\r
- StringArray& operator= (const Array<Type>& stringArray)\r
- {\r
- addArray (stringArray.begin(), stringArray.end());\r
- return *this;\r
- }\r
-\r
/** Swaps the contents of this and another StringArray. */\r
void swapWith (StringArray&) noexcept;\r
\r
\r
//==============================================================================\r
/** Appends a string at the end of the array. */\r
- void add (String stringToAdd);\r
+ void add (const String& stringToAdd);\r
+\r
+ /** Appends a string at the end of the array. */\r
+ void add (String&& stringToAdd);\r
\r
/** Inserts a string into the array.\r
\r
If the index is less than zero or greater than the size of the array,\r
the new string will be added to the end of the array.\r
*/\r
- void insert (int index, String stringToAdd);\r
+ void insert (int index, const String& stringToAdd);\r
\r
/** Adds a string to the array as long as it's not already in there.\r
The search can optionally be case-insensitive.\r
If the index is higher than the array's size, the new string will be\r
added to the end of the array; if it's less than zero nothing happens.\r
*/\r
- void set (int index, String newString);\r
+ void set (int index, const String& newString);\r
\r
/** Appends some strings from another array to the end of this one.\r
\r
int startIndex = 0,\r
int numElementsToAdd = -1);\r
\r
- /** Adds items from a range of start/end iterators of some kind of objects which\r
- can be implicitly converted to Strings.\r
- */\r
- template <typename Iterator>\r
- void addArray (Iterator&& start, Iterator&& end)\r
- {\r
- ensureStorageAllocated (size() + (int) static_cast<size_t> (end - start));\r
-\r
- while (start != end)\r
- strings.add (*start++);\r
- }\r
-\r
/** Merges the strings from another array into this one.\r
This will not add a string that already exists.\r
\r
\r
//==============================================================================\r
/** Sorts the array into alphabetical order.\r
- @param ignoreCase if true, the comparisons used will not be case-sensitive.\r
+ @param ignoreCase if true, the comparisons used will be case-sensitive.\r
*/\r
void sort (bool ignoreCase);\r
\r
private:\r
//==============================================================================\r
class ActiveProcess;\r
+ friend struct ContainerDeletePolicy<ActiveProcess>;\r
std::unique_ptr<ActiveProcess> activeProcess;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcess)\r
\r
//==============================================================================\r
/** Provides the type of scoped lock to use with a CriticalSection. */\r
- using ScopedLockType = GenericScopedLock<CriticalSection>;\r
+ typedef GenericScopedLock <CriticalSection> ScopedLockType;\r
\r
/** Provides the type of scoped unlocker to use with a CriticalSection. */\r
- using ScopedUnlockType = GenericScopedUnlock<CriticalSection>;\r
+ typedef GenericScopedUnlock <CriticalSection> ScopedUnlockType;\r
\r
/** Provides the type of scoped try-locker to use with a CriticalSection. */\r
- using ScopedTryLockType = GenericScopedTryLock<CriticalSection>;\r
+ typedef GenericScopedTryLock <CriticalSection> ScopedTryLockType;\r
\r
\r
private:\r
};\r
\r
/** A dummy scoped-unlocker type to use with a dummy critical section. */\r
- using ScopedUnlockType = ScopedLockType;\r
+ typedef ScopedLockType ScopedUnlockType;\r
\r
private:\r
JUCE_DECLARE_NON_COPYABLE (DummyCriticalSection)\r
\r
@see CriticalSection, ScopedUnlock\r
*/\r
-using ScopedLock = CriticalSection::ScopedLockType;\r
+typedef CriticalSection::ScopedLockType ScopedLock;\r
\r
//==============================================================================\r
/**\r
\r
@see CriticalSection, ScopedLock\r
*/\r
-using ScopedUnlock = CriticalSection::ScopedUnlockType;\r
+typedef CriticalSection::ScopedUnlockType ScopedUnlock;\r
\r
//==============================================================================\r
/**\r
\r
@see CriticalSection::tryEnter, ScopedLock, ScopedUnlock, ScopedReadLock\r
*/\r
-using ScopedTryLock = CriticalSection::ScopedTryLockType;\r
+typedef CriticalSection::ScopedTryLockType ScopedTryLock;\r
\r
} // namespace juce\r
\r
private:\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HighResolutionTimer)\r
private:\r
//==============================================================================\r
class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
CriticalSection lock;\r
{\r
\r
ReadWriteLock::ReadWriteLock() noexcept\r
+ : numWaitingWriters (0),\r
+ numWriters (0),\r
+ writerThreadId (0)\r
{\r
readerThreads.ensureStorageAllocated (16);\r
}\r
\r
if (--numWriters == 0)\r
{\r
- writerThreadId = {};\r
+ writerThreadId = 0;\r
waitEvent.signal();\r
}\r
}\r
//==============================================================================\r
SpinLock accessLock;\r
WaitableEvent waitEvent;\r
- mutable int numWaitingWriters = 0, numWriters = 0;\r
- mutable Thread::ThreadID writerThreadId = {};\r
+ mutable int numWaitingWriters, numWriters;\r
+ mutable Thread::ThreadID writerThreadId;\r
\r
struct ThreadRecursionCount\r
{\r
\r
//==============================================================================\r
/** Provides the type of scoped lock to use for locking a SpinLock. */\r
- using ScopedLockType = GenericScopedLock<SpinLock>;\r
+ typedef GenericScopedLock <SpinLock> ScopedLockType;\r
\r
/** Provides the type of scoped unlocker to use with a SpinLock. */\r
- using ScopedUnlockType = GenericScopedUnlock<SpinLock>;\r
+ typedef GenericScopedUnlock <SpinLock> ScopedUnlockType;\r
\r
private:\r
//==============================================================================\r
bool Thread::waitForThreadToExit (const int timeOutMilliseconds) const\r
{\r
// Doh! So how exactly do you expect this thread to wait for itself to stop??\r
- jassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == ThreadID());\r
+ jassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == 0);\r
\r
auto timeoutEnd = Time::getMillisecondCounter() + (uint32) timeOutMilliseconds;\r
\r
killThread();\r
\r
threadHandle = nullptr;\r
- threadId = {};\r
+ threadId = 0;\r
return false;\r
}\r
}\r
\r
bool Thread::setCurrentThreadPriority (const int newPriority)\r
{\r
- return setThreadPriority ({}, newPriority);\r
+ return setThreadPriority (0, newPriority);\r
}\r
\r
void Thread::setAffinityMask (const uint32 newAffinityMask)\r
/** A value type used for thread IDs.\r
@see getCurrentThreadId(), getThreadId()\r
*/\r
- using ThreadID = void*;\r
+ typedef void* ThreadID;\r
\r
/** Returns an id that identifies the caller thread.\r
\r
}\r
\r
//==============================================================================\r
-ThreadPool::ThreadPool (int numThreads, size_t threadStackSize)\r
+ThreadPool::ThreadPool (const int numThreads, size_t threadStackSize)\r
{\r
jassert (numThreads > 0); // not much point having a pool without any threads!\r
\r
t->stopThread (500);\r
}\r
\r
-void ThreadPool::addJob (ThreadPoolJob* job, bool deleteJobWhenFinished)\r
+void ThreadPool::addJob (ThreadPoolJob* const job, const bool deleteJobWhenFinished)\r
{\r
jassert (job != nullptr);\r
jassert (job->pool == nullptr);\r
return jobs [index];\r
}\r
\r
-bool ThreadPool::contains (const ThreadPoolJob* job) const noexcept\r
+bool ThreadPool::contains (const ThreadPoolJob* const job) const noexcept\r
{\r
const ScopedLock sl (lock);\r
return jobs.contains (const_cast<ThreadPoolJob*> (job));\r
}\r
\r
-bool ThreadPool::isJobRunning (const ThreadPoolJob* job) const noexcept\r
+bool ThreadPool::isJobRunning (const ThreadPoolJob* const job) const noexcept\r
{\r
const ScopedLock sl (lock);\r
return jobs.contains (const_cast<ThreadPoolJob*> (job)) && job->isActive;\r
jobs.move (index, 0);\r
}\r
\r
-bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* job, int timeOutMs) const\r
+bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* const job, const int timeOutMs) const\r
{\r
if (job != nullptr)\r
{\r
return true;\r
}\r
\r
-bool ThreadPool::removeJob (ThreadPoolJob* job, bool interruptIfRunning, int timeOutMs)\r
+bool ThreadPool::removeJob (ThreadPoolJob* const job,\r
+ const bool interruptIfRunning,\r
+ const int timeOutMs)\r
{\r
bool dontWait = true;\r
OwnedArray<ThreadPoolJob> deletionList;\r
return dontWait || waitForJobToFinish (job, timeOutMs);\r
}\r
\r
-bool ThreadPool::removeAllJobs (bool interruptRunningJobs, int timeOutMs,\r
- ThreadPool::JobSelector* selectedJobsToRemove)\r
+bool ThreadPool::removeAllJobs (const bool interruptRunningJobs, const int timeOutMs,\r
+ ThreadPool::JobSelector* const selectedJobsToRemove)\r
{\r
Array<ThreadPoolJob*> jobsToWaitFor;\r
\r
return true;\r
}\r
\r
-StringArray ThreadPool::getNamesOfAllJobs (bool onlyReturnActiveJobs) const\r
+StringArray ThreadPool::getNamesOfAllJobs (const bool onlyReturnActiveJobs) const\r
{\r
StringArray s;\r
const ScopedLock sl (lock);\r
return s;\r
}\r
\r
-bool ThreadPool::setThreadPriorities (int newPriority)\r
+bool ThreadPool::setThreadPriorities (const int newPriority)\r
{\r
bool ok = true;\r
\r
return false;\r
}\r
\r
-void ThreadPool::addToDeleteList (OwnedArray<ThreadPoolJob>& deletionList, ThreadPoolJob* job) const\r
+void ThreadPool::addToDeleteList (OwnedArray<ThreadPoolJob>& deletionList, ThreadPoolJob* const job) const\r
{\r
job->shouldStop = true;\r
job->pool = nullptr;\r
friend class ThreadPool;\r
String jobName;\r
ThreadPool* pool = nullptr;\r
- std::atomic<bool> shouldStop { false }, isActive { false }, shouldBeDeleted { false };\r
+ bool shouldStop = false, isActive = false, shouldBeDeleted = false;\r
ListenerList<Thread::Listener, Array<Thread::Listener*, CriticalSection>> listeners;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolJob)\r
\r
struct ThreadPoolThread;\r
friend class ThreadPoolJob;\r
+ friend struct ThreadPoolThread;\r
+ friend struct ContainerDeletePolicy<ThreadPoolThread>;\r
OwnedArray<ThreadPoolThread> threads;\r
\r
CriticalSection lock;\r
/**\r
Allows threads to wait for events triggered by other threads.\r
\r
- A thread can call WaitableEvent::wait() to suspend the calling thread until\r
- another thread wakes it up by calling the WaitableEvent::signal() method.\r
+ A thread can call wait() on a WaitableObject, and this will suspend the\r
+ calling thread until another thread wakes it up by calling the signal()\r
+ method.\r
\r
@tags{Core}\r
*/\r
static inline String formatString (const String& format, const std::tm* const tm)\r
{\r
#if JUCE_ANDROID\r
- using StringType = CharPointer_UTF8;\r
+ typedef CharPointer_UTF8 StringType;\r
#elif JUCE_WINDOWS\r
- using StringType = CharPointer_UTF16;\r
+ typedef CharPointer_UTF16 StringType;\r
#else\r
- using StringType = CharPointer_UTF32;\r
+ typedef CharPointer_UTF32 StringType;\r
#endif\r
\r
#ifdef JUCE_MSVC\r
}\r
else if (month < 0)\r
{\r
- auto numYears = (11 - month) / 12;\r
+ const int numYears = (11 - month) / 12;\r
year -= numYears;\r
month += 12 * numYears;\r
}\r
}\r
\r
//==============================================================================\r
+Time::Time() noexcept : millisSinceEpoch (0)\r
+{\r
+}\r
+\r
+Time::Time (const Time& other) noexcept : millisSinceEpoch (other.millisSinceEpoch)\r
+{\r
+}\r
+\r
Time::Time (int64 ms) noexcept : millisSinceEpoch (ms)\r
{\r
- static_assert (std::is_trivially_copyable<Time>::value, "Time is not trivially copyable");\r
}\r
\r
Time::Time (int year, int month, int day,\r
+ milliseconds;\r
}\r
\r
+Time::~Time() noexcept\r
+{\r
+}\r
+\r
+Time& Time::operator= (const Time& other) noexcept\r
+{\r
+ millisSinceEpoch = other.millisSinceEpoch;\r
+ return *this;\r
+}\r
+\r
//==============================================================================\r
int64 Time::currentTimeMillis() noexcept\r
{\r
}\r
\r
//==============================================================================\r
-String Time::toString (bool includeDate,\r
- bool includeTime,\r
- bool includeSeconds,\r
- bool use24HourClock) const\r
+String Time::toString (const bool includeDate,\r
+ const bool includeTime,\r
+ const bool includeSeconds,\r
+ const bool use24HourClock) const noexcept\r
{\r
String result;\r
\r
return TimeHelpers::millisToLocal (millisSinceEpoch).tm_isdst != 0;\r
}\r
\r
-String Time::getTimeZone() const\r
+String Time::getTimeZone() const noexcept\r
{\r
String zone[2];\r
\r
{\r
char name[128] = { 0 };\r
size_t length;\r
- _get_tzname (&length, name, sizeof (name) - 1, i);\r
+ _get_tzname (&length, name, 127, i);\r
zone[i] = name;\r
}\r
#else\r
\r
String Time::getUTCOffsetString (bool includeSemiColon) const\r
{\r
- if (auto seconds = getUTCOffsetSeconds())\r
+ if (int seconds = getUTCOffsetSeconds())\r
{\r
- auto minutes = seconds / 60;\r
+ const int minutes = seconds / 60;\r
\r
return String::formatted (includeSemiColon ? "%+03d:%02d"\r
: "%+03d%02d",\r
\r
for (int i = numChars; --i >= 0;)\r
{\r
- auto digit = (int) (*t - '0');\r
+ const int digit = (int) (*t - '0');\r
\r
if (! isPositiveAndBelow (digit, 10))\r
return -1;\r
return n;\r
}\r
\r
-Time Time::fromISO8601 (StringRef iso)\r
+Time Time::fromISO8601 (StringRef iso) noexcept\r
{\r
auto t = iso.text;\r
auto year = parseFixedSizeIntAndSkip (t, 4, '-');\r
bool operator<= (Time time1, Time time2) noexcept { return time1.toMilliseconds() <= time2.toMilliseconds(); }\r
bool operator>= (Time time1, Time time2) noexcept { return time1.toMilliseconds() >= time2.toMilliseconds(); }\r
\r
-static int getMonthNumberForCompileDate (const String& m)\r
+static int getMonthNumberForCompileDate (const String& m) noexcept\r
{\r
for (int i = 0; i < 12; ++i)\r
if (m.equalsIgnoreCase (shortMonthNames[i]))\r
public:\r
//==============================================================================\r
/** Creates a Time object.\r
+\r
This default constructor creates a time of midnight Jan 1st 1970 UTC, (which is\r
represented internally as 0ms).\r
+\r
To create a time object representing the current time, use getCurrentTime().\r
+\r
@see getCurrentTime\r
*/\r
- Time() = default;\r
+ Time() noexcept;\r
\r
/** Creates a time based on a number of milliseconds.\r
+\r
To create a time object set to the current time, use getCurrentTime().\r
\r
@param millisecondsSinceEpoch the number of milliseconds since the unix\r
int milliseconds = 0,\r
bool useLocalTime = true) noexcept;\r
\r
- Time (const Time&) = default;\r
- ~Time() = default;\r
+ /** Creates a copy of another Time object. */\r
+ Time (const Time& other) noexcept;\r
+\r
+ /** Destructor. */\r
+ ~Time() noexcept;\r
\r
- Time& operator= (const Time&) = default;\r
+ /** Copies this time from another one. */\r
+ Time& operator= (const Time& other) noexcept;\r
\r
//==============================================================================\r
/** Returns a Time object that is set to the current system time.\r
\r
//==============================================================================\r
/** Returns a 3-character string to indicate the local timezone. */\r
- String getTimeZone() const;\r
+ String getTimeZone() const noexcept;\r
\r
/** Returns the local timezone offset from UTC in seconds. */\r
int getUTCOffsetSeconds() const noexcept;\r
String toString (bool includeDate,\r
bool includeTime,\r
bool includeSeconds = true,\r
- bool use24HourClock = false) const;\r
+ bool use24HourClock = false) const noexcept;\r
\r
/** Converts this date/time to a string with a user-defined format.\r
\r
String toISO8601 (bool includeDividerCharacters) const;\r
\r
/** Parses an ISO-8601 string and returns it as a Time. */\r
- static Time fromISO8601 (StringRef iso8601);\r
+ static Time fromISO8601 (StringRef iso8601) noexcept;\r
\r
//==============================================================================\r
/** Adds a RelativeTime to this time. */\r
\r
private:\r
//==============================================================================\r
- int64 millisSinceEpoch = 0;\r
+ int64 millisSinceEpoch;\r
};\r
\r
//==============================================================================\r
return doc.getDocumentElement();\r
}\r
\r
-std::unique_ptr<XmlElement> parseXML (const String& textToParse)\r
-{\r
- return std::unique_ptr<XmlElement> (XmlDocument::parse (textToParse));\r
-}\r
-\r
-std::unique_ptr<XmlElement> parseXML (const File& fileToParse)\r
-{\r
- return std::unique_ptr<XmlElement> (XmlDocument::parse (fileToParse));\r
-}\r
-\r
void XmlDocument::setInputSource (InputSource* newSource) noexcept\r
{\r
inputSource.reset (newSource);\r
\r
@endcode\r
\r
- Or you can use the helper functions for much less verbose parsing..\r
+ Or you can use the static helper methods for quick parsing..\r
\r
@code\r
- if (auto xml = parseXML (myXmlFile))\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (myXmlFile));\r
+\r
+ if (xml != nullptr && xml->hasTagName ("foobar"))\r
{\r
- if (xml->hasTagName ("foobar"))\r
- {\r
- ...etc\r
- }\r
+ ...etc\r
}\r
@endcode\r
\r
//==============================================================================\r
/** A handy static method that parses a file.\r
This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.\r
- An even better shortcut is the juce::parseXML() function, which returns a std::unique_ptr<XmlElement>!\r
@returns a new XmlElement which the caller will need to delete, or null if there was an error.\r
*/\r
static XmlElement* parse (const File& file);\r
\r
/** A handy static method that parses some XML data.\r
This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.\r
- An even better shortcut is the juce::parseXML() function, which returns a std::unique_ptr<XmlElement>!\r
@returns a new XmlElement which the caller will need to delete, or null if there was an error.\r
*/\r
static XmlElement* parse (const String& xmlData);\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument)\r
};\r
\r
-//==============================================================================\r
-/** Attempts to parse some XML text, returning a new XmlElement if it was valid.\r
- If the parse fails, this will return a nullptr - if you need more information about\r
- errors or more parsing options, see the XmlDocument instead.\r
- @see XmlDocument\r
-*/\r
-std::unique_ptr<XmlElement> parseXML (const String& textToParse);\r
-\r
-/** Attempts to parse some XML text, returning a new XmlElement if it was valid.\r
- If the parse fails, this will return a nullptr - if you need more information about\r
- errors or more parsing options, see the XmlDocument instead.\r
- @see XmlDocument\r
-*/\r
-std::unique_ptr<XmlElement> parseXML (const File& fileToParse);\r
-\r
-\r
-\r
} // namespace juce\r
outputStream << (char) character;\r
break;\r
}\r
- // Note: Deliberate fall-through here!\r
+ // Note: deliberate fall-through here!\r
default:\r
outputStream << "&#" << ((int) character) << ';';\r
break;\r
OptionalScopedPointer<OutputStream> destStream;\r
\r
class GZIPCompressorHelper;\r
+ friend struct ContainerDeletePolicy<GZIPCompressorHelper>;\r
std::unique_ptr<GZIPCompressorHelper> helper;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPCompressorOutputStream)\r
#pragma clang diagnostic ignored "-Wconversion"\r
#pragma clang diagnostic ignored "-Wshadow"\r
#pragma clang diagnostic ignored "-Wdeprecated-register"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
#if __has_warning("-Wcomma")\r
#pragma clang diagnostic ignored "-Wcomma"\r
#endif\r
\r
bool GZIPDecompressorInputStream::isExhausted()\r
{\r
- return helper->error || helper->finished || isEof;\r
+ return helper->error || isEof;\r
}\r
\r
int64 GZIPDecompressorInputStream::getPosition()\r
return true;\r
}\r
\r
-//==============================================================================\r
-#if JUCE_UNIT_TESTS\r
-\r
-struct GZIPDecompressorInputStreamTests : public UnitTest\r
-{\r
- GZIPDecompressorInputStreamTests()\r
- : UnitTest ("GZIPDecompressorInputStreamTests", "Streams")\r
- {}\r
-\r
- void runTest() override\r
- {\r
- const MemoryBlock data ("abcdefghijklmnopqrstuvwxyz", 26);\r
-\r
- MemoryOutputStream mo;\r
- GZIPCompressorOutputStream gzipOutputStream (mo);\r
- gzipOutputStream.write (data.getData(), data.getSize());\r
- gzipOutputStream.flush();\r
-\r
- MemoryInputStream mi (mo.getData(), mo.getDataSize(), false);\r
- GZIPDecompressorInputStream stream (&mi, false, GZIPDecompressorInputStream::zlibFormat, (int64) data.getSize());\r
-\r
- beginTest ("Read");\r
-\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- size_t numBytesRead = 0;\r
- MemoryBlock readBuffer (data.getSize());\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- numBytesRead += (size_t) stream.read (&readBuffer[numBytesRead], 3);\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
-\r
- expect (readBuffer == data);\r
-\r
- beginTest ("Skip");\r
-\r
- stream.setPosition (0);\r
- expectEquals (stream.getPosition(), (int64) 0);\r
- expectEquals (stream.getTotalLength(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());\r
- expect (! stream.isExhausted());\r
-\r
- numBytesRead = 0;\r
- const int numBytesToSkip = 5;\r
-\r
- while (numBytesRead < data.getSize())\r
- {\r
- stream.skipNextBytes (numBytesToSkip);\r
- numBytesRead += numBytesToSkip;\r
- numBytesRead = std::min (numBytesRead, data.getSize());\r
-\r
- expectEquals (stream.getPosition(), (int64) numBytesRead);\r
- expectEquals (stream.getNumBytesRemaining(), (int64) (data.getSize() - numBytesRead));\r
- expect (stream.isExhausted() == (numBytesRead == data.getSize()));\r
- }\r
-\r
- expectEquals (stream.getPosition(), (int64) data.getSize());\r
- expectEquals (stream.getNumBytesRemaining(), (int64) 0);\r
- expect (stream.isExhausted());\r
- }\r
-};\r
-\r
-static GZIPDecompressorInputStreamTests gzipDecompressorInputStreamTests;\r
-\r
-#endif\r
-\r
} // namespace juce\r
HeapBlock<uint8> buffer;\r
\r
class GZIPDecompressHelper;\r
+ friend struct ContainerDeletePolicy<GZIPDecompressHelper>;\r
std::unique_ptr<GZIPDecompressHelper> helper;\r
\r
#if JUCE_CATCH_DEPRECATED_CODE_MISUSE\r
//==============================================================================\r
private:\r
struct Item;\r
+ friend struct ContainerDeletePolicy<Item>;\r
OwnedArray<Item> items;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Builder)\r
@param buffer The message that should be encrypted. See bufferSize on size\r
requirements!\r
@param sizeOfMsg The size of the message that should be encrypted in bytes\r
- @param bufferSize The size of the buffer in bytes. To accommodate the encypted\r
+ @param bufferSize The size of the buffer in bytes. To accomadate the encypted\r
data, the buffer must be larger than the message: the size of\r
the buffer needs to be equal or greater than the size of the\r
message in bytes rounded to the next integer which is divisable\r
*/\r
static BigInteger createProbablePrime (int bitLength,\r
int certainty,\r
- const int* randomSeeds = nullptr,\r
+ const int* randomSeeds = 0,\r
int numRandomSeeds = 0);\r
\r
/** Tests a number to see if it's prime.\r
jassert (numRandomSeeds == 0 || numRandomSeeds >= 2); // you need to provide plenty of seeds here!\r
\r
BigInteger p (Primes::createProbablePrime (numBits / 2, 30, randomSeeds, numRandomSeeds / 2));\r
- BigInteger q (Primes::createProbablePrime (numBits - numBits / 2, 30, randomSeeds == nullptr ? nullptr : (randomSeeds + numRandomSeeds / 2), numRandomSeeds - numRandomSeeds / 2));\r
+ BigInteger q (Primes::createProbablePrime (numBits - numBits / 2, 30, randomSeeds == nullptr ? 0 : (randomSeeds + numRandomSeeds / 2), numRandomSeeds - numRandomSeeds / 2));\r
\r
const BigInteger n (p * q);\r
const BigInteger m (--p * --q);\r
\r
ID: juce_cryptography\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE cryptography classes\r
description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
website: http://www.juce.com/juce\r
File dir (commonToAllUsers ? "/Library/"\r
: "~/Library/");\r
\r
- if (osxLibrarySubFolder != "Preferences"\r
- && ! osxLibrarySubFolder.startsWith ("Application Support")\r
- && ! osxLibrarySubFolder.startsWith ("Containers"))\r
+ if (osxLibrarySubFolder != "Preferences" && ! osxLibrarySubFolder.startsWith ("Application Support"))\r
{\r
/* The PropertiesFile class always used to put its settings files in "Library/Preferences", but Apple\r
- have changed their advice, and now stipulate that settings should go in "Library/Application Support",\r
- or Library/Containers/[app_bundle_id] for a sandboxed app.\r
+ have changed their advice, and now stipulate that settings should go in "Library/Application Support".\r
\r
Because older apps would be broken by a silent change in this class's behaviour, you must now\r
explicitly set the osxLibrarySubFolder value to indicate which path you want to use.\r
\r
ID: juce_data_structures\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE data model helper classes\r
description: Classes for undo/redo management, and smart data structures.\r
website: http://www.juce.com/juce\r
\r
struct UndoManager::ActionSet\r
{\r
- ActionSet (const String& transactionName) : name (transactionName)\r
+ ActionSet (const String& transactionName)\r
+ : name (transactionName),\r
+ time (Time::getCurrentTime())\r
{}\r
\r
bool perform() const\r
\r
OwnedArray<UndoableAction> actions;\r
String name;\r
- Time time { Time::getCurrentTime() };\r
+ Time time;\r
};\r
\r
//==============================================================================\r
{\r
std::unique_ptr<UndoableAction> action (newAction);\r
\r
- if (isPerformingUndoRedo())\r
+ if (reentrancyCheck)\r
{\r
- jassertfalse; // Don't call perform() recursively from the UndoableAction::perform()\r
+ jassertfalse; // don't call perform() recursively from the UndoableAction::perform()\r
// or undo() methods, or else these actions will be discarded!\r
return false;\r
}\r
}\r
}\r
\r
-void UndoManager::beginNewTransaction()\r
+void UndoManager::beginNewTransaction() noexcept\r
{\r
beginNewTransaction ({});\r
}\r
\r
-void UndoManager::beginNewTransaction (const String& actionName)\r
+void UndoManager::beginNewTransaction (const String& actionName) noexcept\r
{\r
newTransaction = true;\r
newTransactionName = actionName;\r
}\r
\r
-void UndoManager::setCurrentTransactionName (const String& newName)\r
+void UndoManager::setCurrentTransactionName (const String& newName) noexcept\r
{\r
if (newTransaction)\r
newTransactionName = newName;\r
action->name = newName;\r
}\r
\r
-String UndoManager::getCurrentTransactionName() const\r
+String UndoManager::getCurrentTransactionName() const noexcept\r
{\r
if (auto* action = getCurrentSet())\r
return action->name;\r
}\r
\r
//==============================================================================\r
-UndoManager::ActionSet* UndoManager::getCurrentSet() const { return transactions[nextIndex - 1]; }\r
-UndoManager::ActionSet* UndoManager::getNextSet() const { return transactions[nextIndex]; }\r
+UndoManager::ActionSet* UndoManager::getCurrentSet() const noexcept { return transactions[nextIndex - 1]; }\r
+UndoManager::ActionSet* UndoManager::getNextSet() const noexcept { return transactions[nextIndex]; }\r
\r
-bool UndoManager::isPerformingUndoRedo() const { return isInsideUndoRedoCall; }\r
-\r
-bool UndoManager::canUndo() const { return getCurrentSet() != nullptr; }\r
-bool UndoManager::canRedo() const { return getNextSet() != nullptr; }\r
+bool UndoManager::canUndo() const noexcept { return getCurrentSet() != nullptr; }\r
+bool UndoManager::canRedo() const noexcept { return getNextSet() != nullptr; }\r
\r
bool UndoManager::undo()\r
{\r
if (auto* s = getCurrentSet())\r
{\r
- const ScopedValueSetter<bool> setter (isInsideUndoRedoCall, true);\r
+ const ScopedValueSetter<bool> setter (reentrancyCheck, true);\r
\r
if (s->undo())\r
--nextIndex;\r
{\r
if (auto* s = getNextSet())\r
{\r
- const ScopedValueSetter<bool> setter (isInsideUndoRedoCall, true);\r
+ const ScopedValueSetter<bool> setter (reentrancyCheck, true);\r
\r
if (s->perform())\r
++nextIndex;\r
method are grouped together and undone/redone together by a single call to\r
undo() or redo().\r
*/\r
- void beginNewTransaction();\r
+ void beginNewTransaction() noexcept;\r
\r
/** Starts a new group of actions that together will be treated as a single transaction.\r
\r
@param actionName a description of the transaction that is about to be\r
performed\r
*/\r
- void beginNewTransaction (const String& actionName);\r
+ void beginNewTransaction (const String& actionName) noexcept;\r
\r
/** Changes the name stored for the current transaction.\r
\r
called, but this can be used to change that name without starting a new\r
transaction.\r
*/\r
- void setCurrentTransactionName (const String& newName);\r
+ void setCurrentTransactionName (const String& newName) noexcept;\r
\r
/** Returns the name of the current transaction.\r
@see setCurrentTransactionName\r
*/\r
- String getCurrentTransactionName() const;\r
+ String getCurrentTransactionName() const noexcept;\r
\r
//==============================================================================\r
/** Returns true if there's at least one action in the list to undo.\r
@see getUndoDescription, undo, canRedo\r
*/\r
- bool canUndo() const;\r
+ bool canUndo() const noexcept;\r
\r
/** Tries to roll-back the last transaction.\r
@returns true if the transaction can be undone, and false if it fails, or\r
/** Returns true if there's at least one action in the list to redo.\r
@see getRedoDescription, redo, canUndo\r
*/\r
- bool canRedo() const;\r
+ bool canRedo() const noexcept;\r
\r
/** Tries to redo the last transaction that was undone.\r
@returns true if the transaction can be redone, and false if it fails, or\r
*/\r
Time getTimeOfRedoTransaction() const;\r
\r
- /** Returns true if the caller code is in the middle of an undo or redo action. */\r
- bool isPerformingUndoRedo() const;\r
-\r
private:\r
//==============================================================================\r
struct ActionSet;\r
+ friend struct ContainerDeletePolicy<ActionSet>;\r
OwnedArray<ActionSet> transactions, stashedFutureTransactions;\r
String newTransactionName;\r
int totalUnitsStored = 0, maxNumUnitsToKeep = 0, minimumTransactionsToKeep = 0, nextIndex = 0;\r
- bool newTransaction = true, isInsideUndoRedoCall = false;\r
- ActionSet* getCurrentSet() const;\r
- ActionSet* getNextSet() const;\r
+ bool newTransaction = true, reentrancyCheck = false;\r
+ ActionSet* getCurrentSet() const noexcept;\r
+ ActionSet* getNextSet() const noexcept;\r
void moveFutureTransactionsToStash();\r
void restoreStashedFutureTransactions();\r
void dropOldTransactionsIfTooLarge();\r
{\r
for (auto* c : other.children)\r
{\r
- auto* child = new SharedObject (*c);\r
+ auto child = new SharedObject (*c);\r
child->parent = this;\r
children.add (child);\r
}\r
{\r
jassert (parent == nullptr); // this should never happen unless something isn't obeying the ref-counting!\r
\r
- for (auto i = children.size(); --i >= 0;)\r
+ for (int i = children.size(); --i >= 0;)\r
{\r
- const Ptr c (children.getObjectPointerUnchecked (i));\r
+ const Ptr c (children.getObjectPointerUnchecked(i));\r
c->parent = nullptr;\r
children.remove (i);\r
c->sendParentChangeMessage();\r
}\r
}\r
\r
- SharedObject& getRoot() noexcept\r
+ SharedObject* getRoot() noexcept\r
{\r
- return parent == nullptr ? *this : parent->getRoot();\r
+ return parent == nullptr ? this : parent->getRoot();\r
}\r
\r
template <typename Function>\r
\r
if (numListeners == 1)\r
{\r
- valueTreesWithListeners.getUnchecked (0)->listeners.callExcluding (listenerToExclude, fn);\r
+ valueTreesWithListeners.getUnchecked(0)->listeners.callExcluding (listenerToExclude, fn);\r
}\r
else if (numListeners > 0)\r
{\r
\r
for (int i = 0; i < numListeners; ++i)\r
{\r
- auto* v = listenersCopy.getUnchecked (i);\r
+ auto* v = listenersCopy.getUnchecked(i);\r
\r
if (i == 0 || valueTreesWithListeners.contains (v))\r
v->listeners.callExcluding (listenerToExclude, fn);\r
\r
void sendPropertyChangeMessage (const Identifier& property, ValueTree::Listener* listenerToExclude = nullptr)\r
{\r
- ValueTree tree (*this);\r
+ ValueTree tree (this);\r
callListenersForAllParents (listenerToExclude, [&] (Listener& l) { l.valueTreePropertyChanged (tree, property); });\r
}\r
\r
void sendChildAddedMessage (ValueTree child)\r
{\r
- ValueTree tree (*this);\r
+ ValueTree tree (this);\r
callListenersForAllParents (nullptr, [&] (Listener& l) { l.valueTreeChildAdded (tree, child); });\r
}\r
\r
void sendChildRemovedMessage (ValueTree child, int index)\r
{\r
- ValueTree tree (*this);\r
+ ValueTree tree (this);\r
callListenersForAllParents (nullptr, [=, &tree, &child] (Listener& l) { l.valueTreeChildRemoved (tree, child, index); });\r
}\r
\r
void sendChildOrderChangedMessage (int oldIndex, int newIndex)\r
{\r
- ValueTree tree (*this);\r
+ ValueTree tree (this);\r
callListenersForAllParents (nullptr, [=, &tree] (Listener& l) { l.valueTreeChildOrderChanged (tree, oldIndex, newIndex); });\r
}\r
\r
void sendParentChangeMessage()\r
{\r
- ValueTree tree (*this);\r
+ ValueTree tree (this);\r
\r
- for (auto j = children.size(); --j >= 0;)\r
+ for (int j = children.size(); --j >= 0;)\r
if (auto* child = children.getObjectPointer (j))\r
child->sendParentChangeMessage();\r
\r
if (auto* existingValue = properties.getVarPointer (name))\r
{\r
if (*existingValue != newValue)\r
- undoManager->perform (new SetPropertyAction (*this, name, newValue, *existingValue,\r
+ undoManager->perform (new SetPropertyAction (this, name, newValue, *existingValue,\r
false, false, listenerToExclude));\r
}\r
else\r
{\r
- undoManager->perform (new SetPropertyAction (*this, name, newValue, {},\r
+ undoManager->perform (new SetPropertyAction (this, name, newValue, {},\r
true, false, listenerToExclude));\r
}\r
}\r
else\r
{\r
if (properties.contains (name))\r
- undoManager->perform (new SetPropertyAction (*this, name, {}, properties[name], false, true));\r
+ undoManager->perform (new SetPropertyAction (this, name, {}, properties [name], false, true));\r
}\r
}\r
\r
}\r
else\r
{\r
- for (auto i = properties.size(); --i >= 0;)\r
- undoManager->perform (new SetPropertyAction (*this, properties.getName (i), {},\r
- properties.getValueAt (i), false, true));\r
+ for (int i = properties.size(); --i >= 0;)\r
+ undoManager->perform (new SetPropertyAction (this, properties.getName(i), {},\r
+ properties.getValueAt(i), false, true));\r
}\r
}\r
\r
void copyPropertiesFrom (const SharedObject& source, UndoManager* undoManager)\r
{\r
- for (auto i = properties.size(); --i >= 0;)\r
+ for (int i = properties.size(); --i >= 0;)\r
if (! source.properties.contains (properties.getName (i)))\r
removeProperty (properties.getName (i), undoManager);\r
\r
for (int i = 0; i < source.properties.size(); ++i)\r
- setProperty (source.properties.getName (i), source.properties.getValueAt (i), undoManager);\r
+ setProperty (source.properties.getName(i), source.properties.getValueAt(i), undoManager);\r
}\r
\r
ValueTree getChildWithName (const Identifier& typeToMatch) const\r
{\r
for (auto* s : children)\r
if (s->type == typeToMatch)\r
- return ValueTree (*s);\r
+ return ValueTree (s);\r
\r
return {};\r
}\r
{\r
for (auto* s : children)\r
if (s->type == typeToMatch)\r
- return ValueTree (*s);\r
+ return ValueTree (s);\r
\r
auto newObject = new SharedObject (typeToMatch);\r
addChild (newObject, -1, undoManager);\r
- return ValueTree (*newObject);\r
+ return ValueTree (newObject);\r
}\r
\r
ValueTree getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const\r
{\r
for (auto* s : children)\r
if (s->properties[propertyName] == propertyValue)\r
- return ValueTree (*s);\r
+ return ValueTree (s);\r
\r
return {};\r
}\r
{\r
children.insert (index, child);\r
child->parent = this;\r
- sendChildAddedMessage (ValueTree (*child));\r
+ sendChildAddedMessage (ValueTree (child));\r
child->sendParentChangeMessage();\r
}\r
else\r
if (! isPositiveAndBelow (index, children.size()))\r
index = children.size();\r
\r
- undoManager->perform (new AddOrRemoveChildAction (*this, index, child));\r
+ undoManager->perform (new AddOrRemoveChildAction (this, index, child));\r
}\r
}\r
else\r
\r
void removeChild (int childIndex, UndoManager* undoManager)\r
{\r
- if (auto child = Ptr (children.getObjectPointer (childIndex)))\r
+ if (Ptr child = children.getObjectPointer (childIndex))\r
{\r
if (undoManager == nullptr)\r
{\r
}\r
else\r
{\r
- undoManager->perform (new AddOrRemoveChildAction (*this, childIndex, {}));\r
+ undoManager->perform (new AddOrRemoveChildAction (this, childIndex, nullptr));\r
}\r
}\r
}\r
if (! isPositiveAndBelow (newIndex, children.size()))\r
newIndex = children.size() - 1;\r
\r
- undoManager->perform (new MoveChildAction (*this, currentIndex, newIndex));\r
+ undoManager->perform (new MoveChildAction (this, currentIndex, newIndex));\r
}\r
}\r
}\r
\r
for (int i = 0; i < children.size(); ++i)\r
{\r
- auto* child = newOrder.getUnchecked (i)->object.get();\r
+ auto* child = newOrder.getUnchecked(i)->object.get();\r
\r
if (children.getObjectPointerUnchecked (i) != child)\r
{\r
return false;\r
\r
for (int i = 0; i < children.size(); ++i)\r
- if (! children.getObjectPointerUnchecked (i)->isEquivalentTo (*other.children.getObjectPointerUnchecked (i)))\r
+ if (! children.getObjectPointerUnchecked(i)->isEquivalentTo (*other.children.getObjectPointerUnchecked(i)))\r
return false;\r
\r
return true;\r
\r
XmlElement* createXml() const\r
{\r
- auto* xml = new XmlElement (type);\r
+ auto xml = new XmlElement (type);\r
properties.copyToXmlAttributes (*xml);\r
\r
// (NB: it's faster to add nodes to XML elements in reverse order)\r
- for (auto i = children.size(); --i >= 0;)\r
- xml->prependChildElement (children.getObjectPointerUnchecked (i)->createXml());\r
+ for (int i = children.size(); --i >= 0;)\r
+ xml->prependChildElement (children.getObjectPointerUnchecked(i)->createXml());\r
\r
return xml;\r
}\r
for (int j = 0; j < properties.size(); ++j)\r
{\r
output.writeString (properties.getName (j).toString());\r
- properties.getValueAt (j).writeToStream (output);\r
+ properties.getValueAt(j).writeToStream (output);\r
}\r
\r
output.writeCompressedInt (children.size());\r
\r
- for (auto* c : children)\r
- writeObjectToStream (output, c);\r
+ for (int i = 0; i < children.size(); ++i)\r
+ writeObjectToStream (output, children.getObjectPointerUnchecked(i));\r
}\r
\r
static void writeObjectToStream (OutputStream& output, const SharedObject* object)\r
//==============================================================================\r
struct SetPropertyAction : public UndoableAction\r
{\r
- SetPropertyAction (Ptr targetObject, const Identifier& propertyName,\r
+ SetPropertyAction (SharedObject* so, const Identifier& propertyName,\r
const var& newVal, const var& oldVal, bool isAdding, bool isDeleting,\r
ValueTree::Listener* listenerToExclude = nullptr)\r
- : target (static_cast<Ptr&&> (targetObject)),\r
- name (propertyName), newValue (newVal), oldValue (oldVal),\r
+ : target (so), name (propertyName), newValue (newVal), oldValue (oldVal),\r
isAddingNewProperty (isAdding), isDeletingProperty (isDeleting),\r
excludeListener (listenerToExclude)\r
{\r
if (auto* next = dynamic_cast<SetPropertyAction*> (nextAction))\r
if (next->target == target && next->name == name\r
&& ! (next->isAddingNewProperty || next->isDeletingProperty))\r
- return new SetPropertyAction (*target, name, next->newValue, oldValue, false, false);\r
+ return new SetPropertyAction (target, name, next->newValue, oldValue, false, false);\r
}\r
\r
return nullptr;\r
//==============================================================================\r
struct AddOrRemoveChildAction : public UndoableAction\r
{\r
- AddOrRemoveChildAction (Ptr parentObject, int index, SharedObject* newChild)\r
- : target (static_cast<Ptr&&> (parentObject)),\r
- child (newChild != nullptr ? newChild : target->children.getObjectPointer (index)),\r
+ AddOrRemoveChildAction (SharedObject* parentObject, int index, SharedObject* newChild)\r
+ : target (parentObject),\r
+ child (newChild != nullptr ? newChild : parentObject->children.getObjectPointer (index)),\r
childIndex (index),\r
isDeleting (newChild == nullptr)\r
{\r
if (isDeleting)\r
target->removeChild (childIndex, nullptr);\r
else\r
- target->addChild (child.get(), childIndex, nullptr);\r
+ target->addChild (child, childIndex, nullptr);\r
\r
return true;\r
}\r
{\r
if (isDeleting)\r
{\r
- target->addChild (child.get(), childIndex, nullptr);\r
+ target->addChild (child, childIndex, nullptr);\r
}\r
else\r
{\r
//==============================================================================\r
struct MoveChildAction : public UndoableAction\r
{\r
- MoveChildAction (Ptr parentObject, int fromIndex, int toIndex) noexcept\r
- : parent (static_cast<Ptr&&> (parentObject)), startIndex (fromIndex), endIndex (toIndex)\r
+ MoveChildAction (SharedObject* parentObject, int fromIndex, int toIndex) noexcept\r
+ : parent (parentObject), startIndex (fromIndex), endIndex (toIndex)\r
{\r
}\r
\r
{\r
}\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const ValueTree ValueTree::invalid;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const ValueTree ValueTree::invalid);\r
\r
ValueTree::ValueTree (const Identifier& type) : object (new ValueTree::SharedObject (type))\r
{\r
}\r
\r
ValueTree::ValueTree (const Identifier& type,\r
- std::initializer_list<NamedValueSet::NamedValue> properties,\r
+ std::initializer_list<std::pair<Identifier, var>> properties,\r
std::initializer_list<ValueTree> subTrees)\r
: ValueTree (type)\r
{\r
- object->properties = NamedValueSet (std::move (properties));\r
+ for (auto& prop : properties)\r
+ setProperty (prop.first, prop.second, nullptr);\r
\r
for (auto& tree : subTrees)\r
addChild (tree, -1, nullptr);\r
}\r
\r
-ValueTree::ValueTree (SharedObject::Ptr so) noexcept : object (static_cast<SharedObject::Ptr&&> (so)) {}\r
-ValueTree::ValueTree (SharedObject& so) noexcept : object (so) {}\r
+ValueTree::ValueTree (SharedObject* so) noexcept : object (so)\r
+{\r
+}\r
\r
ValueTree::ValueTree (const ValueTree& other) noexcept : object (other.object)\r
{\r
\r
ValueTree ValueTree::createCopy() const\r
{\r
- if (object != nullptr)\r
- return ValueTree (*new SharedObject (*object));\r
-\r
- return {};\r
-}\r
-\r
-void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager)\r
-{\r
- jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
-\r
- if (source.object == nullptr)\r
- removeAllProperties (undoManager);\r
- else if (object != nullptr)\r
- object->copyPropertiesFrom (*(source.object), undoManager);\r
-}\r
-\r
-void ValueTree::copyPropertiesAndChildrenFrom (const ValueTree& source, UndoManager* undoManager)\r
-{\r
- jassert (object != nullptr || source.object == nullptr); // Trying to copy to a null ValueTree will fail!\r
-\r
- copyPropertiesFrom (source, undoManager);\r
- removeAllChildren (undoManager);\r
-\r
- if (object != nullptr && source.object != nullptr)\r
- for (auto& child : source.object->children)\r
- object->addChild (createCopyIfNotNull (child), -1, undoManager);\r
+ return ValueTree (createCopyIfNotNull (object.get()));\r
}\r
\r
bool ValueTree::hasType (const Identifier& typeName) const noexcept\r
\r
ValueTree ValueTree::getParent() const noexcept\r
{\r
- if (object != nullptr)\r
- if (auto p = object->parent)\r
- return ValueTree (*p);\r
-\r
- return {};\r
+ return ValueTree (object != nullptr ? object->parent\r
+ : static_cast<SharedObject*> (nullptr));\r
}\r
\r
ValueTree ValueTree::getRoot() const noexcept\r
{\r
- if (object != nullptr)\r
- return ValueTree (object->getRoot());\r
-\r
- return {};\r
+ return ValueTree (object != nullptr ? object->getRoot()\r
+ : static_cast<SharedObject*> (nullptr));\r
}\r
\r
ValueTree ValueTree::getSibling (int delta) const noexcept\r
{\r
- if (object != nullptr)\r
- if (auto* p = object->parent)\r
- if (auto* c = p->children.getObjectPointer (p->indexOf (*this) + delta))\r
- return ValueTree (*c);\r
+ if (object == nullptr || object->parent == nullptr)\r
+ return {};\r
\r
- return {};\r
+ auto index = object->parent->indexOf (*this) + delta;\r
+ return ValueTree (object->parent->children.getObjectPointer (index));\r
}\r
\r
static const var& getNullVarRef() noexcept\r
: object->properties.getName (index);\r
}\r
\r
+void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager)\r
+{\r
+ jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail!\r
+\r
+ if (source.object == nullptr)\r
+ removeAllProperties (undoManager);\r
+ else if (object != nullptr)\r
+ object->copyPropertiesFrom (*(source.object), undoManager);\r
+}\r
+\r
int ValueTree::getReferenceCount() const noexcept\r
{\r
return object != nullptr ? object->getReferenceCount() : 0;\r
tree.removeListener (this);\r
}\r
\r
- var getValue() const override { return tree[property]; }\r
+ var getValue() const override { return tree [property]; }\r
void setValue (const var& newValue) override { tree.setProperty (property, newValue, undoManager); }\r
\r
private:\r
\r
ValueTree ValueTree::getChild (int index) const\r
{\r
- if (object != nullptr)\r
- if (auto* c = object->children.getObjectPointer (index))\r
- return ValueTree (*c);\r
-\r
- return {};\r
+ return ValueTree (object != nullptr ? object->children.getObjectPointer (index)\r
+ : static_cast<SharedObject*> (nullptr));\r
}\r
\r
-ValueTree::Iterator::Iterator (const ValueTree& v, bool isEnd)\r
+ValueTree::Iterator::Iterator (const ValueTree& v, bool isEnd) noexcept\r
: internal (v.object != nullptr ? (isEnd ? v.object->children.end() : v.object->children.begin()) : nullptr)\r
{\r
}\r
\r
-ValueTree::Iterator& ValueTree::Iterator::operator++()\r
+ValueTree::Iterator& ValueTree::Iterator::operator++() noexcept\r
{\r
internal = static_cast<SharedObject**> (internal) + 1;\r
return *this;\r
}\r
\r
-bool ValueTree::Iterator::operator== (const Iterator& other) const { return internal == other.internal; }\r
-bool ValueTree::Iterator::operator!= (const Iterator& other) const { return internal != other.internal; }\r
+bool ValueTree::Iterator::operator!= (const Iterator& other) const noexcept\r
+{\r
+ return internal != other.internal;\r
+}\r
\r
ValueTree ValueTree::Iterator::operator*() const\r
{\r
- return ValueTree (SharedObject::Ptr (*static_cast<SharedObject**> (internal)));\r
+ return ValueTree (*static_cast<SharedObject**> (internal));\r
}\r
\r
ValueTree::Iterator ValueTree::begin() const noexcept { return Iterator (*this, false); }\r
\r
bool ValueTree::isAChildOf (const ValueTree& possibleParent) const noexcept\r
{\r
- return object != nullptr && object->isAChildOf (possibleParent.object.get());\r
+ return object != nullptr && object->isAChildOf (possibleParent.object);\r
}\r
\r
int ValueTree::indexOf (const ValueTree& child) const noexcept\r
jassert (object != nullptr); // Trying to add a child to a null ValueTree!\r
\r
if (object != nullptr)\r
- object->addChild (child.object.get(), index, undoManager);\r
+ object->addChild (child.object, index, undoManager);\r
}\r
\r
void ValueTree::appendChild (const ValueTree& child, UndoManager* undoManager)\r
jassert (object != nullptr);\r
\r
for (auto* o : object->children)\r
- {\r
- jassert (o != nullptr);\r
- list.add (new ValueTree (*o));\r
- }\r
+ list.add (new ValueTree (o));\r
}\r
\r
void ValueTree::reorderChildren (const OwnedArray<ValueTree>& newOrder, UndoManager* undoManager)\r
//==============================================================================\r
void ValueTree::writeToStream (OutputStream& output) const\r
{\r
- SharedObject::writeObjectToStream (output, object.get());\r
+ SharedObject::writeObjectToStream (output, object);\r
}\r
\r
ValueTree ValueTree::readFromStream (InputStream& input)\r
return v;\r
\r
v.object->children.add (child.object);\r
- child.object->parent = v.object.get();\r
+ child.object->parent = v.object;\r
}\r
\r
return v;\r
const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:";\r
\r
for (int i = 1 + r.nextInt (numElementsInArray (buffer) - 2); --i >= 0;)\r
- buffer[i] = chars[r.nextInt (sizeof (chars) - 1)];\r
+ buffer[i] = chars [r.nextInt (sizeof (chars) - 1)];\r
\r
String result (buffer);\r
\r
@endverbatim\r
*/\r
ValueTree (const Identifier& type,\r
- std::initializer_list<NamedValueSet::NamedValue> properties,\r
+ std::initializer_list<std::pair<Identifier, var>> properties,\r
std::initializer_list<ValueTree> subTrees = {});\r
\r
/** Creates a reference to another ValueTree. */\r
ValueTree (const ValueTree&) noexcept;\r
\r
+ /** Changes this object to be a reference to the given tree. */\r
+ ValueTree& operator= (const ValueTree&);\r
+\r
/** Move constructor */\r
ValueTree (ValueTree&&) noexcept;\r
\r
- /** Changes this object to be a reference to the given tree.\r
- Note that calling this just points this at the new object and invokes the\r
- Listener::valueTreeRedirected callback, but it's not an undoable operation. If\r
- you're trying to replace an entire tree in an undoable way, you probably want\r
- to use copyPropertiesAndChildrenFrom() instead.\r
- */\r
- ValueTree& operator= (const ValueTree&);\r
-\r
/** Destructor. */\r
~ValueTree();\r
\r
/** Returns a deep copy of this tree and all its sub-trees. */\r
ValueTree createCopy() const;\r
\r
- /** Overwrites all the properties in this tree with the properties of the source tree.\r
- Any properties that already exist will be updated; and new ones will be added, and\r
- any that are not present in the source tree will be removed.\r
- @see copyPropertiesAndChildrenFrom\r
- */\r
- void copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager);\r
-\r
- /** Replaces all children and properties of this object with copies of those from\r
- the source object.\r
- @see copyPropertiesFrom\r
- */\r
- void copyPropertiesAndChildrenFrom (const ValueTree& source, UndoManager* undoManager);\r
-\r
//==============================================================================\r
/** Returns the type of this tree.\r
The type is specified when the ValueTree is created.\r
Value getPropertyAsValue (const Identifier& name, UndoManager* undoManager,\r
bool shouldUpdateSynchronously = false);\r
\r
+ /** Overwrites all the properties in this tree with the properties of the source tree.\r
+ Any properties that already exist will be updated; and new ones will be added, and\r
+ any that are not present in the source tree will be removed.\r
+ */\r
+ void copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager);\r
+\r
//==============================================================================\r
/** Returns the number of child trees inside this one.\r
@see getChild\r
*/\r
struct Iterator\r
{\r
- Iterator (const ValueTree&, bool isEnd);\r
- Iterator& operator++();\r
+ Iterator (const ValueTree&, bool isEnd) noexcept;\r
+ Iterator& operator++() noexcept;\r
\r
- bool operator== (const Iterator&) const;\r
- bool operator!= (const Iterator&) const;\r
+ bool operator!= (const Iterator&) const noexcept;\r
ValueTree operator*() const;\r
\r
using difference_type = std::ptrdiff_t;\r
/* An invalid ValueTree that can be used if you need to return one as an error condition, etc.\r
@deprecated If you need an empty ValueTree object, just use ValueTree() or {}.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const ValueTree invalid;)\r
+ JUCE_DEPRECATED_STATIC (static const ValueTree invalid);\r
\r
private:\r
//==============================================================================\r
void createListOfChildren (OwnedArray<ValueTree>&) const;\r
void reorderChildren (const OwnedArray<ValueTree>&, UndoManager*);\r
\r
- explicit ValueTree (ReferenceCountedObjectPtr<SharedObject>) noexcept;\r
- explicit ValueTree (SharedObject&) noexcept;\r
+ explicit ValueTree (SharedObject*) noexcept;\r
};\r
\r
} // namespace juce\r
jassert (delimiter.isNotEmpty());\r
\r
StringArray elements;\r
-\r
for (auto& v : input)\r
elements.add (v.toString());\r
\r
auto maxChannels = jmin (static_cast<size_t> (src.getNumChannels()), static_cast<size_t> (numChannels));\r
\r
for (size_t ch = 0; ch < maxChannels; ++ch)\r
- FloatVectorOperations::copy (channelPtr (ch) + dstPos,\r
+ FloatVectorOperations::copy (channelPtr (ch),\r
src.getReadPointer (static_cast<int> (ch),\r
static_cast<int> (srcPos * sizeFactor)),\r
n);\r
for (size_t ch = 0; ch < maxChannels; ++ch)\r
FloatVectorOperations::copy (dst.getWritePointer (static_cast<int> (ch),\r
static_cast<int> (dstPos * sizeFactor)),\r
- channelPtr (ch) + srcPos, n);\r
+ channelPtr (ch), n);\r
\r
return *this;\r
}\r
pointed to by the receiver remains valid through-out the life-time of the\r
returned sub-block.\r
\r
- @param newOffset The index of an element inside the receiver which will\r
+ @param newOffset The index of an element inside the reciever which will\r
will become the first element of the return value.\r
@param newLength The number of elements of the newly created sub-block.\r
*/\r
pointed to by the receiver remains valid through-out the life-time of the\r
returned sub-block.\r
\r
- @param newOffset The index of an element inside the receiver which will\r
+ @param newOffset The index of an element inside the reciever which will\r
will become the first element of the return value.\r
The return value will include all subsequent elements\r
of the receiver.\r
\r
if (! value.isSmoothing())\r
{\r
- multiply (src, value.getTargetValue());\r
+ copy (src);\r
}\r
else\r
{\r
/**\r
A wrapper around the platform's native SIMD register type.\r
\r
- This class is only available on SIMD machines. Use JUCE_USE_SIMD to query\r
+ This class is only availabe on SIMD machines. Use JUCE_USE_SIMD to query\r
if SIMD is avaialble for your system.\r
\r
SIMDRegister<Type> is a templated class representing the native\r
template <typename Scalar>\r
struct CmplxSIMDOps\r
{\r
- using vSIMDType = typename SIMDNativeOps<Scalar>::vSIMDType;\r
+ typedef typename SIMDNativeOps<Scalar>::vSIMDType vSIMDType;\r
\r
static inline vSIMDType JUCE_VECTOR_CALLTYPE load (const Scalar* a) noexcept\r
{\r
template <typename Scalar>\r
struct CmplxSIMDOps<std::complex<Scalar>>\r
{\r
- using vSIMDType = typename SIMDNativeOps<Scalar>::vSIMDType;\r
+ typedef typename SIMDNativeOps<Scalar>::vSIMDType vSIMDType;\r
\r
static inline vSIMDType JUCE_VECTOR_CALLTYPE load (const std::complex<Scalar>* a) noexcept\r
{\r
}\r
\r
// These tests need to be strictly run on all platforms supported by JUCE as the\r
-// SIMD code is highly platform dependent.\r
+// SIMD code is highly platform dependant.\r
\r
class SIMDRegisterUnitTests : public UnitTest\r
{\r
WindowingFunction<FloatType> theWindow (order + 1, type, false, beta);\r
theWindow.multiplyWithWindowingTable (c, order + 1);\r
\r
- return *result;\r
+ return result;\r
}\r
\r
template <typename FloatType>\r
\r
for (size_t i = 0; i <= order; ++i)\r
{\r
- if (i == order / 2 && order % 2 == 0)\r
+ if (i == order / 2)\r
{\r
c[i] = static_cast<FloatType> (2 * normalizedFrequency);\r
}\r
}\r
}\r
\r
- return *result;\r
+ return result;\r
}\r
\r
template <typename FloatType>\r
}\r
}\r
\r
- return *result;\r
+ return result;\r
}\r
\r
template <typename FloatType>\r
\r
c[2 * n + 1] = static_cast<FloatType> (0.5);\r
\r
- return *result;\r
+ return result;\r
}\r
\r
template <typename FloatType>\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
FloatType normalizedTransitionWidth,\r
FloatType passbandAttenuationdB,\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
FloatType normalizedTransitionWidth,\r
FloatType passbandAttenuationdB,\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
FloatType normalizedTransitionWidth,\r
FloatType passbandAttenuationdB,\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
FloatType normalizedTransitionWidth,\r
FloatType passbandAttenuationdB,\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
FloatType normalizedTransitionWidth,\r
FloatType passbandAttenuationdB,\r
g.add ((1.0 - p[i + r]) / (1.0 - z[i]));\r
}\r
\r
- ReferenceCountedArray<IIR::Coefficients<FloatType>> cascadedCoefficients;\r
+ Array<IIR::Coefficients<FloatType>> cascadedCoefficients;\r
\r
if (r == 1)\r
{\r
auto b1 = b0;\r
auto a1 = static_cast<FloatType> (-std::real (p[0]));\r
\r
- cascadedCoefficients.add (new IIR::Coefficients<FloatType> (b0, b1, 1.0f, a1));\r
+ cascadedCoefficients.add ({ b0, b1, 1.0f, a1 });\r
}\r
\r
for (int i = 0; i < L; ++i)\r
auto a1 = static_cast<FloatType> (std::real (-p[i+r] - std::conj (p[i + r])));\r
auto a2 = static_cast<FloatType> (std::real ( p[i+r] * std::conj (p[i + r])));\r
\r
- cascadedCoefficients.add (new IIR::Coefficients<FloatType> (b0, b1, b2, 1, a1, a2));\r
+ cascadedCoefficients.add ({ b0, b1, b2, 1, a1, a2 });\r
}\r
\r
return cascadedCoefficients;\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRLowpassHighOrderButterworthMethod (FloatType frequency,\r
double sampleRate, int order)\r
{\r
jassert (frequency > 0 && frequency <= sampleRate * 0.5);\r
jassert (order > 0);\r
\r
- ReferenceCountedArray<IIR::Coefficients<FloatType>> arrayFilters;\r
+ Array<IIR::Coefficients<FloatType>> arrayFilters;\r
\r
if (order % 2 == 1)\r
{\r
}\r
\r
template <typename FloatType>\r
-ReferenceCountedArray<IIR::Coefficients<FloatType>>\r
+Array<IIR::Coefficients<FloatType>>\r
FilterDesign<FloatType>::designIIRHighpassHighOrderButterworthMethod (FloatType frequency,\r
double sampleRate, int order)\r
{\r
jassert (frequency > 0 && frequency <= sampleRate * 0.5);\r
jassert (order > 0);\r
\r
- ReferenceCountedArray<IIR::Coefficients<FloatType>> arrayFilters;\r
+ Array<IIR::Coefficients<FloatType>> arrayFilters;\r
\r
if (order % 2 == 1)\r
{\r
IIRPolyphaseAllpassStructure structure;\r
\r
for (int i = 0; i < N; i += 2)\r
- structure.directPath.add (new IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
- 0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
+ structure.directPath.add (IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
+ 0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
\r
- structure.delayedPath.add (new IIR::Coefficients<FloatType> (0, 1, 1, 0));\r
+ structure.delayedPath.add (IIR::Coefficients<FloatType> (0, 1, 1, 0));\r
\r
for (int i = 1; i < N; i += 2)\r
- structure.delayedPath.add (new IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
- 0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
-\r
- structure.alpha.addArray (ai);\r
+ structure.delayedPath.add (IIR::Coefficients<FloatType> (static_cast<FloatType> (ai[i]),\r
+ 0, 1, 1, 0, static_cast<FloatType> (ai[i])));\r
\r
return structure;\r
}\r
\r
It generates linear phase filters coefficients.\r
\r
- Note: The flatTop WindowingMethod generates an impulse response with a\r
+ Note : the flatTop WindowingMethod generates an impulse response with a\r
maximum amplitude higher than one, and might be normalized if necessary\r
depending on the applications.\r
\r
@param stopbandAttenuationdB the attenuation in dB expected in the stop band\r
*/\r
\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
- FloatType normalizedTransitionWidth,\r
- FloatType passbandAttenuationdB,\r
- FloatType stopbandAttenuationdB);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+ FloatType normalizedTransitionWidth,\r
+ FloatType passbandAttenuationdB,\r
+ FloatType stopbandAttenuationdB);\r
\r
//==============================================================================\r
/** This method returns an array of IIR::Coefficients, made to be used in\r
an attenuation of -6 dB times order / octave\r
*/\r
\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
- int order);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+ int order);\r
\r
/** This method returns an array of IIR::Coefficients, made to be used in\r
cascaded IIRFilters, providing a minimum phase high-pass filter without any\r
an attenuation of -6 dB times order / octave\r
*/\r
\r
- static ReferenceCountedArray<IIRCoefficients> designIIRHighpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
- int order);\r
+ static Array<IIRCoefficients> designIIRHighpassHighOrderButterworthMethod (FloatType frequency, double sampleRate,\r
+ int order);\r
\r
/** This method returns an array of IIR::Coefficients, made to be used in\r
cascaded IIRFilters, providing a minimum phase low-pass filter without any\r
@param passbandAttenuationdB the lowest attenuation in dB expected in the pass band\r
@param stopbandAttenuationdB the attenuation in dB expected in the stop band\r
*/\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
- FloatType normalizedTransitionWidth,\r
- FloatType passbandAttenuationdB,\r
- FloatType stopbandAttenuationdB);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderChebyshev1Method (FloatType frequency, double sampleRate,\r
+ FloatType normalizedTransitionWidth,\r
+ FloatType passbandAttenuationdB,\r
+ FloatType stopbandAttenuationdB);\r
\r
/** This method returns an array of IIR::Coefficients, made to be used in\r
cascaded IIRFilters, providing a minimum phase low-pass filter without any\r
@param passbandAttenuationdB the lowest attenuation in dB expected in the pass band\r
@param stopbandAttenuationdB the attenuation in dB expected in the stop band\r
*/\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
- FloatType normalizedTransitionWidth,\r
- FloatType passbandAttenuationdB,\r
- FloatType stopbandAttenuationdB);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderChebyshev2Method (FloatType frequency, double sampleRate,\r
+ FloatType normalizedTransitionWidth,\r
+ FloatType passbandAttenuationdB,\r
+ FloatType stopbandAttenuationdB);\r
\r
/** This method returns an array of IIR::Coefficients, made to be used in\r
cascaded IIR::Filters, providing a minimum phase low-pass filter with ripples\r
@param passbandAttenuationdB the lowest attenuation in dB expected in the pass band\r
@param stopbandAttenuationdB the attenuation in dB expected in the stop band\r
*/\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
- FloatType normalizedTransitionWidth,\r
- FloatType passbandAttenuationdB,\r
- FloatType stopbandAttenuationdB);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderEllipticMethod (FloatType frequency, double sampleRate,\r
+ FloatType normalizedTransitionWidth,\r
+ FloatType passbandAttenuationdB,\r
+ FloatType stopbandAttenuationdB);\r
\r
/** The structure returned by the function designIIRLowpassHalfBandPolyphaseAllpassMethod.\r
\r
- The two first members of this structure directPath and delayedPath are arrays of\r
+ The two members of this structure directPath and delayedPath are arrays of\r
IIR::Coefficients, made of polyphase second order allpass filters and an additional\r
delay in the second array, that can be used in cascaded filters processed in two\r
parallel paths, which must be summed at the end to get the high order efficient\r
- low-pass filtering. The last member is an array with the useful parameters for\r
- simulating the structure using any custom processing function.\r
+ low-pass filtering.\r
*/\r
- struct IIRPolyphaseAllpassStructure\r
- {\r
- ReferenceCountedArray<IIRCoefficients> directPath, delayedPath;\r
- Array<double> alpha;\r
- };\r
+ struct IIRPolyphaseAllpassStructure { Array<IIRCoefficients> directPath, delayedPath; };\r
\r
/** This method generates arrays of IIR::Coefficients for a low-pass filter, with\r
a cutoff frequency at half band, using an algorithm described in the article\r
//==============================================================================\r
static Array<double> getPartialImpulseResponseHn (int n, double kp);\r
\r
- static ReferenceCountedArray<IIRCoefficients> designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
- FloatType normalizedTransitionWidth,\r
- FloatType passbandAttenuationdB,\r
- FloatType stopbandAttenuationdB);\r
+ static Array<IIRCoefficients> designIIRLowpassHighOrderGeneralMethod (int type, FloatType frequency, double sampleRate,\r
+ FloatType normalizedTransitionWidth,\r
+ FloatType passbandAttenuationdB,\r
+ FloatType stopbandAttenuationdB);\r
FilterDesign() = delete;\r
};\r
\r
\r
buffersInputSegments.clear();\r
buffersImpulseSegments.clear();\r
- bufferOutput.clear();\r
\r
for (size_t i = 0; i < numInputSegments; ++i)\r
{\r
stopThread (10000);\r
}\r
\r
- //==============================================================================\r
- /** Inits the size of the interpolation buffer. */\r
- void initProcessing (int maximumBufferSize)\r
- {\r
- stopThread (1000);\r
-\r
- interpolationBuffer.setSize (1, maximumBufferSize, false, false, true);\r
- mustInterpolate = false;\r
- }\r
-\r
//==============================================================================\r
/** Adds a new change request. */\r
void addToFifo (ChangeRequest type, juce::var parameter)\r
// action depending on the change level\r
if (changeLevel == 3)\r
{\r
+ interpolationBuffer.setSize (2, static_cast<int> (currentInfo.maximumBufferSize), false, false, true);\r
+\r
loadImpulseResponse();\r
processImpulseResponse();\r
initializeConvolutionEngines();\r
{\r
auto&& buffer = output.getSingleChannelBlock (channel);\r
\r
- interpolationBuffer.copyFrom (0, 0, input.getChannelPointer (channel), (int) numSamples);\r
+ interpolationBuffer.copyFrom ((int) channel, 0, input.getChannelPointer (channel), (int) numSamples);\r
\r
engines[(int) channel]->processSamples (input.getChannelPointer (channel), buffer.getChannelPointer (0), numSamples);\r
changeVolumes[channel].applyGain (buffer.getChannelPointer (0), (int) numSamples);\r
\r
- auto* interPtr = interpolationBuffer.getWritePointer (0);\r
+ auto* interPtr = interpolationBuffer.getWritePointer ((int) channel);\r
engines[(int) channel + 2]->processSamples (interPtr, interPtr, numSamples);\r
changeVolumes[channel + 2].applyGain (interPtr, (int) numSamples);\r
\r
- buffer += interpolated;\r
+ buffer += interpolated.getSingleChannelBlock (channel);\r
}\r
\r
if (input.getNumChannels() > 1 && currentInfo.wantsStereo == false)\r
juce::var (static_cast<int> (spec.maximumBlockSize)) };\r
\r
pimpl->addToFifo (types, parameters, 2);\r
- pimpl->initProcessing (static_cast<int> (spec.maximumBlockSize));\r
\r
for (size_t channel = 0; channel < spec.numChannels; ++channel)\r
{\r
formats registered in JUCE, and performs some resampling and pre-processing\r
as well if needed.\r
\r
- Note: Obviously, don't try to use this function on float samples, since the\r
+ Note : obviously, don't try to use this function on float samples, since the\r
data is supposed to be an audio file in its binary format, and be sure that\r
the original data is not going to move at all its memory location during the\r
process !!\r
FFTWImpl (size_t orderToUse, DynamicLibrary&& libraryToUse, const Symbols& symbols)\r
: fftwLibrary (std::move (libraryToUse)), fftw (symbols), order (static_cast<size_t> (orderToUse))\r
{\r
- ScopedLock lock (getFFTWPlanLock());\r
-\r
auto n = (1u << order);\r
HeapBlock<Complex<float>> in (n), out (n);\r
\r
\r
~FFTWImpl() override\r
{\r
- ScopedLock lock (getFFTWPlanLock());\r
-\r
fftw.destroy_fftw (c2cForward);\r
fftw.destroy_fftw (c2cInverse);\r
fftw.destroy_fftw (r2c);\r
FloatVectorOperations::multiply ((float*) inputOutputData, 1.0f / static_cast<float> (n), (int) n);\r
}\r
\r
- //==============================================================================\r
- // fftw's plan_* and destroy_* methods are NOT thread safe. So we need to share\r
- // a lock between all instances of FFTWImpl\r
- static CriticalSection& getFFTWPlanLock() noexcept\r
- {\r
- static CriticalSection cs;\r
- return cs;\r
- }\r
-\r
//==============================================================================\r
DynamicLibrary fftwLibrary;\r
Symbols fftw;\r
\r
ID: juce_dsp\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE DSP classes\r
description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
website: http://www.juce.com/juce\r
//==============================================================================\r
#undef Complex // apparently some C libraries actually define these symbols (!)\r
#undef Factor\r
-#undef check\r
\r
namespace juce\r
{\r
/** Provides a fast approximation of the function cosh(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function cosh(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function sinh(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function sinh(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function tanh(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function tanh(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -5 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function cos(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi and +pi for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function cos(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi and +pi for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function sin(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi and +pi for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function sin(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi and +pi for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function tan(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi/2 and +pi/2 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function tan(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -pi/2 and +pi/2 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function exp(x) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -6 and +4 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function exp(x) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -6 and +4 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function log(x+1) using a Pade approximant\r
continued fraction, calculated sample by sample.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -0.8 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
/** Provides a fast approximation of the function log(x+1) using a Pade approximant\r
continued fraction, calculated on a whole buffer.\r
\r
- Note: This is an approximation which works on a limited range. You are\r
+ Note : this is an approximation which works on a limited range. You are\r
advised to use input values only between -0.8 and +5 for limiting the error.\r
*/\r
template <typename FloatType>\r
LookupTableTransform<float> tanhApprox ([] (float x) { return std::tanh (x); }, -5.0f, 5.0f, 64);\r
auto outValue = tanhApprox (4.2f);\r
\r
- Note: If you try to call the function with an input outside the provided\r
+ Note : if you try to call the function with an input outside the provided\r
range, it will return either the first or the last recorded LookupTable value.\r
\r
@see LookupTable\r
tmp = _mm256_hadd_epi32 (tmp, tmp);\r
\r
#if JUCE_GCC\r
- return (int32_t) (tmp[0] + tmp[2]);\r
+ return tmp[0] + tmp[2];\r
#else\r
constexpr int mask = (2 << 0) | (3 << 2) | (0 << 4) | (1 << 6);\r
\r
{\r
static constexpr size_t n = sizeof (vSIMDType) / sizeof (ScalarType);\r
static constexpr size_t mask = (sizeof (vSIMDType) / sizeof (ScalarType)) - 1;\r
- static constexpr size_t bits = SIMDInternal::Log2Helper<(int) n>::value;\r
+ static constexpr size_t bits = SIMDInternal::Log2Helper<n>::value;\r
\r
// helper types\r
using MaskType = typename SIMDInternal::MaskTypeFor<ScalarType>::type;\r
*/\r
using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
\r
- /** A typedef for a ref-counted pointer to the coefficients object */\r
- using CoefficientsPtr = typename Coefficients<NumericType>::Ptr;\r
-\r
//==============================================================================\r
/** This will create a filter which will produce silence. */\r
Filter() : coefficients (new Coefficients<NumericType>) { reset(); }\r
\r
/** Creates a filter with a given set of coefficients. */\r
- Filter (CoefficientsPtr coefficientsToUse) : coefficients (static_cast<CoefficientsPtr&&> (coefficientsToUse)) { reset(); }\r
+ Filter (Coefficients<NumericType>* coefficientsToUse) : coefficients (coefficientsToUse) { reset(); }\r
\r
Filter (const Filter&) = default;\r
Filter (Filter&&) = default;\r
}\r
\r
//==============================================================================\r
- /** The coefficients of the FIR filter. It's up to the caller to ensure that\r
+ /** The coefficients of the FIR filter. It's up to the called to ensure that\r
these coefficients are modified in a thread-safe way.\r
\r
If you change the order of the coefficients then you must call reset after\r
AudioBlock<NumericType> fir (firBlock, 1, static_cast<size_t> (size));\r
fillRandom (random, fir.getChannelPointer (0), static_cast<size_t> (size));\r
\r
- FIR::Filter<SampleType> filter (*new FIR::Coefficients<NumericType> (fir.getChannelPointer (0), static_cast<size_t> (size)));\r
+ FIR::Filter<SampleType> filter (new FIR::Coefficients<NumericType> (fir.getChannelPointer (0), static_cast<size_t> (size)));\r
ProcessSpec spec {0.0, n, 1};\r
filter.prepare (spec);\r
\r
\r
auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
\r
- return *new Coefficients (n, n, n + 1, n - 1);\r
+ return new Coefficients (n, n, n + 1, n - 1);\r
}\r
\r
template <typename NumericType>\r
\r
auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
\r
- return *new Coefficients (1, -1, n + 1, n - 1);\r
+ return new Coefficients (1, -1, n + 1, n - 1);\r
}\r
\r
template <typename NumericType>\r
\r
auto n = std::tan (MathConstants<NumericType>::pi * frequency / static_cast<NumericType> (sampleRate));\r
\r
- return *new Coefficients (n - 1, n + 1, n + 1, n - 1);\r
+ return new Coefficients (n - 1, n + 1, n + 1, n - 1);\r
}\r
\r
template <typename NumericType>\r
auto invQ = 1 / Q;\r
auto c1 = 1 / (1 + invQ * n + nSquared);\r
\r
- return *new Coefficients (c1, c1 * 2, c1,\r
- 1, c1 * 2 * (1 - nSquared),\r
- c1 * (1 - invQ * n + nSquared));\r
+ return new Coefficients (c1, c1 * 2, c1,\r
+ 1, c1 * 2 * (1 - nSquared),\r
+ c1 * (1 - invQ * n + nSquared));\r
}\r
\r
template <typename NumericType>\r
auto invQ = 1 / Q;\r
auto c1 = 1 / (1 + invQ * n + nSquared);\r
\r
- return *new Coefficients (c1, c1 * -2, c1,\r
- 1, c1 * 2 * (nSquared - 1),\r
- c1 * (1 - invQ * n + nSquared));\r
+ return new Coefficients (c1, c1 * -2, c1,\r
+ 1, c1 * 2 * (nSquared - 1),\r
+ c1 * (1 - invQ * n + nSquared));\r
}\r
\r
template <typename NumericType>\r
auto invQ = 1 / Q;\r
auto c1 = 1 / (1 + invQ * n + nSquared);\r
\r
- return *new Coefficients (c1 * n * invQ, 0,\r
- -c1 * n * invQ, 1,\r
- c1 * 2 * (1 - nSquared),\r
- c1 * (1 - invQ * n + nSquared));\r
+ return new Coefficients (c1 * n * invQ, 0,\r
+ -c1 * n * invQ, 1,\r
+ c1 * 2 * (1 - nSquared),\r
+ c1 * (1 - invQ * n + nSquared));\r
}\r
\r
template <typename NumericType>\r
auto b0 = c1 * (1 + nSquared);\r
auto b1 = 2 * c1 * (1 - nSquared);\r
\r
- return *new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared));\r
+ return new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared));\r
}\r
\r
template <typename NumericType>\r
auto b0 = c1 * (1 - n * invQ + nSquared);\r
auto b1 = c1 * 2 * (1 - nSquared);\r
\r
- return *new Coefficients (b0, b1, 1, 1, b1, b0);\r
+ return new Coefficients (b0, b1, 1, 1, b1, b0);\r
}\r
\r
template <typename NumericType>\r
auto beta = std::sin (omega) * std::sqrt (A) / Q;\r
auto aminus1TimesCoso = aminus1 * coso;\r
\r
- return *new Coefficients (A * (aplus1 - aminus1TimesCoso + beta),\r
- A * 2 * (aminus1 - aplus1 * coso),\r
- A * (aplus1 - aminus1TimesCoso - beta),\r
- aplus1 + aminus1TimesCoso + beta,\r
- -2 * (aminus1 + aplus1 * coso),\r
- aplus1 + aminus1TimesCoso - beta);\r
+ return new Coefficients (A * (aplus1 - aminus1TimesCoso + beta),\r
+ A * 2 * (aminus1 - aplus1 * coso),\r
+ A * (aplus1 - aminus1TimesCoso - beta),\r
+ aplus1 + aminus1TimesCoso + beta,\r
+ -2 * (aminus1 + aplus1 * coso),\r
+ aplus1 + aminus1TimesCoso - beta);\r
}\r
\r
template <typename NumericType>\r
auto beta = std::sin (omega) * std::sqrt (A) / Q;\r
auto aminus1TimesCoso = aminus1 * coso;\r
\r
- return *new Coefficients (A * (aplus1 + aminus1TimesCoso + beta),\r
- A * -2 * (aminus1 + aplus1 * coso),\r
- A * (aplus1 + aminus1TimesCoso - beta),\r
- aplus1 - aminus1TimesCoso + beta,\r
- 2 * (aminus1 - aplus1 * coso),\r
- aplus1 - aminus1TimesCoso - beta);\r
+ return new Coefficients (A * (aplus1 + aminus1TimesCoso + beta),\r
+ A * -2 * (aminus1 + aplus1 * coso),\r
+ A * (aplus1 + aminus1TimesCoso - beta),\r
+ aplus1 - aminus1TimesCoso + beta,\r
+ 2 * (aminus1 - aplus1 * coso),\r
+ aplus1 - aminus1TimesCoso - beta);\r
}\r
\r
template <typename NumericType>\r
auto alphaTimesA = alpha * A;\r
auto alphaOverA = alpha / A;\r
\r
- return *new Coefficients (1 + alphaTimesA, c2,\r
- 1 - alphaTimesA,\r
- 1 + alphaOverA, c2,\r
- 1 - alphaOverA);\r
+ return new Coefficients (1 + alphaTimesA, c2,\r
+ 1 - alphaTimesA,\r
+ 1 + alphaOverA, c2,\r
+ 1 - alphaOverA);\r
}\r
\r
template <typename NumericType>\r
*/\r
using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
\r
- /** A typedef for a ref-counted pointer to the coefficients object */\r
- using CoefficientsPtr = typename Coefficients<NumericType>::Ptr;\r
-\r
//==============================================================================\r
/** Creates a filter.\r
\r
Filter();\r
\r
/** Creates a filter with a given set of coefficients. */\r
- Filter (CoefficientsPtr coefficientsToUse);\r
+ Filter (Coefficients<NumericType>* coefficientsToUse);\r
\r
Filter (const Filter&) = default;\r
Filter (Filter&&) = default;\r
Filter& operator= (Filter&&) = default;\r
\r
//==============================================================================\r
- /** The coefficients of the IIR filter. It's up to the caller to ensure that\r
+ /** The coefficients of the IIR filter. It's up to the called to ensure that\r
these coefficients are modified in a thread-safe way.\r
\r
If you change the order of the coefficients then you must call reset after\r
modifying them.\r
*/\r
- CoefficientsPtr coefficients;\r
+ typename Coefficients<NumericType>::Ptr coefficients;\r
\r
//==============================================================================\r
/** Resets the filter's processing pipeline, ready to start a new stream of data.\r
}\r
\r
template <typename SampleType>\r
-Filter<SampleType>::Filter (CoefficientsPtr c) : coefficients (static_cast<CoefficientsPtr&&> (c))\r
+Filter<SampleType>::Filter (Coefficients<typename Filter<SampleType>::NumericType>* c)\r
+ : coefficients (c)\r
{\r
reset();\r
}\r
template <typename SampleType>\r
void Filter<SampleType>::prepare (const ProcessSpec&) noexcept { reset(); }\r
\r
+\r
template <typename SampleType>\r
template <typename ProcessContext, bool bypassed>\r
void Filter<SampleType>::processInternal (const ProcessContext& context) noexcept\r
auto* dst = outputBlock.getChannelPointer (0);\r
auto* coeffs = coefficients->getRawCoefficients();\r
\r
+ // we need to copy this template parameter into a constexpr\r
+ // otherwise MSVC will moan that the tenary expressions below\r
+ // are constant conditional expressions\r
+ constexpr bool isBypassed = bypassed;\r
+\r
switch (order)\r
{\r
case 1:\r
\r
for (size_t i = 0; i < numSamples; ++i)\r
{\r
- auto input = src[i];\r
- auto output = input * b0 + lv1;\r
+ auto in = src[i];\r
+ auto out = in * b0 + lv1;\r
\r
- dst[i] = bypassed ? input : output;\r
+ dst[i] = isBypassed ? in : out;\r
\r
- lv1 = (input * b1) - (output * a1);\r
+ lv1 = (in * b1) - (out * a1);\r
}\r
\r
util::snapToZero (lv1); state[0] = lv1;\r
\r
for (size_t i = 0; i < numSamples; ++i)\r
{\r
- auto input = src[i];\r
- auto output = (input * b0) + lv1;\r
- dst[i] = bypassed ? input : output;\r
+ auto in = src[i];\r
+ auto out = (in * b0) + lv1;\r
+ dst[i] = isBypassed ? in : out;\r
\r
- lv1 = (input * b1) - (output* a1) + lv2;\r
- lv2 = (input * b2) - (output* a2);\r
+ lv1 = (in * b1) - (out * a1) + lv2;\r
+ lv2 = (in * b2) - (out * a2);\r
}\r
\r
util::snapToZero (lv1); state[0] = lv1;\r
\r
for (size_t i = 0; i < numSamples; ++i)\r
{\r
- auto input = src[i];\r
- auto output = (input * b0) + lv1;\r
- dst[i] = bypassed ? input : output;\r
+ auto in = src[i];\r
+ auto out = (in * b0) + lv1;\r
+ dst[i] = isBypassed ? in : out;\r
\r
- lv1 = (input * b1) - (output* a1) + lv2;\r
- lv2 = (input * b2) - (output* a2) + lv3;\r
- lv3 = (input * b3) - (output* a3);\r
+ lv1 = (in * b1) - (out * a1) + lv2;\r
+ lv2 = (in * b2) - (out * a2) + lv3;\r
+ lv3 = (in * b3) - (out * a3);\r
}\r
\r
util::snapToZero (lv1); state[0] = lv1;\r
{\r
for (size_t i = 0; i < numSamples; ++i)\r
{\r
- auto input = src[i];\r
- auto output= (input * coeffs[0]) + state[0];\r
- dst[i] = bypassed ? input : output;\r
+ auto in = src[i];\r
+ auto out = (in * coeffs[0]) + state[0];\r
+ dst[i] = isBypassed ? in : out;\r
\r
for (size_t j = 0; j < order - 1; ++j)\r
- state[j] = (input * coeffs[j + 1]) - (output* coeffs[order + j + 1]) + state[j + 1];\r
+ state[j] = (in * coeffs[j + 1]) - (out * coeffs[order + j + 1]) + state[j + 1];\r
\r
- state[order - 1] = (input * coeffs[order]) - (output* coeffs[order * 2]);\r
+ state[order - 1] = (in * coeffs[order]) - (out * coeffs[order * 2]);\r
}\r
\r
snapToZero();\r
check();\r
auto* c = coefficients->getRawCoefficients();\r
\r
- auto output= (c[0] * sample) + state[0];\r
+ auto out = (c[0] * sample) + state[0];\r
\r
for (size_t j = 0; j < order - 1; ++j)\r
- state[j] = (c[j + 1] * sample) - (c[order + j + 1] * output) + state[j + 1];\r
+ state[j] = (c[j + 1] * sample) - (c[order + j + 1] * out) + state[j + 1];\r
\r
- state[order - 1] = (c[order] * sample) - (c[order * 2] * output);\r
+ state[order - 1] = (c[order] * sample) - (c[order * 2] * out);\r
\r
- return output;\r
+ return out;\r
}\r
\r
template <typename SampleType>\r
namespace dsp\r
{\r
\r
-/** Abstract class for the provided oversampling stages used internally in\r
+/** Abstract class for the provided oversampling engines used internally in\r
the Oversampling class.\r
*/\r
template <typename SampleType>\r
-struct Oversampling<SampleType>::OversamplingStage\r
+class OversamplingEngine\r
{\r
- OversamplingStage (size_t numChans, size_t newFactor) : numChannels (numChans), factor (newFactor) {}\r
- virtual ~OversamplingStage() {}\r
+public:\r
+ //===============================================================================\r
+ OversamplingEngine (size_t newNumChannels, size_t newFactor)\r
+ {\r
+ numChannels = newNumChannels;\r
+ factor = newFactor;\r
+ }\r
+\r
+ virtual ~OversamplingEngine() {}\r
\r
//===============================================================================\r
virtual SampleType getLatencyInSamples() = 0;\r
+ size_t getFactor() { return factor; }\r
\r
virtual void initProcessing (size_t maximumNumberOfSamplesBeforeOversampling)\r
{\r
- buffer.setSize (static_cast<int> (numChannels),\r
- static_cast<int> (maximumNumberOfSamplesBeforeOversampling * factor),\r
- false, false, true);\r
+ buffer.setSize (static_cast<int> (numChannels), static_cast<int> (maximumNumberOfSamplesBeforeOversampling * factor), false, false, true);\r
}\r
\r
virtual void reset()\r
return dsp::AudioBlock<SampleType> (buffer).getSubBlock (0, numSamples);\r
}\r
\r
- virtual void processSamplesUp (dsp::AudioBlock<SampleType>&) = 0;\r
- virtual void processSamplesDown (dsp::AudioBlock<SampleType>&) = 0;\r
+ virtual void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) = 0;\r
+ virtual void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) = 0;\r
\r
+protected:\r
+ //===============================================================================\r
AudioBuffer<SampleType> buffer;\r
- size_t numChannels, factor;\r
+ size_t factor;\r
+ size_t numChannels;\r
};\r
\r
\r
//===============================================================================\r
-/** Dummy oversampling stage class which simply copies and pastes the input\r
+/** Dummy oversampling engine class which simply copies and pastes the input\r
signal, which could be equivalent to a "one time" oversampling processing.\r
*/\r
template <typename SampleType>\r
-struct OversamplingDummy : public Oversampling<SampleType>::OversamplingStage\r
+class OversamplingDummy : public OversamplingEngine<SampleType>\r
{\r
- using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
- OversamplingDummy (size_t numChans) : ParentType (numChans, 1) {}\r
+public:\r
+ //===============================================================================\r
+ OversamplingDummy (size_t numChannels) : OversamplingEngine<SampleType> (numChannels, 1) {}\r
+ ~OversamplingDummy() {}\r
\r
//===============================================================================\r
SampleType getLatencyInSamples() override\r
{\r
- return 0;\r
+ return 0.f;\r
}\r
\r
- void processSamplesUp (dsp::AudioBlock<SampleType>& inputBlock) override\r
+ void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
{\r
- jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
- for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
- ParentType::buffer.copyFrom (static_cast<int> (channel), 0,\r
+ for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
+ OversamplingEngine<SampleType>::buffer.copyFrom (static_cast<int> (channel), 0,\r
inputBlock.getChannelPointer (channel), static_cast<int> (inputBlock.getNumSamples()));\r
}\r
\r
- void processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) override\r
+ void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
{\r
- jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
- outputBlock.copy (ParentType::getProcessedSamples (outputBlock.getNumSamples()));\r
+ outputBlock.copy (OversamplingEngine<SampleType>::getProcessedSamples (outputBlock.getNumSamples()));\r
}\r
\r
+private:\r
+ //===============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OversamplingDummy)\r
};\r
\r
//===============================================================================\r
-/** Oversampling stage class performing 2 times oversampling using the Filter\r
+/** Oversampling engine class performing 2 times oversampling using the Filter\r
Design FIR Equiripple method. The resulting filter is linear phase,\r
symmetric, and has every two samples but the middle one equal to zero,\r
leading to specific processing optimizations.\r
*/\r
template <typename SampleType>\r
-struct Oversampling2TimesEquirippleFIR : public Oversampling<SampleType>::OversamplingStage\r
+class Oversampling2TimesEquirippleFIR : public OversamplingEngine<SampleType>\r
{\r
- using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
- Oversampling2TimesEquirippleFIR (size_t numChans,\r
+public:\r
+ //===============================================================================\r
+ Oversampling2TimesEquirippleFIR (size_t numChannels,\r
SampleType normalizedTransitionWidthUp,\r
SampleType stopbandAttenuationdBUp,\r
SampleType normalizedTransitionWidthDown,\r
- SampleType stopbandAttenuationdBDown)\r
- : ParentType (numChans, 2)\r
+ SampleType stopbandAttenuationdBDown) : OversamplingEngine<SampleType> (numChannels, 2)\r
{\r
- coefficientsUp = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthUp, stopbandAttenuationdBUp);\r
+ coefficientsUp = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthUp, stopbandAttenuationdBUp);\r
coefficientsDown = *dsp::FilterDesign<SampleType>::designFIRLowpassHalfBandEquirippleMethod (normalizedTransitionWidthDown, stopbandAttenuationdBDown);\r
\r
auto N = coefficientsUp.getFilterOrder() + 1;\r
- stateUp.setSize (static_cast<int> (this->numChannels), static_cast<int> (N));\r
+ stateUp.setSize (static_cast<int> (numChannels), static_cast<int> (N));\r
\r
N = coefficientsDown.getFilterOrder() + 1;\r
auto Ndiv2 = N / 2;\r
auto Ndiv4 = Ndiv2 / 2;\r
\r
- stateDown.setSize (static_cast<int> (this->numChannels), static_cast<int> (N));\r
- stateDown2.setSize (static_cast<int> (this->numChannels), static_cast<int> (Ndiv4 + 1));\r
+ stateDown.setSize (static_cast<int> (numChannels), static_cast<int> (N));\r
+ stateDown2.setSize (static_cast<int> (numChannels), static_cast<int> (Ndiv4 + 1));\r
\r
- position.resize (static_cast<int> (this->numChannels));\r
+ position.resize (static_cast<int> (numChannels));\r
}\r
\r
+ ~Oversampling2TimesEquirippleFIR() {}\r
+\r
//===============================================================================\r
SampleType getLatencyInSamples() override\r
{\r
\r
void reset() override\r
{\r
- ParentType::reset();\r
+ OversamplingEngine<SampleType>::reset();\r
\r
stateUp.clear();\r
stateDown.clear();\r
position.fill (0);\r
}\r
\r
- void processSamplesUp (dsp::AudioBlock<SampleType>& inputBlock) override\r
+ void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
{\r
- jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
// Initialization\r
auto fir = coefficientsUp.getRawCoefficients();\r
auto numSamples = inputBlock.getNumSamples();\r
\r
// Processing\r
- for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
+ for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
{\r
- auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+ auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
auto buf = stateUp.getWritePointer (static_cast<int> (channel));\r
auto samples = inputBlock.getChannelPointer (channel);\r
\r
- for (size_t i = 0; i < numSamples; ++i)\r
+ for (size_t i = 0; i < numSamples; i++)\r
{\r
// Input\r
buf[N - 1] = 2 * samples[i];\r
\r
// Convolution\r
auto out = static_cast<SampleType> (0.0);\r
-\r
for (size_t k = 0; k < Ndiv2; k += 2)\r
out += (buf[k] + buf[N - k - 1]) * fir[k];\r
\r
}\r
}\r
\r
- void processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) override\r
+ void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
{\r
- jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
// Initialization\r
auto fir = coefficientsDown.getRawCoefficients();\r
auto numSamples = outputBlock.getNumSamples();\r
\r
// Processing\r
- for (size_t channel = 0; channel < outputBlock.getNumChannels(); ++channel)\r
+ for (size_t channel = 0; channel < outputBlock.getNumChannels(); channel++)\r
{\r
- auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+ auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
auto buf = stateDown.getWritePointer (static_cast<int> (channel));\r
auto buf2 = stateDown2.getWritePointer (static_cast<int> (channel));\r
auto samples = outputBlock.getChannelPointer (channel);\r
auto pos = position.getUnchecked (static_cast<int> (channel));\r
\r
- for (size_t i = 0; i < numSamples; ++i)\r
+ for (size_t i = 0; i < numSamples; i++)\r
{\r
// Input\r
buf[N - 1] = bufferSamples[i << 1];\r
\r
// Convolution\r
auto out = static_cast<SampleType> (0.0);\r
-\r
for (size_t k = 0; k < Ndiv2; k += 2)\r
out += (buf[k] + buf[N - k - 1]) * fir[k];\r
\r
samples[i] = out;\r
\r
// Shift data\r
- for (size_t k = 0; k < N - 2; ++k)\r
+ for (size_t k = 0; k < N - 2; k++)\r
buf[k] = buf[k + 2];\r
\r
// Circular buffer\r
\r
\r
//===============================================================================\r
-/** Oversampling stage class performing 2 times oversampling using the Filter\r
+/** Oversampling engine class performing 2 times oversampling using the Filter\r
Design IIR Polyphase Allpass Cascaded method. The resulting filter is minimum\r
phase, and provided with a method to get the exact resulting latency.\r
*/\r
template <typename SampleType>\r
-struct Oversampling2TimesPolyphaseIIR : public Oversampling<SampleType>::OversamplingStage\r
+class Oversampling2TimesPolyphaseIIR : public OversamplingEngine<SampleType>\r
{\r
- using ParentType = typename Oversampling<SampleType>::OversamplingStage;\r
-\r
- Oversampling2TimesPolyphaseIIR (size_t numChans,\r
+public:\r
+ //===============================================================================\r
+ Oversampling2TimesPolyphaseIIR (size_t numChannels,\r
SampleType normalizedTransitionWidthUp,\r
SampleType stopbandAttenuationdBUp,\r
SampleType normalizedTransitionWidthDown,\r
- SampleType stopbandAttenuationdBDown)\r
- : ParentType (numChans, 2)\r
+ SampleType stopbandAttenuationdBDown) : OversamplingEngine<SampleType> (numChannels, 2)\r
{\r
auto structureUp = dsp::FilterDesign<SampleType>::designIIRLowpassHalfBandPolyphaseAllpassMethod (normalizedTransitionWidthUp, stopbandAttenuationdBUp);\r
- auto coeffsUp = getCoefficients (structureUp);\r
+ dsp::IIR::Coefficients<SampleType> coeffsUp = getCoefficients (structureUp);\r
latency = static_cast<SampleType> (-(coeffsUp.getPhaseForFrequency (0.0001, 1.0)) / (0.0001 * MathConstants<double>::twoPi));\r
\r
auto structureDown = dsp::FilterDesign<SampleType>::designIIRLowpassHalfBandPolyphaseAllpassMethod (normalizedTransitionWidthDown, stopbandAttenuationdBDown);\r
- auto coeffsDown = getCoefficients (structureDown);\r
+ dsp::IIR::Coefficients<SampleType> coeffsDown = getCoefficients (structureDown);\r
latency += static_cast<SampleType> (-(coeffsDown.getPhaseForFrequency (0.0001, 1.0)) / (0.0001 * MathConstants<double>::twoPi));\r
\r
- for (auto i = 0; i < structureUp.directPath.size(); ++i)\r
- coefficientsUp.add (structureUp.directPath.getObjectPointer (i)->coefficients[0]);\r
+ for (auto i = 0; i < structureUp.directPath.size(); i++)\r
+ coefficientsUp.add (structureUp.directPath[i].coefficients[0]);\r
\r
- for (auto i = 1; i < structureUp.delayedPath.size(); ++i)\r
- coefficientsUp.add (structureUp.delayedPath.getObjectPointer (i)->coefficients[0]);\r
+ for (auto i = 1; i < structureUp.delayedPath.size(); i++)\r
+ coefficientsUp.add (structureUp.delayedPath[i].coefficients[0]);\r
\r
- for (auto i = 0; i < structureDown.directPath.size(); ++i)\r
- coefficientsDown.add (structureDown.directPath.getObjectPointer (i)->coefficients[0]);\r
+ for (auto i = 0; i < structureDown.directPath.size(); i++)\r
+ coefficientsDown.add (structureDown.directPath[i].coefficients[0]);\r
\r
- for (auto i = 1; i < structureDown.delayedPath.size(); ++i)\r
- coefficientsDown.add (structureDown.delayedPath.getObjectPointer (i)->coefficients[0]);\r
+ for (auto i = 1; i < structureDown.delayedPath.size(); i++)\r
+ coefficientsDown.add (structureDown.delayedPath[i].coefficients[0]);\r
\r
- v1Up.setSize (static_cast<int> (this->numChannels), coefficientsUp.size());\r
- v1Down.setSize (static_cast<int> (this->numChannels), coefficientsDown.size());\r
- delayDown.resize (static_cast<int> (this->numChannels));\r
+ v1Up.setSize (static_cast<int> (numChannels), coefficientsUp.size());\r
+ v1Down.setSize (static_cast<int> (numChannels), coefficientsDown.size());\r
+ delayDown.resize (static_cast<int> (numChannels));\r
}\r
\r
+ ~Oversampling2TimesPolyphaseIIR() {}\r
+\r
//===============================================================================\r
SampleType getLatencyInSamples() override\r
{\r
\r
void reset() override\r
{\r
- ParentType::reset();\r
+ OversamplingEngine<SampleType>::reset();\r
+\r
v1Up.clear();\r
v1Down.clear();\r
delayDown.fill (0);\r
}\r
\r
- void processSamplesUp (dsp::AudioBlock<SampleType>& inputBlock) override\r
+ void processSamplesUp (dsp::AudioBlock<SampleType> &inputBlock) override\r
{\r
- jassert (inputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (inputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (inputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (inputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
// Initialization\r
auto coeffs = coefficientsUp.getRawDataPointer();\r
auto numSamples = inputBlock.getNumSamples();\r
\r
// Processing\r
- for (size_t channel = 0; channel < inputBlock.getNumChannels(); ++channel)\r
+ for (size_t channel = 0; channel < inputBlock.getNumChannels(); channel++)\r
{\r
- auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+ auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
auto lv1 = v1Up.getWritePointer (static_cast<int> (channel));\r
auto samples = inputBlock.getChannelPointer (channel);\r
\r
- for (size_t i = 0; i < numSamples; ++i)\r
+ for (size_t i = 0; i < numSamples; i++)\r
{\r
// Direct path cascaded allpass filters\r
auto input = samples[i];\r
-\r
- for (auto n = 0; n < directStages; ++n)\r
+ for (auto n = 0; n < directStages; n++)\r
{\r
auto alpha = coeffs[n];\r
auto output = alpha * input + lv1[n];\r
\r
// Delayed path cascaded allpass filters\r
input = samples[i];\r
-\r
- for (auto n = directStages; n < numStages; ++n)\r
+ for (auto n = directStages; n < numStages; n++)\r
{\r
auto alpha = coeffs[n];\r
auto output = alpha * input + lv1[n];\r
snapToZero (true);\r
}\r
\r
- void processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) override\r
+ void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) override\r
{\r
- jassert (outputBlock.getNumChannels() <= static_cast<size_t> (ParentType::buffer.getNumChannels()));\r
- jassert (outputBlock.getNumSamples() * ParentType::factor <= static_cast<size_t> (ParentType::buffer.getNumSamples()));\r
+ jassert (outputBlock.getNumChannels() <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumChannels()));\r
+ jassert (outputBlock.getNumSamples() * OversamplingEngine<SampleType>::factor <= static_cast<size_t> (OversamplingEngine<SampleType>::buffer.getNumSamples()));\r
\r
// Initialization\r
auto coeffs = coefficientsDown.getRawDataPointer();\r
auto numSamples = outputBlock.getNumSamples();\r
\r
// Processing\r
- for (size_t channel = 0; channel < outputBlock.getNumChannels(); ++channel)\r
+ for (size_t channel = 0; channel < outputBlock.getNumChannels(); channel++)\r
{\r
- auto bufferSamples = ParentType::buffer.getWritePointer (static_cast<int> (channel));\r
+ auto bufferSamples = OversamplingEngine<SampleType>::buffer.getWritePointer (static_cast<int> (channel));\r
auto lv1 = v1Down.getWritePointer (static_cast<int> (channel));\r
auto samples = outputBlock.getChannelPointer (channel);\r
auto delay = delayDown.getUnchecked (static_cast<int> (channel));\r
\r
- for (size_t i = 0; i < numSamples; ++i)\r
+ for (size_t i = 0; i < numSamples; i++)\r
{\r
// Direct path cascaded allpass filters\r
auto input = bufferSamples[i << 1];\r
-\r
- for (auto n = 0; n < directStages; ++n)\r
+ for (auto n = 0; n < directStages; n++)\r
{\r
auto alpha = coeffs[n];\r
auto output = alpha * input + lv1[n];\r
lv1[n] = input - alpha * output;\r
input = output;\r
}\r
-\r
auto directOut = input;\r
\r
// Delayed path cascaded allpass filters\r
input = bufferSamples[(i << 1) + 1];\r
-\r
- for (auto n = directStages; n < numStages; ++n)\r
+ for (auto n = directStages; n < numStages; n++)\r
{\r
auto alpha = coeffs[n];\r
auto output = alpha * input + lv1[n];\r
{\r
if (snapUpProcessing)\r
{\r
- for (auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)\r
+ for (auto channel = 0; channel < OversamplingEngine<SampleType>::buffer.getNumChannels(); channel++)\r
{\r
auto lv1 = v1Up.getWritePointer (channel);\r
auto numStages = coefficientsUp.size();\r
\r
- for (auto n = 0; n < numStages; ++n)\r
+ for (auto n = 0; n < numStages; n++)\r
util::snapToZero (lv1[n]);\r
}\r
}\r
else\r
{\r
- for (auto channel = 0; channel < ParentType::buffer.getNumChannels(); ++channel)\r
+ for (auto channel = 0; channel < OversamplingEngine<SampleType>::buffer.getNumChannels(); channel++)\r
{\r
auto lv1 = v1Down.getWritePointer (channel);\r
auto numStages = coefficientsDown.size();\r
\r
- for (auto n = 0; n < numStages; ++n)\r
+ for (auto n = 0; n < numStages; n++)\r
util::snapToZero (lv1[n]);\r
}\r
}\r
/** This function calculates the equivalent high order IIR filter of a given\r
polyphase cascaded allpass filters structure.\r
*/\r
- dsp::IIR::Coefficients<SampleType> getCoefficients (typename dsp::FilterDesign<SampleType>::IIRPolyphaseAllpassStructure& structure) const\r
+ const dsp::IIR::Coefficients<SampleType> getCoefficients (typename dsp::FilterDesign<SampleType>::IIRPolyphaseAllpassStructure& structure) const\r
{\r
- constexpr auto one = static_cast<SampleType> (1.0);\r
+ dsp::Polynomial<SampleType> numerator1 ({ static_cast<SampleType> (1.0) });\r
+ dsp::Polynomial<SampleType> denominator1 ({ static_cast<SampleType> (1.0) });\r
+ dsp::Polynomial<SampleType> numerator2 ({ static_cast<SampleType> (1.0) });\r
+ dsp::Polynomial<SampleType> denominator2 ({ static_cast<SampleType> (1.0) });\r
\r
- dsp::Polynomial<SampleType> numerator1 ({ one }), denominator1 ({ one }),\r
- numerator2 ({ one }), denominator2 ({ one });\r
+ dsp::Polynomial<SampleType> temp;\r
\r
- for (auto* i : structure.directPath)\r
+ for (auto n = 0; n < structure.directPath.size(); n++)\r
{\r
- auto coeffs = i->getRawCoefficients();\r
+ auto* coeffs = structure.directPath.getReference (n).getRawCoefficients();\r
\r
- if (i->getFilterOrder() == 1)\r
+ if (structure.directPath[n].getFilterOrder() == 1)\r
{\r
- numerator1 = numerator1.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] }));\r
- denominator1 = denominator1.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[2] }));\r
+ temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] });\r
+ numerator1 = numerator1.getProductWith (temp);\r
+\r
+ temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[2] });\r
+ denominator1 = denominator1.getProductWith (temp);\r
}\r
else\r
{\r
- numerator1 = numerator1.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] }));\r
- denominator1 = denominator1.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[3], coeffs[4] }));\r
+ temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] });\r
+ numerator1 = numerator1.getProductWith (temp);\r
+\r
+ temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[3], coeffs[4] });\r
+ denominator1 = denominator1.getProductWith (temp);\r
}\r
}\r
\r
- for (auto* i : structure.delayedPath)\r
+ for (auto n = 0; n < structure.delayedPath.size(); n++)\r
{\r
- auto coeffs = i->getRawCoefficients();\r
+ auto* coeffs = structure.delayedPath.getReference (n).getRawCoefficients();\r
\r
- if (i->getFilterOrder() == 1)\r
+ if (structure.delayedPath[n].getFilterOrder() == 1)\r
{\r
- numerator2 = numerator2.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] }));\r
- denominator2 = denominator2.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[2] }));\r
+ temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1] });\r
+ numerator2 = numerator2.getProductWith (temp);\r
+\r
+ temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[2] });\r
+ denominator2 = denominator2.getProductWith (temp);\r
}\r
else\r
{\r
- numerator2 = numerator2.getProductWith (dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] }));\r
- denominator2 = denominator2.getProductWith (dsp::Polynomial<SampleType> ({ one, coeffs[3], coeffs[4] }));\r
+ temp = dsp::Polynomial<SampleType> ({ coeffs[0], coeffs[1], coeffs[2] });\r
+ numerator2 = numerator2.getProductWith (temp);\r
+\r
+ temp = dsp::Polynomial<SampleType> ({ static_cast<SampleType> (1.0), coeffs[3], coeffs[4] });\r
+ denominator2 = denominator2.getProductWith (temp);\r
}\r
}\r
\r
- auto numeratorf1 = numerator1.getProductWith (denominator2);\r
- auto numeratorf2 = numerator2.getProductWith (denominator1);\r
- auto numerator = numeratorf1.getSumWith (numeratorf2);\r
- auto denominator = denominator1.getProductWith (denominator2);\r
+ dsp::Polynomial<SampleType> numeratorf1 = numerator1.getProductWith (denominator2);\r
+ dsp::Polynomial<SampleType> numeratorf2 = numerator2.getProductWith (denominator1);\r
+ dsp::Polynomial<SampleType> numerator = numeratorf1.getSumWith (numeratorf2);\r
+ dsp::Polynomial<SampleType> denominator = denominator1.getProductWith (denominator2);\r
\r
dsp::IIR::Coefficients<SampleType> coeffs;\r
\r
coeffs.coefficients.clear();\r
- auto inversion = one / denominator[0];\r
+ auto inversion = static_cast<SampleType> (1.0) / denominator[0];\r
\r
- for (auto i = 0; i <= numerator.getOrder(); ++i)\r
+ for (auto i = 0; i <= numerator.getOrder(); i++)\r
coeffs.coefficients.add (numerator[i] * inversion);\r
\r
- for (auto i = 1; i <= denominator.getOrder(); ++i)\r
+ for (auto i = 1; i <= denominator.getOrder(); i++)\r
coeffs.coefficients.add (denominator[i] * inversion);\r
\r
return coeffs;\r
\r
//===============================================================================\r
template <typename SampleType>\r
-Oversampling<SampleType>::Oversampling (size_t newNumChannels)\r
- : numChannels (newNumChannels)\r
+Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor, FilterType newType, bool newMaxQuality)\r
{\r
- jassert (numChannels > 0);\r
+ jassert (newFactor >= 0 && newFactor <= 4 && newNumChannels > 0);\r
\r
- addDummyOversamplingStage();\r
-}\r
-\r
-template <typename SampleType>\r
-Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor,\r
- FilterType newType, bool isMaximumQuality)\r
- : numChannels (newNumChannels)\r
-{\r
- jassert (isPositiveAndBelow (newFactor, 5) && numChannels > 0);\r
+ factorOversampling = static_cast<size_t> (1) << newFactor;\r
+ isMaximumQuality = newMaxQuality;\r
+ type = newType;\r
+ numChannels = newNumChannels;\r
\r
if (newFactor == 0)\r
{\r
- addDummyOversamplingStage();\r
+ numStages = 1;\r
+ engines.add (new OversamplingDummy<SampleType> (numChannels));\r
}\r
- else if (newType == FilterType::filterHalfBandPolyphaseIIR)\r
+ else if (type == FilterType::filterHalfBandPolyphaseIIR)\r
{\r
- for (size_t n = 0; n < newFactor; ++n)\r
+ numStages = newFactor;\r
+\r
+ for (size_t n = 0; n < numStages; n++)\r
{\r
- auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.0f);\r
- auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.0f);\r
+ auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.f);\r
+ auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.f);\r
\r
- auto gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);\r
- auto gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);\r
- auto gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);\r
- auto gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);\r
+ auto gaindBStartUp = (isMaximumQuality ? -75.f : -65.f);\r
+ auto gaindBStartDown = (isMaximumQuality ? -70.f : -60.f);\r
+ auto gaindBFactorUp = (isMaximumQuality ? 10.f : 8.f);\r
+ auto gaindBFactorDown = (isMaximumQuality ? 10.f : 8.f);\r
\r
- addOversamplingStage (FilterType::filterHalfBandPolyphaseIIR,\r
- twUp, gaindBStartUp + gaindBFactorUp * n,\r
- twDown, gaindBStartDown + gaindBFactorDown * n);\r
+ engines.add (new Oversampling2TimesPolyphaseIIR<SampleType> (numChannels,\r
+ twUp, gaindBStartUp + gaindBFactorUp * n,\r
+ twDown, gaindBStartDown + gaindBFactorDown * n));\r
}\r
}\r
- else if (newType == FilterType::filterHalfBandFIREquiripple)\r
+ else if (type == FilterType::filterHalfBandFIREquiripple)\r
{\r
- for (size_t n = 0; n < newFactor; ++n)\r
+ numStages = newFactor;\r
+\r
+ for (size_t n = 0; n < numStages; n++)\r
{\r
- auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.0f);\r
- auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.0f);\r
+ auto twUp = (isMaximumQuality ? 0.10f : 0.12f) * (n == 0 ? 0.5f : 1.f);\r
+ auto twDown = (isMaximumQuality ? 0.12f : 0.15f) * (n == 0 ? 0.5f : 1.f);\r
\r
- auto gaindBStartUp = (isMaximumQuality ? -90.0f : -70.0f);\r
- auto gaindBStartDown = (isMaximumQuality ? -75.0f : -60.0f);\r
- auto gaindBFactorUp = (isMaximumQuality ? 10.0f : 8.0f);\r
- auto gaindBFactorDown = (isMaximumQuality ? 10.0f : 8.0f);\r
+ auto gaindBStartUp = (isMaximumQuality ? -90.f : -70.f);\r
+ auto gaindBStartDown = (isMaximumQuality ? -70.f : -60.f);\r
+ auto gaindBFactorUp = (isMaximumQuality ? 10.f : 8.f);\r
+ auto gaindBFactorDown = (isMaximumQuality ? 10.f : 8.f);\r
\r
- addOversamplingStage (FilterType::filterHalfBandFIREquiripple,\r
- twUp, gaindBStartUp + gaindBFactorUp * n,\r
- twDown, gaindBStartDown + gaindBFactorDown * n);\r
+ engines.add (new Oversampling2TimesEquirippleFIR<SampleType> (numChannels,\r
+ twUp, gaindBStartUp + gaindBFactorUp * n,\r
+ twDown, gaindBStartDown + gaindBFactorDown * n));\r
}\r
}\r
}\r
template <typename SampleType>\r
Oversampling<SampleType>::~Oversampling()\r
{\r
- stages.clear();\r
-}\r
-\r
-//===============================================================================\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::addDummyOversamplingStage()\r
-{\r
- stages.add (new OversamplingDummy<SampleType> (numChannels));\r
-}\r
-\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::addOversamplingStage (FilterType type,\r
- float normalizedTransitionWidthUp,\r
- float stopbandAttenuationdBUp,\r
- float normalizedTransitionWidthDown,\r
- float stopbandAttenuationdBDown)\r
-{\r
- if (type == FilterType::filterHalfBandPolyphaseIIR)\r
- {\r
- stages.add (new Oversampling2TimesPolyphaseIIR<SampleType> (numChannels,\r
- normalizedTransitionWidthUp, stopbandAttenuationdBUp,\r
- normalizedTransitionWidthDown, stopbandAttenuationdBDown));\r
- }\r
- else\r
- {\r
- stages.add (new Oversampling2TimesEquirippleFIR<SampleType> (numChannels,\r
- normalizedTransitionWidthUp, stopbandAttenuationdBUp,\r
- normalizedTransitionWidthDown, stopbandAttenuationdBDown));\r
- }\r
-\r
- factorOversampling *= 2;\r
-}\r
-\r
-template <typename SampleType>\r
-void Oversampling<SampleType>::clearOversamplingStages()\r
-{\r
- stages.clear();\r
- factorOversampling = 1u;\r
+ engines.clear();\r
}\r
\r
//===============================================================================\r
auto latency = static_cast<SampleType> (0);\r
size_t order = 1;\r
\r
- for (auto* stage : stages)\r
+ for (size_t n = 0; n < numStages; n++)\r
{\r
- order *= stage->factor;\r
- latency += stage->getLatencyInSamples() / static_cast<SampleType> (order);\r
+ auto& engine = *engines[static_cast<int> (n)];\r
+\r
+ order *= engine.getFactor();\r
+ latency += engine.getLatencyInSamples() / static_cast<SampleType> (order);\r
}\r
\r
return latency;\r
template <typename SampleType>\r
void Oversampling<SampleType>::initProcessing (size_t maximumNumberOfSamplesBeforeOversampling)\r
{\r
- jassert (! stages.isEmpty());\r
+ jassert (! engines.isEmpty());\r
auto currentNumSamples = maximumNumberOfSamplesBeforeOversampling;\r
\r
- for (auto* stage : stages)\r
+ for (size_t n = 0; n < numStages; n++)\r
{\r
- stage->initProcessing (currentNumSamples);\r
- currentNumSamples *= stage->factor;\r
+ auto& engine = *engines[static_cast<int> (n)];\r
+\r
+ engine.initProcessing (currentNumSamples);\r
+ currentNumSamples *= engine.getFactor();\r
}\r
\r
isReady = true;\r
template <typename SampleType>\r
void Oversampling<SampleType>::reset() noexcept\r
{\r
- jassert (! stages.isEmpty());\r
+ jassert (! engines.isEmpty());\r
\r
if (isReady)\r
- for (auto* stage : stages)\r
- stage->reset();\r
+ for (auto n = 0; n < engines.size(); n++)\r
+ engines[n]->reset();\r
}\r
\r
template <typename SampleType>\r
-typename dsp::AudioBlock<SampleType> Oversampling<SampleType>::processSamplesUp (const dsp::AudioBlock<SampleType>& inputBlock) noexcept\r
+typename dsp::AudioBlock<SampleType> Oversampling<SampleType>::processSamplesUp (const dsp::AudioBlock<SampleType> &inputBlock) noexcept\r
{\r
- jassert (! stages.isEmpty());\r
+ jassert (! engines.isEmpty());\r
\r
if (! isReady)\r
- return {};\r
+ return dsp::AudioBlock<SampleType>();\r
\r
- auto audioBlock = inputBlock;\r
+ dsp::AudioBlock<SampleType> audioBlock = inputBlock;\r
\r
- for (auto* stage : stages)\r
+ for (size_t n = 0; n < numStages; n++)\r
{\r
- stage->processSamplesUp (audioBlock);\r
- audioBlock = stage->getProcessedSamples (audioBlock.getNumSamples() * stage->factor);\r
+ auto& engine = *engines[static_cast<int> (n)];\r
+ engine.processSamplesUp (audioBlock);\r
+ audioBlock = engine.getProcessedSamples (audioBlock.getNumSamples() * engine.getFactor());\r
}\r
\r
return audioBlock;\r
}\r
\r
template <typename SampleType>\r
-void Oversampling<SampleType>::processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) noexcept\r
+void Oversampling<SampleType>::processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) noexcept\r
{\r
- jassert (! stages.isEmpty());\r
+ jassert (! engines.isEmpty());\r
\r
if (! isReady)\r
return;\r
\r
auto currentNumSamples = outputBlock.getNumSamples();\r
\r
- for (int n = 0; n < stages.size() - 1; ++n)\r
- currentNumSamples *= stages.getUnchecked(n)->factor;\r
+ for (size_t n = 0; n < numStages - 1; n++)\r
+ currentNumSamples *= engines[static_cast<int> (n)]->getFactor();\r
\r
- for (int n = stages.size() - 1; n > 0; --n)\r
+ for (size_t n = numStages - 1; n > 0; n--)\r
{\r
- auto& stage = *stages.getUnchecked(n);\r
- auto audioBlock = stages.getUnchecked (n - 1)->getProcessedSamples (currentNumSamples);\r
- stage.processSamplesDown (audioBlock);\r
+ auto& engine = *engines[static_cast<int> (n)];\r
+\r
+ auto audioBlock = engines[static_cast<int> (n - 1)]->getProcessedSamples (currentNumSamples);\r
+ engine.processSamplesDown (audioBlock);\r
\r
- currentNumSamples /= stage.factor;\r
+ currentNumSamples /= engine.getFactor();\r
}\r
\r
- stages.getFirst()->processSamplesDown (outputBlock);\r
+ engines[static_cast<int> (0)]->processSamplesDown (outputBlock);\r
}\r
\r
template class Oversampling<float>;\r
namespace dsp\r
{\r
\r
+#ifndef DOXYGEN\r
+template <typename NumericType>\r
+class OversamplingEngine;\r
+#endif\r
+\r
//===============================================================================\r
/**\r
A processing class performing multi-channel oversampling.\r
Constructor of the oversampling class. All the processing parameters must be\r
provided at the creation of the oversampling object.\r
\r
- Note: You might want to create a class inheriting from Oversampling with a\r
+ Note : you might want to create a class heriting from Oversampling with a\r
different constructor if you need more control on what happens in the process.\r
\r
@param numChannels the number of channels to process with this object\r
the filters will be more efficient, but the CPU load will\r
increase as well\r
*/\r
- Oversampling (size_t numChannels,\r
- size_t factor,\r
- FilterType type,\r
- bool isMaxQuality = true);\r
-\r
- /** Default constructor of the oversampling class, which can be used to create an\r
- empty object and then add the appropriate stages.\r
- */\r
- explicit Oversampling (size_t numChannels = 1);\r
+ Oversampling (size_t numChannels, size_t factor, FilterType type, bool isMaxQuality = true);\r
\r
/** Destructor. */\r
~Oversampling();\r
the oversampling, for example with a dry / wet functionality, and to report\r
the latency to the DAW.\r
\r
- Note: The latency might not be integer, so you might need to round its value\r
+ Note : the latency might not be integer, so you might need to round its value\r
or to compensate it properly in your processing code.\r
*/\r
SampleType getLatencyInSamples() noexcept;\r
Don't forget to set the sample rate of that processing to N times the original\r
sample rate.\r
*/\r
- dsp::AudioBlock<SampleType> processSamplesUp (const dsp::AudioBlock<SampleType>& inputBlock) noexcept;\r
+ dsp::AudioBlock<SampleType> processSamplesUp (const dsp::AudioBlock<SampleType> &inputBlock) noexcept;\r
\r
/** Must be called to perform the downsampling, after the upsampling and the\r
non-linear processing. The output signal is probably delayed by the internal\r
latency of the whole oversampling behaviour, so don't forget to take this\r
into account.\r
*/\r
- void processSamplesDown (dsp::AudioBlock<SampleType>& outputBlock) noexcept;\r
-\r
- //===============================================================================\r
- void addOversamplingStage (FilterType,\r
- float normalizedTransitionWidthUp, float stopbandAttenuationdBUp,\r
- float normalizedTransitionWidthDown, float stopbandAttenuationdBDown);\r
-\r
- void addDummyOversamplingStage();\r
-\r
- void clearOversamplingStages();\r
+ void processSamplesDown (dsp::AudioBlock<SampleType> &outputBlock) noexcept;\r
\r
+private:\r
//===============================================================================\r
- size_t factorOversampling = 1;\r
- size_t numChannels = 1;\r
-\r
- #ifndef DOXYGEN\r
- struct OversamplingStage;\r
- #endif\r
+ bool isMaximumQuality;\r
+ size_t factorOversampling, numStages;\r
+ FilterType type;\r
+ size_t numChannels;\r
\r
-private:\r
//===============================================================================\r
- OwnedArray<OversamplingStage> stages;\r
bool isReady = false;\r
\r
+ OwnedArray<OversamplingEngine<SampleType>> engines;\r
+\r
//===============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Oversampling)\r
};\r
{\r
ProcessorDuplicator() : state (new StateType()) {}\r
ProcessorDuplicator (StateType* stateToUse) : state (stateToUse) {}\r
- ProcessorDuplicator (typename StateType::Ptr stateToUse) : state (static_cast<typename StateType::Ptr&&> (stateToUse)) {}\r
ProcessorDuplicator (const ProcessorDuplicator&) = default;\r
ProcessorDuplicator (ProcessorDuplicator&&) = default;\r
\r
structures for more information). Its behaviour is based on the analog\r
state variable filter circuit.\r
\r
- Note: The bandpass here is not the one in the RBJ CookBook, its gain can be\r
+ Note : the bandpass here is not the one in the RBJ CookBook, its gain can be\r
higher than 0 dB. For the classic 0 dB bandpass, we need to multiply the\r
result with R2\r
\r
*/\r
using NumericType = typename SampleTypeHelpers::ElementType<SampleType>::Type;\r
\r
- /** A typedef for a ref-counted pointer to the coefficients object */\r
- using ParametersPtr = typename Parameters<NumericType>::Ptr;\r
-\r
//==============================================================================\r
/** Creates a filter with default parameters. */\r
- Filter() : parameters (new Parameters<NumericType>) { reset(); }\r
+ Filter() : parameters (new Parameters<NumericType>) { reset(); }\r
\r
- Filter (ParametersPtr parametersToUse) : parameters (static_cast<ParametersPtr&&> (parametersToUse)) { reset(); }\r
+ Filter (Parameters<NumericType>* paramtersToUse) : parameters (paramtersToUse) { reset(); }\r
\r
/** Creates a copy of another filter. */\r
Filter (const Filter&) = default;\r
void snapToZero() noexcept { util::snapToZero (s1); util::snapToZero (s2); }\r
\r
//==============================================================================\r
- /** The parameters of the state variable filter. It's up to the caller to ensure\r
+ /** The parameters of the state variable filter. It's up to the called to ensure\r
that these parameters are modified in a thread-safe way. */\r
typename Parameters<NumericType>::Ptr parameters;\r
\r
Type type = Type::lowPass;\r
\r
/** Sets the cutoff frequency and resonance of the IIR filter.\r
-\r
- Note: The bandwidth of the resonance increases with the value of the\r
+ Note : the bandwidth of the resonance increases with the value of the\r
parameter. To have a standard 12 dB/octave filter, the value must be set\r
at 1 / sqrt(2).\r
*/\r
\r
void messageCallback() override\r
{\r
- if (auto b = broadcaster.get())\r
+ if (const ActionBroadcaster* const b = broadcaster)\r
if (b->actionListeners.contains (listener))\r
listener->actionListenerCallback (message);\r
}\r
ActionBroadcaster::ActionBroadcaster()\r
{\r
// are you trying to create this object before or after juce has been intialised??\r
- JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+ jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
}\r
\r
ActionBroadcaster::~ActionBroadcaster()\r
{\r
// all event-based objects must be deleted BEFORE juce is shut down!\r
- JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+ jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
}\r
\r
void ActionBroadcaster::addActionListener (ActionListener* const listener)\r
//==============================================================================\r
AsyncUpdater::AsyncUpdater()\r
{\r
- activeMessage = *new AsyncUpdaterMessage (*this);\r
+ activeMessage = new AsyncUpdaterMessage (*this);\r
}\r
\r
AsyncUpdater::~AsyncUpdater()\r
{\r
// If you're calling this before (or after) the MessageManager is\r
// running, then you're not going to get any callbacks!\r
- JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+ jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
\r
if (activeMessage->shouldDeliver.compareAndSetBool (1, 0))\r
if (! activeMessage->post())\r
void AsyncUpdater::handleUpdateNowIfNeeded()\r
{\r
// This can only be called by the event thread.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
if (activeMessage->shouldDeliver.exchange (0) != 0)\r
handleAsyncUpdate();\r
{\r
// Listeners can only be safely added when the event thread is locked\r
// You can use a MessageManagerLock if you need to call this from another thread.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
changeListeners.add (listener);\r
}\r
{\r
// Listeners can only be safely removed when the event thread is locked\r
// You can use a MessageManagerLock if you need to call this from another thread.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
changeListeners.remove (listener);\r
}\r
{\r
// Listeners can only be safely removed when the event thread is locked\r
// You can use a MessageManagerLock if you need to call this from another thread.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
changeListeners.clear();\r
}\r
void ChangeBroadcaster::sendSynchronousChangeMessage()\r
{\r
// This can only be called by the event thread.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
broadcastCallback.cancelPendingUpdate();\r
callListeners();\r
\r
private:\r
struct Connection;\r
+ friend struct Connection;\r
+ friend struct ContainerDeletePolicy<Connection>;\r
std::unique_ptr<Connection> connection;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessSlave)\r
std::unique_ptr<ChildProcess> childProcess;\r
\r
struct Connection;\r
+ friend struct Connection;\r
+ friend struct ContainerDeletePolicy<Connection>;\r
std::unique_ptr<Connection> connection;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessMaster)\r
int readData (void*, int);\r
\r
struct ConnectionThread;\r
+ friend struct ConnectionThread;\r
+ friend struct ContainerDeletePolicy<ConnectionThread>;\r
std::unique_ptr<ConnectionThread> thread;\r
-\r
void runThread();\r
int writeData (void*, int);\r
\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-NetworkServiceDiscovery::Advertiser::Advertiser (const String& serviceTypeUID,\r
- const String& serviceDescription,\r
- int broadcastPortToUse, int connectionPort,\r
- RelativeTime minTimeBetweenBroadcasts)\r
- : Thread ("Discovery_broadcast"),\r
- message (serviceTypeUID), broadcastPort (broadcastPortToUse),\r
- minInterval (minTimeBetweenBroadcasts)\r
-{\r
- message.setAttribute ("id", Uuid().toString());\r
- message.setAttribute ("name", serviceDescription);\r
- message.setAttribute ("address", String());\r
- message.setAttribute ("port", connectionPort);\r
-\r
- startThread (2);\r
-}\r
-\r
-NetworkServiceDiscovery::Advertiser::~Advertiser()\r
-{\r
- stopThread (2000);\r
- socket.shutdown();\r
-}\r
-\r
-void NetworkServiceDiscovery::Advertiser::run()\r
-{\r
- if (! socket.bindToPort (0))\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- while (! threadShouldExit())\r
- {\r
- sendBroadcast();\r
- wait ((int) minInterval.inMilliseconds());\r
- }\r
-}\r
-\r
-void NetworkServiceDiscovery::Advertiser::sendBroadcast()\r
-{\r
- auto localAddress = IPAddress::getLocalAddress();\r
- message.setAttribute ("address", localAddress.toString());\r
- auto broadcastAddress = IPAddress::getInterfaceBroadcastAddress (localAddress);\r
- auto data = message.createDocument ({}, true, false);\r
- socket.write (broadcastAddress.toString(), broadcastPort, data.toRawUTF8(), (int) data.getNumBytesAsUTF8());\r
-}\r
-\r
-//==============================================================================\r
-NetworkServiceDiscovery::AvailableServiceList::AvailableServiceList (const String& serviceType, int broadcastPort)\r
- : Thread ("Discovery_listen"), serviceTypeUID (serviceType)\r
-{\r
- socket.bindToPort (broadcastPort);\r
- startThread (2);\r
-}\r
-\r
-NetworkServiceDiscovery::AvailableServiceList::~AvailableServiceList()\r
-{\r
- socket.shutdown();\r
- stopThread (2000);\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::run()\r
-{\r
- while (! threadShouldExit())\r
- {\r
- if (socket.waitUntilReady (true, 200) == 1)\r
- {\r
- char buffer[1024];\r
- auto bytesRead = socket.read (buffer, sizeof (buffer) - 1, false);\r
-\r
- if (bytesRead > 10)\r
- if (auto xml = parseXML (String (CharPointer_UTF8 (buffer),\r
- CharPointer_UTF8 (buffer + bytesRead))))\r
- if (xml->hasTagName (serviceTypeUID))\r
- handleMessage (*xml);\r
- }\r
-\r
- removeTimedOutServices();\r
- }\r
-}\r
-\r
-std::vector<NetworkServiceDiscovery::Service> NetworkServiceDiscovery::AvailableServiceList::getServices() const\r
-{\r
- const ScopedLock sl (listLock);\r
- auto listCopy = services;\r
- return listCopy;\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleAsyncUpdate()\r
-{\r
- if (onChange != nullptr)\r
- onChange();\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const XmlElement& xml)\r
-{\r
- Service service;\r
- service.instanceID = xml.getStringAttribute ("id");\r
-\r
- if (service.instanceID.trim().isNotEmpty())\r
- {\r
- service.description = xml.getStringAttribute ("name");\r
- service.address = IPAddress (xml.getStringAttribute ("address"));\r
- service.port = xml.getIntAttribute ("port");\r
- service.lastSeen = Time::getCurrentTime();\r
-\r
- handleMessage (service);\r
- }\r
-}\r
-\r
-static void sortServiceList (std::vector<NetworkServiceDiscovery::Service>& services)\r
-{\r
- auto compareServices = [] (const NetworkServiceDiscovery::Service& s1,\r
- const NetworkServiceDiscovery::Service& s2)\r
- {\r
- return s1.instanceID < s2.instanceID;\r
- };\r
-\r
- std::sort (services.begin(), services.end(), compareServices);\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::handleMessage (const Service& service)\r
-{\r
- const ScopedLock sl (listLock);\r
-\r
- for (auto& s : services)\r
- {\r
- if (s.instanceID == service.instanceID)\r
- {\r
- if (s.description != service.description\r
- || s.address != service.address\r
- || s.port != service.port)\r
- {\r
- s = service;\r
- triggerAsyncUpdate();\r
- }\r
-\r
- s.lastSeen = service.lastSeen;\r
- return;\r
- }\r
- }\r
-\r
- services.push_back (service);\r
- sortServiceList (services);\r
- triggerAsyncUpdate();\r
-}\r
-\r
-void NetworkServiceDiscovery::AvailableServiceList::removeTimedOutServices()\r
-{\r
- const double timeoutSeconds = 5.0;\r
- auto oldestAllowedTime = Time::getCurrentTime() - RelativeTime::seconds (timeoutSeconds);\r
-\r
- const ScopedLock sl (listLock);\r
-\r
- auto oldEnd = std::end (services);\r
- auto newEnd = std::remove_if (std::begin (services), oldEnd,\r
- [=] (const Service& s) { return s.lastSeen < oldestAllowedTime; });\r
-\r
- if (newEnd != oldEnd)\r
- {\r
- services.erase (newEnd, oldEnd);\r
- triggerAsyncUpdate();\r
- }\r
-}\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- The code included in this file is provided under the terms of the ISC license\r
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
- To use, copy, modify, and/or distribute this software for any purpose with or\r
- without fee is hereby granted provided that the above copyright notice and\r
- this permission notice appear in all copies.\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- Contains classes that implement a simple protocol for broadcasting the availability\r
- and location of a discoverable service on the local network, and for maintaining a\r
- list of known services.\r
-*/\r
-struct NetworkServiceDiscovery\r
-{\r
- /** An object which runs a thread to repeatedly broadcast the existence of a\r
- discoverable service.\r
-\r
- To use, simply create an instance of an Advertiser and it'll broadcast until\r
- you delete it.\r
- */\r
- struct Advertiser : private Thread\r
- {\r
- /** Creates and starts an Advertiser thread, broadcasting with the given properties.\r
- @param serviceTypeUID A user-supplied string to define the type of service this represents\r
- @param serviceDescription A description string that will appear in the Service::description field for clients\r
- @param broadcastPort The port number on which to broadcast the service discovery packets\r
- @param connectionPort The port number that will be sent to appear in the Service::port field\r
- @param minTimeBetweenBroadcasts The interval to wait between sending broadcast messages\r
- */\r
- Advertiser (const String& serviceTypeUID,\r
- const String& serviceDescription,\r
- int broadcastPort,\r
- int connectionPort,\r
- RelativeTime minTimeBetweenBroadcasts = RelativeTime::seconds (1.5));\r
-\r
- /** Destructor */\r
- ~Advertiser();\r
-\r
- private:\r
- XmlElement message;\r
- const int broadcastPort;\r
- const RelativeTime minInterval;\r
- DatagramSocket socket { true };\r
-\r
- void run() override;\r
- void sendBroadcast();\r
- };\r
-\r
- //==============================================================================\r
- /**\r
- Contains information about a service that has been found on the network.\r
- @see AvailableServiceList, Advertiser\r
- */\r
- struct Service\r
- {\r
- String instanceID; /**< A UUID that identifies the particular instance of the Advertiser class. */\r
- String description; /**< The service description as sent by the Advertiser */\r
- IPAddress address; /**< The IP address of the advertiser */\r
- int port; /**< The port number of the advertiser */\r
- Time lastSeen; /**< The time of the last ping received from the advertiser */\r
- };\r
-\r
- //==============================================================================\r
- /**\r
- Watches the network for broadcasts from Advertiser objects, and keeps a list of\r
- all the currently active instances.\r
-\r
- Just create an instance of AvailableServiceList and it will start listening - you\r
- can register a callback with its onChange member to find out when services\r
- appear/disappear, and you can call getServices() to find out the current list.\r
- @see Service, Advertiser\r
- */\r
- struct AvailableServiceList : private Thread,\r
- private AsyncUpdater\r
- {\r
- /** Creates an AvailableServiceList that will bind to the given port number and watch\r
- the network for Advertisers broadcasting the given service type.\r
-\r
- This will only detect broadcasts from an Advertiser object with a matching\r
- serviceTypeUID value, and where the broadcastPort matches.\r
- */\r
- AvailableServiceList (const String& serviceTypeUID, int broadcastPort);\r
-\r
- /** Destructor */\r
- ~AvailableServiceList();\r
-\r
- /** A lambda that can be set to recieve a callback when the list changes */\r
- std::function<void()> onChange;\r
-\r
- /** Returns a list of the currently known services. */\r
- std::vector<Service> getServices() const;\r
-\r
- private:\r
- DatagramSocket socket { true };\r
- String serviceTypeUID;\r
- CriticalSection listLock;\r
- std::vector<Service> services;\r
-\r
- void run() override;\r
- void handleAsyncUpdate() override;\r
- void handleMessage (const XmlElement&);\r
- void handleMessage (const Service&);\r
- void removeTimedOutServices();\r
- };\r
-};\r
-\r
-} // namespace juce\r
#include "interprocess/juce_InterprocessConnection.cpp"\r
#include "interprocess/juce_InterprocessConnectionServer.cpp"\r
#include "interprocess/juce_ConnectedChildProcess.cpp"\r
-#include "interprocess/juce_NetworkServiceDiscovery.cpp"\r
\r
//==============================================================================\r
#if JUCE_MAC || JUCE_IOS\r
\r
ID: juce_events\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE message and event handling classes\r
description: Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
website: http://www.juce.com/juce\r
#endif\r
\r
#if JUCE_EVENTS_INCLUDE_WINRT_WRAPPER && JUCE_WINDOWS\r
- // If this header file is missing then you are probably attempting to use WinRT\r
- // functionality without the WinRT libraries installed on your system. Try installing\r
- // the latest Windows Standalone SDK and maybe also adding the path to the WinRT\r
- // headers to your build system. This path should have the form\r
- // "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\winrt".\r
- #include <inspectable.h>\r
#include <hstring.h>\r
#endif\r
\r
#include "interprocess/juce_InterprocessConnection.h"\r
#include "interprocess/juce_InterprocessConnectionServer.h"\r
#include "interprocess/juce_ConnectedChildProcess.h"\r
-#include "interprocess/juce_NetworkServiceDiscovery.h"\r
\r
#if JUCE_LINUX\r
#include "native/juce_linux_EventLoop.h"\r
namespace juce\r
{\r
\r
-JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = nullptr;\r
+JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = 0;\r
JUCEApplicationBase* JUCEApplicationBase::appInstance = nullptr;\r
\r
#if JUCE_IOS\r
If your application class returns true for this, more than one instance is\r
permitted to run (except on the Mac where this isn't possible).\r
\r
- If it's false, the second instance won't start, but you will still get a\r
+ If it's false, the second instance won't start, but it you will still get a\r
callback to anotherInstanceStarted() to tell you about this - which\r
gives you a chance to react to what the user was trying to do.\r
-\r
- @see anotherInstanceStarted\r
*/\r
virtual bool moreThanOneInstanceAllowed() = 0;\r
\r
/** Indicates that the user has tried to start up another instance of the app.\r
\r
This will get called even if moreThanOneInstanceAllowed() is false.\r
- It is currently only implemented on Windows and Mac.\r
-\r
- @see moreThanOneInstanceAllowed\r
*/\r
virtual void anotherInstanceStarted (const String& commandLine) = 0;\r
\r
static int main (int argc, const char* argv[]);\r
\r
static void appWillTerminateByForce();\r
- using CreateInstanceFunction = JUCEApplicationBase* (*)();\r
+ typedef JUCEApplicationBase* (*CreateInstanceFunction)();\r
static CreateInstanceFunction createInstance;\r
\r
#if JUCE_IOS\r
bool stillInitialising = true;\r
\r
struct MultipleInstanceHandler;\r
+ friend struct MultipleInstanceHandler;\r
+ friend struct ContainerDeletePolicy<MultipleInstanceHandler>;\r
std::unique_ptr<MultipleInstanceHandler> multipleInstanceHandler;\r
\r
JUCE_DECLARE_NON_COPYABLE (JUCEApplicationBase)\r
\r
#if JUCE_IOS\r
/**\r
- You can instruct JUCE to use a custom iOS app delegate class instead of JUCE's default\r
+ You can instruct JUCE to use a custom iOS app delegate class instaed of JUCE's default\r
app delegate. For JUCE to work you must pass all messages to JUCE's internal app delegate.\r
Below is an example of minimal forwarding custom delegate. Note that you are at your own\r
risk if you decide to use your own delegate and subtle, hard to debug bugs may occur.\r
MessageListener::MessageListener() noexcept\r
{\r
// Are you trying to create a messagelistener before or after juce has been intialised??\r
- JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+ jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
}\r
\r
MessageListener::~MessageListener()\r
return thisThread == messageThreadId || thisThread == threadWithLock.get();\r
}\r
\r
-bool MessageManager::existsAndIsLockedByCurrentThread() noexcept\r
-{\r
- if (auto i = getInstanceWithoutCreating())\r
- return i->currentThreadHasLockedMessageManager();\r
-\r
- return false;\r
-}\r
-\r
-bool MessageManager::existsAndIsCurrentThread() noexcept\r
-{\r
- if (auto i = getInstanceWithoutCreating())\r
- return i->isThisTheMessageThread();\r
-\r
- return false;\r
-}\r
-\r
//==============================================================================\r
//==============================================================================\r
/* The only safe way to lock the message thread while another thread does\r
\r
try\r
{\r
- blockingMessage = *new BlockingMessage (this);\r
+ blockingMessage = new BlockingMessage (this);\r
}\r
catch (...)\r
{\r
lockGained.set (0);\r
\r
if (mm != nullptr)\r
- mm->threadWithLock = {};\r
+ mm->threadWithLock = 0;\r
\r
if (blockingMessage != nullptr)\r
{\r
\r
//==============================================================================\r
/** See MessageManager::callFunctionOnMessageThread() for use of this function type. */\r
-using MessageCallbackFunction = void* (void* userData);\r
+typedef void* (MessageCallbackFunction) (void* userData);\r
\r
\r
//==============================================================================\r
*/\r
bool currentThreadHasLockedMessageManager() const noexcept;\r
\r
- /** Returns true if there's an instance of the MessageManager, and if the current thread\r
- has the lock on it.\r
- */\r
- static bool existsAndIsLockedByCurrentThread() noexcept;\r
-\r
- /** Returns true if there's an instance of the MessageManager, and if the current thread\r
- is running it.\r
- */\r
- static bool existsAndIsCurrentThread() noexcept;\r
-\r
//==============================================================================\r
/** Sends a message to all other JUCE applications that are running.\r
\r
\r
//==============================================================================\r
/** Provides the type of scoped lock to use with a CriticalSection. */\r
- using ScopedLockType = GenericScopedLock<Lock>;\r
+ typedef GenericScopedLock<Lock> ScopedLockType;\r
\r
/** Provides the type of scoped unlocker to use with a CriticalSection. */\r
- using ScopedUnlockType = GenericScopedUnlock<Lock>;\r
+ typedef GenericScopedUnlock<Lock> ScopedUnlockType;\r
\r
/** Provides the type of scoped try-locker to use with a CriticalSection. */\r
- using ScopedTryLockType = GenericScopedTryLock<Lock>;\r
+ typedef GenericScopedTryLock<Lock> ScopedTryLockType;\r
\r
private:\r
struct BlockingMessage;\r
JUCE_DECLARE_NON_COPYABLE (MessageManagerLock)\r
};\r
\r
-//==============================================================================\r
-/** This macro is used to catch unsafe use of functions which expect to only be called\r
- on the message thread, or when a MessageManagerLock is in place.\r
- It will also fail if you try to use the function before the message manager has been\r
- created, which could happen if you accidentally invoke it during a static constructor.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
- jassert (juce::MessageManager::existsAndIsLockedByCurrentThread());\r
-\r
-/** This macro is used to catch unsafe use of functions which expect to only be called\r
- on the message thread.\r
- It will also fail if you try to use the function before the message manager has been\r
- created, which could happen if you accidentally invoke it during a static constructor.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_THREAD \\r
- jassert (juce::MessageManager::existsAndIsCurrentThread());\r
-\r
-/** This macro is used to catch unsafe use of functions which expect to not be called\r
- outside the lifetime of the MessageManager.\r
-*/\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_EXISTS \\r
- jassert (juce::MessageManager::getInstanceWithoutCreating() != nullptr);\r
-\r
-\r
} // namespace juce\r
\r
private:\r
JUCE_PUBLIC_IN_DLL_BUILD (struct Pimpl)\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MountedVolumeListChangeDetector)\r
\r
~AndroidMessageQueue()\r
{\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
clearSingletonInstance();\r
}\r
\r
\r
void run() override\r
{\r
- for (;;)\r
+ while (true)\r
{\r
MessageManager::MessageBase::Ptr message (queue.removeAndReturn (0));\r
\r
namespace juce\r
{\r
\r
-using AppFocusChangeCallback = void (*)();\r
+typedef void (*AppFocusChangeCallback)();\r
AppFocusChangeCallback appFocusChangeCallback = nullptr;\r
\r
-using CheckEventBlockedByModalComps = bool (*)(NSEvent*);\r
+typedef bool (*CheckEventBlockedByModalComps) (NSEvent*);\r
CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr;\r
\r
-using MenuTrackingChangedCallback = void (*)(bool);\r
+typedef void (*MenuTrackingChangedCallback)(bool);\r
MenuTrackingChangedCallback menuTrackingChangedCallback = nullptr;\r
\r
//==============================================================================\r
\r
extern HWND juce_messageWindowHandle;\r
\r
-using CheckEventBlockedByModalComps = bool (*)(const MSG&);\r
+typedef bool (*CheckEventBlockedByModalComps) (const MSG&);\r
CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr;\r
\r
-using SettingChangeCallbackFunc = void (*)(void);\r
+typedef void (*SettingChangeCallbackFunc) (void);\r
SettingChangeCallbackFunc settingChangeCallback = nullptr;\r
\r
-#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- bool juce_isRunningInUnity();\r
-#endif\r
-\r
//==============================================================================\r
namespace WindowsMessageHelpers\r
{\r
\r
void dispatchMessageFromLParam (LPARAM lParam)\r
{\r
- if (auto message = reinterpret_cast<MessageManager::MessageBase*> (lParam))\r
+ if (MessageManager::MessageBase* message = reinterpret_cast<MessageManager::MessageBase*> (lParam))\r
{\r
JUCE_TRY\r
{\r
return TRUE;\r
}\r
\r
- void handleBroadcastMessage (const COPYDATASTRUCT* data)\r
+ void handleBroadcastMessage (const COPYDATASTRUCT* const data)\r
{\r
if (data != nullptr && data->dwData == broadcastMessageMagicNumber)\r
{\r
}\r
\r
//==============================================================================\r
- LRESULT CALLBACK messageWndProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) noexcept\r
+ LRESULT CALLBACK messageWndProc (HWND h, const UINT message, const WPARAM wParam, const LPARAM lParam) noexcept\r
{\r
if (h == juce_messageWindowHandle)\r
{\r
handleBroadcastMessage (reinterpret_cast<const COPYDATASTRUCT*> (lParam));\r
return 0;\r
}\r
-\r
- if (message == WM_SETTINGCHANGE)\r
+ else if (message == WM_SETTINGCHANGE)\r
+ {\r
if (settingChangeCallback != nullptr)\r
settingChangeCallback();\r
+ }\r
}\r
\r
return DefWindowProc (h, message, wParam, lParam);\r
#endif\r
\r
//==============================================================================\r
-bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages)\r
+bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPendingMessages)\r
{\r
using namespace WindowsMessageHelpers;\r
MSG m;\r
\r
if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)\r
{\r
- #if JUCE_MODULE_AVAILABLE_juce_gui_extra\r
+ #if JUCE_MODULE_AVAILABLE_juce_gui_extra\r
if (juce_offerEventToActiveXControl (m) != S_FALSE)\r
return true;\r
- #endif\r
+ #endif\r
\r
if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)\r
{\r
{\r
// if it's someone else's window being clicked on, and the focus is\r
// currently on a juce window, pass the kb focus over..\r
- auto currentFocus = GetFocus();\r
+ HWND currentFocus = GetFocus();\r
\r
if (currentFocus == 0 || JuceWindowIdentifier::isJUCEWindow (currentFocus))\r
SetFocus (m.hwnd);\r
bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message)\r
{\r
message->incReferenceCount();\r
-\r
- #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity\r
- if (juce_isRunningInUnity())\r
- return SendNotifyMessage (juce_messageWindowHandle, WindowsMessageHelpers::customMessageID, 0, (LPARAM) message) != 0;\r
- #endif\r
-\r
return PostMessage (juce_messageWindowHandle, WindowsMessageHelpers::customMessageID, 0, (LPARAM) message) != 0;\r
}\r
\r
void MessageManager::broadcastMessage (const String& value)\r
{\r
- auto localCopy = value;\r
+ const String localCopy (value);\r
\r
Array<HWND> windows;\r
EnumWindows (&WindowsMessageHelpers::broadcastEnumWindowProc, (LPARAM) &windows);\r
\r
namespace juce\r
{\r
-\r
-WinRTWrapper::ScopedHString::ScopedHString (String str)\r
-{\r
- if (WinRTWrapper::getInstance()->isInitialised())\r
- WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(),\r
- static_cast<uint32_t> (str.length()),\r
- &hstr);\r
-}\r
-\r
-WinRTWrapper::ScopedHString::~ScopedHString()\r
-{\r
- if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr)\r
- WinRTWrapper::getInstance()->deleteHString (hstr);\r
-}\r
-\r
-WinRTWrapper::~WinRTWrapper()\r
-{\r
- if (winRTHandle != nullptr)\r
- ::FreeLibrary (winRTHandle);\r
-\r
- clearSingletonInstance();\r
-}\r
-\r
-String WinRTWrapper::hStringToString (HSTRING hstr)\r
-{\r
- if (isInitialised())\r
- if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr))\r
- return String (str);\r
-\r
- return {};\r
-}\r
-\r
-WinRTWrapper::WinRTWrapper()\r
-{\r
- winRTHandle = ::LoadLibraryA ("api-ms-win-core-winrt-l1-1-0");\r
-\r
- if (winRTHandle == nullptr)\r
- return;\r
-\r
- roInitialize = (RoInitializeFuncPtr) ::GetProcAddress (winRTHandle, "RoInitialize");\r
- createHString = (WindowsCreateStringFuncPtr) ::GetProcAddress (winRTHandle, "WindowsCreateString");\r
- deleteHString = (WindowsDeleteStringFuncPtr) ::GetProcAddress (winRTHandle, "WindowsDeleteString");\r
- getHStringRawBuffer = (WindowsGetStringRawBufferFuncPtr) ::GetProcAddress (winRTHandle, "WindowsGetStringRawBuffer");\r
- roActivateInstance = (RoActivateInstanceFuncPtr) ::GetProcAddress (winRTHandle, "RoActivateInstance");\r
- roGetActivationFactory = (RoGetActivationFactoryFuncPtr) ::GetProcAddress (winRTHandle, "RoGetActivationFactory");\r
-\r
- if (roInitialize == nullptr || createHString == nullptr || deleteHString == nullptr\r
- || getHStringRawBuffer == nullptr || roActivateInstance == nullptr || roGetActivationFactory == nullptr)\r
- return;\r
-\r
- HRESULT status = roInitialize (1);\r
- initialised = ! (status != S_OK && status != S_FALSE && status != 0x80010106L);\r
-}\r
-\r
-JUCE_IMPLEMENT_SINGLETON (WinRTWrapper)\r
-\r
+ JUCE_IMPLEMENT_SINGLETON (WinRTWrapper)\r
}\r
class WinRTWrapper : public DeletedAtShutdown\r
{\r
public:\r
- class ScopedHString\r
- {\r
- public:\r
- ScopedHString (String);\r
-\r
- ~ScopedHString();\r
-\r
- HSTRING get() const noexcept { return hstr; }\r
-\r
- private:\r
- HSTRING hstr = nullptr;\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString)\r
- };\r
+ JUCE_DECLARE_SINGLETON (WinRTWrapper, true)\r
\r
- template <class ComClass>\r
- class ComPtr\r
+ class ScopedHString\r
{\r
public:\r
- ComPtr() noexcept {}\r
- ComPtr (ComClass* obj) : p (obj) { if (p) p->AddRef(); }\r
- ComPtr (const ComPtr& other) : p (other.p) { if (p) p->AddRef(); }\r
- ~ComPtr() { release(); }\r
-\r
- operator ComClass*() const noexcept { return p; }\r
- ComClass& operator*() const noexcept { return *p; }\r
- ComClass* operator->() const noexcept { return p; }\r
-\r
- ComPtr& operator= (ComClass* const newP)\r
+ ScopedHString (String str)\r
{\r
- if (newP != nullptr)\r
- newP->AddRef();\r
-\r
- release();\r
- p = newP;\r
- return *this;\r
+ if (WinRTWrapper::getInstance()->isInitialised())\r
+ WinRTWrapper::getInstance()->createHString (str.toWideCharPointer(),\r
+ static_cast<uint32_t> (str.length()),\r
+ &hstr);\r
}\r
\r
- ComPtr& operator= (const ComPtr& newP) { return operator= (newP.p); }\r
+ ~ScopedHString()\r
+ {\r
+ if (WinRTWrapper::getInstance()->isInitialised() && hstr != nullptr)\r
+ WinRTWrapper::getInstance()->deleteHString (hstr);\r
+ }\r
\r
- ComClass** resetAndGetPointerAddress()\r
+ HSTRING get() const noexcept\r
{\r
- release();\r
- p = nullptr;\r
- return &p;\r
+ return hstr;\r
}\r
\r
private:\r
- ComClass* p = nullptr;\r
-\r
- void release() { if (p != nullptr) p->Release(); }\r
+ HSTRING hstr = nullptr;\r
\r
- ComClass** operator&() noexcept; // private to avoid it being used accidentally\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedHString)\r
};\r
\r
- JUCE_DECLARE_SINGLETON (WinRTWrapper, true)\r
-\r
- ~WinRTWrapper();\r
-\r
- String hStringToString (HSTRING);\r
+ ~WinRTWrapper()\r
+ {\r
+ if (winRTHandle != nullptr)\r
+ ::FreeLibrary (winRTHandle);\r
\r
- bool isInitialised() const noexcept { return initialised; }\r
+ clearSingletonInstance();\r
+ }\r
\r
- template <class ComClass>\r
- ComPtr<ComClass> activateInstance (const wchar_t* runtimeClassID, REFCLSID classUUID)\r
+ String hStringToString (HSTRING hstr)\r
{\r
- ComPtr<ComClass> result;\r
-\r
if (isInitialised())\r
- {\r
- ComPtr<IInspectable> inspectable;\r
- ScopedHString runtimeClass (runtimeClassID);\r
- auto hr = roActivateInstance (runtimeClass.get(), inspectable.resetAndGetPointerAddress());\r
+ if (const wchar_t* str = getHStringRawBuffer (hstr, nullptr))\r
+ return String (str);\r
\r
- if (SUCCEEDED (hr))\r
- inspectable->QueryInterface (classUUID, (void**) result.resetAndGetPointerAddress());\r
- }\r
+ return {};\r
+ }\r
\r
- return result;\r
+ bool isInitialised() const noexcept\r
+ {\r
+ return initialised;\r
}\r
\r
template <class ComClass>\r
- ComPtr<ComClass> getWRLFactory (const wchar_t* runtimeClassID)\r
+ ComSmartPtr<ComClass> getWRLFactory (const wchar_t* runtimeClassID)\r
{\r
- ComPtr<ComClass> comPtr;\r
+ ComSmartPtr<ComClass> comPtr;\r
\r
if (isInitialised())\r
{\r
ScopedHString classID (runtimeClassID);\r
-\r
if (classID.get() != nullptr)\r
roGetActivationFactory (classID.get(), __uuidof (ComClass), (void**) comPtr.resetAndGetPointerAddress());\r
}\r
}\r
\r
private:\r
- WinRTWrapper();\r
+ WinRTWrapper()\r
+ {\r
+ winRTHandle = ::LoadLibraryA ("api-ms-win-core-winrt-l1-1-0");\r
+ if (winRTHandle == nullptr)\r
+ return;\r
+\r
+ roInitialize = (RoInitializeFuncPtr) ::GetProcAddress (winRTHandle, "RoInitialize");\r
+ createHString = (WindowsCreateStringFuncPtr) ::GetProcAddress (winRTHandle, "WindowsCreateString");\r
+ deleteHString = (WindowsDeleteStringFuncPtr) ::GetProcAddress (winRTHandle, "WindowsDeleteString");\r
+ getHStringRawBuffer = (WindowsGetStringRawBufferFuncPtr) ::GetProcAddress (winRTHandle, "WindowsGetStringRawBuffer");\r
+ roGetActivationFactory = (RoGetActivationFactoryFuncPtr) ::GetProcAddress (winRTHandle, "RoGetActivationFactory");\r
+\r
+ if (roInitialize == nullptr || createHString == nullptr || deleteHString == nullptr\r
+ || getHStringRawBuffer == nullptr || roGetActivationFactory == nullptr)\r
+ return;\r
+\r
+ HRESULT status = roInitialize (1);\r
+ initialised = ! (status != S_OK && status != S_FALSE && status != 0x80010106L);\r
+ }\r
\r
HMODULE winRTHandle = nullptr;\r
bool initialised = false;\r
typedef HRESULT (WINAPI* WindowsCreateStringFuncPtr) (LPCWSTR, UINT32, HSTRING*);\r
typedef HRESULT (WINAPI* WindowsDeleteStringFuncPtr) (HSTRING);\r
typedef PCWSTR (WINAPI* WindowsGetStringRawBufferFuncPtr) (HSTRING, UINT32*);\r
- typedef HRESULT (WINAPI* RoActivateInstanceFuncPtr) (HSTRING, IInspectable**);\r
typedef HRESULT (WINAPI* RoGetActivationFactoryFuncPtr) (HSTRING, REFIID, void**);\r
\r
RoInitializeFuncPtr roInitialize = nullptr;\r
WindowsCreateStringFuncPtr createHString = nullptr;\r
WindowsDeleteStringFuncPtr deleteHString = nullptr;\r
WindowsGetStringRawBufferFuncPtr getHStringRawBuffer = nullptr;\r
- RoActivateInstanceFuncPtr roActivateInstance = nullptr;\r
RoGetActivationFactoryFuncPtr roGetActivationFactory = nullptr;\r
};\r
\r
private AsyncUpdater\r
{\r
public:\r
- using LockType = CriticalSection; // (mysteriously, using a SpinLock here causes problems on some XP machines..)\r
+ typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..)\r
\r
TimerThread() : Thread ("JUCE Timer")\r
{\r
{\r
// If you're calling this before (or after) the MessageManager is\r
// running, then you're not going to get any timer callbacks!\r
- JUCE_ASSERT_MESSAGE_MANAGER_EXISTS\r
+ jassert (MessageManager::getInstanceWithoutCreating() != nullptr);\r
\r
const TimerThread::LockType::ScopedLockType sl (TimerThread::lock);\r
\r
}\r
\r
//==============================================================================\r
+Colour::Colour() noexcept\r
+ : argb (0, 0, 0, 0)\r
+{\r
+}\r
+\r
+Colour::Colour (const Colour& other) noexcept\r
+ : argb (other.argb)\r
+{\r
+}\r
+\r
+Colour& Colour::operator= (const Colour& other) noexcept\r
+{\r
+ argb = other.argb;\r
+ return *this;\r
+}\r
+\r
bool Colour::operator== (const Colour& other) const noexcept { return argb.getNativeARGB() == other.argb.getNativeARGB(); }\r
bool Colour::operator!= (const Colour& other) const noexcept { return argb.getNativeARGB() != other.argb.getNativeARGB(); }\r
\r
{\r
}\r
\r
+Colour::~Colour() noexcept\r
+{\r
+}\r
+\r
+\r
//==============================================================================\r
const PixelARGB Colour::getPixelARGB() const noexcept\r
{\r
public:\r
//==============================================================================\r
/** Creates a transparent black colour. */\r
- Colour() = default;\r
+ Colour() noexcept;\r
\r
/** Creates a copy of another Colour object. */\r
- Colour (const Colour&) = default;\r
+ Colour (const Colour& other) noexcept;\r
\r
/** Creates a colour from a 32-bit ARGB value.\r
\r
float alpha) noexcept;\r
\r
/** Destructor. */\r
- ~Colour() = default;\r
+ ~Colour() noexcept;\r
\r
/** Copies another Colour object. */\r
- Colour& operator= (const Colour&) = default;\r
+ Colour& operator= (const Colour& other) noexcept;\r
\r
/** Compares two colours. */\r
bool operator== (const Colour& other) const noexcept;\r
/** Returns a 32-bit integer that represents this colour.\r
\r
The format of this number is:\r
- ((alpha << 24) | (red << 16) | (green << 8) | blue).\r
+ ((alpha << 24) | (red << 16) | (green << 16) | blue).\r
*/\r
uint32 getARGB() const noexcept;\r
\r
\r
private:\r
//==============================================================================\r
- PixelARGB argb { 0, 0, 0, 0 };\r
+ PixelARGB argb;\r
};\r
\r
} // namespace juce\r
{\r
public:\r
/** Creates a pixel without defining its colour. */\r
- PixelARGB() = default;\r
- ~PixelARGB() = default;\r
+ PixelARGB() noexcept {}\r
+ ~PixelARGB() noexcept {}\r
\r
PixelARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept\r
{\r
{\r
public:\r
/** Creates a pixel without defining its colour. */\r
- PixelRGB() = default;\r
- ~PixelRGB() = default;\r
+ PixelRGB() noexcept {}\r
+ ~PixelRGB() noexcept {}\r
\r
//==============================================================================\r
/** Returns a uint32 which represents the pixel in a platform dependent format which is compatible\r
{\r
public:\r
/** Creates a pixel without defining its colour. */\r
- PixelAlpha() = default;\r
- ~PixelAlpha() = default;\r
+ PixelAlpha() noexcept {}\r
+ ~PixelAlpha() noexcept {}\r
\r
//==============================================================================\r
/** Returns a uint32 which represents the pixel in a platform dependent format which is compatible\r
}\r
\r
void Graphics::drawMultiLineText (const String& text, const int startX,\r
- const int baselineY, const int maximumLineWidth,\r
- Justification justification) const\r
+ const int baselineY, const int maximumLineWidth) const\r
{\r
if (text.isNotEmpty()\r
&& startX < context.getClipBounds().getRight())\r
GlyphArrangement arr;\r
arr.addJustifiedText (context.getFont(), text,\r
(float) startX, (float) baselineY, (float) maximumLineWidth,\r
- justification);\r
+ Justification::left);\r
arr.draw (*this);\r
}\r
}\r
*/\r
void drawMultiLineText (const String& text,\r
int startX, int baselineY,\r
- int maximumLineWidth,\r
- Justification justification = Justification::left) const;\r
+ int maximumLineWidth) const;\r
\r
/** Draws a line of text within a specified rectangle.\r
\r
writeClip();\r
writeColour (stateStack.getLast()->fillType.colour);\r
\r
- auto r2 = r.translated ((float) stateStack.getLast()->xOffset,\r
- (float) stateStack.getLast()->yOffset);\r
+ Rectangle<float> r2 (r.translated ((float) stateStack.getLast()->xOffset,\r
+ (float) stateStack.getLast()->yOffset));\r
\r
out << r2.getX() << ' ' << -r2.getBottom() << ' ' << r2.getWidth() << ' ' << r2.getHeight() << " rectfill\n";\r
}\r
out << "clip\n";\r
}\r
\r
- auto bounds = stateStack.getLast()->clip.getBounds();\r
+ const Rectangle<int> bounds (stateStack.getLast()->clip.getBounds());\r
\r
// ideally this would draw lots of lines or ellipses to approximate the gradient, but for the\r
// time-being, this just fills it with the average colour..\r
}\r
\r
//==============================================================================\r
+DropShadow::DropShadow() noexcept\r
+ : colour (0x90000000), radius (4)\r
+{\r
+}\r
+\r
DropShadow::DropShadow (Colour shadowColour, const int r, Point<int> o) noexcept\r
: colour (shadowColour), radius (r), offset (o)\r
{\r
{\r
jassert (radius > 0);\r
\r
- auto area = (path.getBounds().getSmallestIntegerContainer() + offset)\r
- .expanded (radius + 1)\r
- .getIntersection (g.getClipBounds().expanded (radius + 1));\r
+ const Rectangle<int> area ((path.getBounds().getSmallestIntegerContainer() + offset)\r
+ .expanded (radius + 1)\r
+ .getIntersection (g.getClipBounds().expanded (radius + 1)));\r
\r
if (area.getWidth() > 2 && area.getHeight() > 2)\r
{\r
const float radiusInset = (radius + 1) / 2.0f;\r
const float expandedRadius = radius + radiusInset;\r
\r
- auto area = targetArea.toFloat().reduced (radiusInset) + offset.toFloat();\r
+ const Rectangle<float> area (targetArea.toFloat().reduced (radiusInset) + offset.toFloat());\r
\r
- auto r = area.expanded (expandedRadius);\r
- auto top = r.removeFromTop (expandedRadius);\r
- auto bottom = r.removeFromBottom (expandedRadius);\r
+ Rectangle<float> r (area.expanded (expandedRadius));\r
+ Rectangle<float> top (r.removeFromTop (expandedRadius));\r
+ Rectangle<float> bottom (r.removeFromBottom (expandedRadius));\r
\r
drawShadowSection (g, cg, top.removeFromLeft (expandedRadius), true, 1.0f, 1.0f, 0, 1.0f);\r
drawShadowSection (g, cg, top.removeFromRight (expandedRadius), true, 0, 1.0f, 1.0f, 1.0f);\r
struct JUCE_API DropShadow\r
{\r
/** Creates a default drop-shadow effect. */\r
- DropShadow() = default;\r
+ DropShadow() noexcept;\r
\r
/** Creates a drop-shadow object with the given parameters. */\r
DropShadow (Colour shadowColour, int radius, Point<int> offset) noexcept;\r
In most cases you'll probably want to leave this as black with an alpha\r
value of around 0.5\r
*/\r
- Colour colour { 0x90000000 };\r
+ Colour colour;\r
\r
/** The approximate spread of the shadow. */\r
- int radius { 4 };\r
+ int radius;\r
\r
/** The offset of the shadow. */\r
Point<int> offset;\r
else\r
{\r
if (auto fallbackTypeface = Typeface::getFallbackTypeface())\r
- if (fallbackTypeface.get() != this)\r
+ if (fallbackTypeface != this)\r
x += fallbackTypeface->getStringWidth (String::charToString (c));\r
}\r
}\r
{\r
auto fallbackTypeface = getFallbackTypeface();\r
\r
- if (fallbackTypeface != nullptr && fallbackTypeface.get() != this)\r
+ if (fallbackTypeface != nullptr && fallbackTypeface != this)\r
{\r
Array<int> subGlyphs;\r
Array<float> subOffsets;\r
}\r
\r
if (auto fallbackTypeface = getFallbackTypeface())\r
- if (fallbackTypeface.get() != this)\r
+ if (fallbackTypeface != this)\r
return fallbackTypeface->getOutlineForGlyph (glyphNumber, path);\r
\r
return false;\r
else\r
{\r
if (auto fallbackTypeface = getFallbackTypeface())\r
- if (fallbackTypeface.get() != this)\r
+ if (fallbackTypeface != this)\r
return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform, fontHeight);\r
}\r
\r
private:\r
//==============================================================================\r
class GlyphInfo;\r
+ friend struct ContainerDeletePolicy<GlyphInfo>;\r
OwnedArray<GlyphInfo> glyphs;\r
- short lookupTable[128];\r
+ short lookupTable [128];\r
\r
GlyphInfo* findGlyph (const juce_wchar character, bool loadIfNeeded) noexcept;\r
\r
String fallbackFontStyle;\r
}\r
\r
-using GetTypefaceForFont = Typeface::Ptr (*)(const Font&);\r
+typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&);\r
GetTypefaceForFont juce_getTypefaceForFont = nullptr;\r
\r
float Font::getDefaultMinimumHorizontalScaleFactor() noexcept { return FontValues::minimumHorizontalScale; }\r
void Font::dupeInternalIfShared()\r
{\r
if (font->getReferenceCount() > 1)\r
- font = *new SharedFontInternal (*font);\r
+ font = new SharedFontInternal (*font);\r
}\r
\r
void Font::checkTypefaceSuitability()\r
jassert (font->typeface != nullptr);\r
}\r
\r
- return font->typeface.get();\r
+ return font->typeface;\r
}\r
\r
//==============================================================================\r
Typeface::Ptr Typeface::getFallbackTypeface()\r
{\r
const Font fallbackFont (Font::getFallbackFontName(), Font::getFallbackFontStyle(), 10.0f);\r
- return Typeface::Ptr (fallbackFont.getTypeface());\r
+ return fallbackFont.getTypeface();\r
}\r
\r
EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight)\r
struct Typeface::HintingParams\r
{\r
HintingParams (Typeface& t)\r
+ : cachedSize (0), top (0), middle (0), bottom (0)\r
{\r
- Font font (t);\r
+ Font font (&t);\r
font = font.withHeight ((float) standardHeight);\r
\r
top = getAverageY (font, "BDEFPRTZOQ", true);\r
float middle, upperScale, upperOffset, lowerScale, lowerOffset;\r
};\r
\r
- float cachedSize = 0;\r
+ float cachedSize;\r
Scaling cachedScale;\r
\r
static float getAverageY (const Font& font, const char* chars, bool getTop)\r
}\r
\r
enum { standardHeight = 100 };\r
- float top = 0, middle = 0, bottom = 0;\r
+ float top, middle, bottom;\r
};\r
\r
void Typeface::applyVerticalHintingTransform (float fontSize, Path& path)\r
\r
private:\r
struct HintingParams;\r
+ friend struct ContainerDeletePolicy<HintingParams>;\r
std::unique_ptr<HintingParams> hintingParams;\r
CriticalSection hintingLock;\r
\r
namespace juce\r
{\r
\r
+AffineTransform::AffineTransform() noexcept\r
+ : mat00 (1.0f), mat01 (0), mat02 (0),\r
+ mat10 (0), mat11 (1.0f), mat12 (0)\r
+{\r
+}\r
+\r
+AffineTransform::AffineTransform (const AffineTransform& other) noexcept\r
+ : mat00 (other.mat00), mat01 (other.mat01), mat02 (other.mat02),\r
+ mat10 (other.mat10), mat11 (other.mat11), mat12 (other.mat12)\r
+{\r
+}\r
+\r
AffineTransform::AffineTransform (float m00, float m01, float m02,\r
float m10, float m11, float m12) noexcept\r
: mat00 (m00), mat01 (m01), mat02 (m02),\r
{\r
}\r
\r
+AffineTransform& AffineTransform::operator= (const AffineTransform& other) noexcept\r
+{\r
+ mat00 = other.mat00;\r
+ mat01 = other.mat01;\r
+ mat02 = other.mat02;\r
+ mat10 = other.mat10;\r
+ mat11 = other.mat11;\r
+ mat12 = other.mat12;\r
+\r
+ return *this;\r
+}\r
+\r
bool AffineTransform::operator== (const AffineTransform& other) const noexcept\r
{\r
return mat00 == other.mat00\r
&& mat11 == 1.0f;\r
}\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const AffineTransform AffineTransform::identity (1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const AffineTransform AffineTransform::identity);\r
\r
//==============================================================================\r
AffineTransform AffineTransform::followedBy (const AffineTransform& other) const noexcept\r
public:\r
//==============================================================================\r
/** Creates an identity transform. */\r
- AffineTransform() = default;\r
+ AffineTransform() noexcept;\r
\r
/** Creates a copy of another transform. */\r
- AffineTransform (const AffineTransform&) = default;\r
+ AffineTransform (const AffineTransform& other) noexcept;\r
\r
/** Creates a transform from a set of raw matrix values.\r
\r
float mat10, float mat11, float mat12) noexcept;\r
\r
/** Copies from another AffineTransform object */\r
- AffineTransform& operator= (const AffineTransform&) = default;\r
+ AffineTransform& operator= (const AffineTransform& other) noexcept;\r
\r
/** Compares two transforms. */\r
bool operator== (const AffineTransform& other) const noexcept;\r
/* A ready-to-use identity transform - now depracated.\r
@deprecated If you need an identity transform, just use AffineTransform() or {}.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const AffineTransform identity;)\r
+ JUCE_DEPRECATED_STATIC (static const AffineTransform identity);\r
\r
//==============================================================================\r
/* The transform matrix is:\r
(mat10 mat11 mat12)\r
( 0 0 1 )\r
*/\r
- float mat00 { 1.0f }, mat01 { 0.0f }, mat02 { 0.0f };\r
- float mat10 { 0.0f }, mat11 { 1.0f }, mat12 { 0.0f };\r
+ float mat00, mat01, mat02;\r
+ float mat10, mat11, mat12;\r
};\r
\r
} // namespace juce\r
/** Creates a null border.\r
All sizes are left as 0.\r
*/\r
- BorderSize() = default;\r
+ BorderSize() noexcept\r
+ : top(), left(), bottom(), right()\r
+ {\r
+ }\r
\r
/** Creates a copy of another border. */\r
- BorderSize (const BorderSize&) = default;\r
+ BorderSize (const BorderSize& other) noexcept\r
+ : top (other.top), left (other.left), bottom (other.bottom), right (other.right)\r
+ {\r
+ }\r
\r
/** Creates a border with the given gaps. */\r
BorderSize (ValueType topGap, ValueType leftGap, ValueType bottomGap, ValueType rightGap) noexcept\r
/** Returns the gap that should be left at the top of the region. */\r
ValueType getTop() const noexcept { return top; }\r
\r
- /** Returns the gap that should be left at the left of the region. */\r
+ /** Returns the gap that should be left at the top of the region. */\r
ValueType getLeft() const noexcept { return left; }\r
\r
- /** Returns the gap that should be left at the bottom of the region. */\r
+ /** Returns the gap that should be left at the top of the region. */\r
ValueType getBottom() const noexcept { return bottom; }\r
\r
- /** Returns the gap that should be left at the right of the region. */\r
+ /** Returns the gap that should be left at the top of the region. */\r
ValueType getRight() const noexcept { return right; }\r
\r
/** Returns the sum of the top and bottom gaps. */\r
\r
private:\r
//==============================================================================\r
- ValueType top{}, left{}, bottom{}, right{};\r
+ ValueType top, left, bottom, right;\r
};\r
\r
} // namespace juce\r
public:\r
//==============================================================================\r
/** Creates a line, using (0, 0) as its start and end points. */\r
- Line() = default;\r
+ Line() noexcept {}\r
\r
/** Creates a copy of another line. */\r
- Line (const Line&) = default;\r
+ Line (const Line& other) noexcept\r
+ : start (other.start), end (other.end)\r
+ {\r
+ }\r
\r
/** Creates a line based on the coordinates of its start and end points. */\r
Line (ValueType startX, ValueType startY, ValueType endX, ValueType endY) noexcept\r
}\r
\r
/** Copies a line from another one. */\r
- Line& operator= (const Line&) = default;\r
+ Line& operator= (const Line& other) noexcept\r
+ {\r
+ start = other.start;\r
+ end = other.end;\r
+ return *this;\r
+ }\r
\r
/** Destructor. */\r
- ~Line() = default;\r
+ ~Line() noexcept {}\r
\r
//==============================================================================\r
/** Returns the x coordinate of the line's start point. */\r
the intersection (if the lines intersect). If the lines\r
are parallel, this will just be set to the position\r
of one of the line's endpoints.\r
- @returns true if the line segments intersect; false if they don't. Even if they\r
+ @returns true if the line segments intersect; false if they dont. Even if they\r
don't intersect, the intersection coordinates returned will still\r
be valid\r
*/\r
//==============================================================================\r
/** Creates a parallelogram with zero size at the origin.\r
*/\r
- Parallelogram() = default;\r
+ Parallelogram() noexcept\r
+ {\r
+ }\r
\r
/** Creates a copy of another parallelogram. */\r
- Parallelogram (const Parallelogram&) = default;\r
+ Parallelogram (const Parallelogram& other) noexcept\r
+ : topLeft (other.topLeft), topRight (other.topRight), bottomLeft (other.bottomLeft)\r
+ {\r
+ }\r
\r
/** Creates a parallelogram based on 3 points. */\r
Parallelogram (Point<ValueType> topLeftPosition,\r
{\r
}\r
\r
- Parallelogram& operator= (const Parallelogram&) = default;\r
+ Parallelogram& operator= (const Parallelogram& other) noexcept\r
+ {\r
+ topLeft = other.topLeft;\r
+ topRight = other.topRight;\r
+ bottomLeft = other.bottomLeft;\r
+ return *this;\r
+ }\r
\r
/** Destructor. */\r
- ~Parallelogram() = default;\r
+ ~Parallelogram() noexcept {}\r
\r
//==============================================================================\r
/** Returns true if the parallelogram has a width or height of more than zero. */\r
\r
startNewSubPath (bodyArea.getX() + cornerSizeW, bodyArea.getY());\r
\r
- auto targetLimit = bodyArea.reduced (jmin (halfW - 1.0f, cornerSizeW + arrowBaseWidth),\r
- jmin (halfH - 1.0f, cornerSizeH + arrowBaseWidth));\r
+ const Rectangle<float> targetLimit (bodyArea.reduced (jmin (halfW - 1.0f, cornerSizeW + arrowBaseWidth),\r
+ jmin (halfH - 1.0f, cornerSizeH + arrowBaseWidth)));\r
\r
if (Rectangle<float> (targetLimit.getX(), maximumArea.getY(),\r
targetLimit.getWidth(), bodyArea.getY() - maximumArea.getY()).contains (arrowTip))\r
}\r
\r
void PathStrokeType::createStrokedPath (Path& destPath, const Path& sourcePath,\r
- const AffineTransform& transform, float extraAccuracy) const\r
+ const AffineTransform& transform, const float extraAccuracy) const\r
{\r
PathStrokeHelpers::createStroke (thickness, jointStyle, endStyle, destPath, sourcePath,\r
- transform, extraAccuracy, nullptr);\r
+ transform, extraAccuracy, 0);\r
}\r
\r
void PathStrokeType::createDashedStroke (Path& destPath,\r
const float* dashLengths,\r
int numDashLengths,\r
const AffineTransform& transform,\r
- float extraAccuracy) const\r
+ const float extraAccuracy) const\r
{\r
jassert (extraAccuracy > 0);\r
\r
{\r
public:\r
/** Creates a point at the origin */\r
- JUCE_CONSTEXPR Point() = default;\r
+ JUCE_CONSTEXPR Point() noexcept : x(), y() {}\r
\r
/** Creates a copy of another point. */\r
- JUCE_CONSTEXPR Point (const Point&) = default;\r
+ JUCE_CONSTEXPR Point (const Point& other) noexcept : x (other.x), y (other.y) {}\r
\r
/** Creates a point from an (x, y) position. */\r
JUCE_CONSTEXPR Point (ValueType initialX, ValueType initialY) noexcept : x (initialX), y (initialY) {}\r
\r
//==============================================================================\r
/** Copies this point from another one. */\r
- Point& operator= (const Point&) = default;\r
+ Point& operator= (const Point& other) noexcept { x = other.x; y = other.y; return *this; }\r
\r
JUCE_CONSTEXPR inline bool operator== (Point other) const noexcept { return x == other.x && y == other.y; }\r
JUCE_CONSTEXPR inline bool operator!= (Point other) const noexcept { return x != other.x || y != other.y; }\r
\r
//==============================================================================\r
/** This type will be double if the Point's type is double, otherwise it will be float. */\r
- using FloatType = typename TypeHelpers::SmallestFloatType<ValueType>::type;\r
+ typedef typename TypeHelpers::SmallestFloatType<ValueType>::type FloatType;\r
\r
//==============================================================================\r
/** Returns the straight-line distance between this point and the origin. */\r
String toString() const { return String (x) + ", " + String (y); }\r
\r
//==============================================================================\r
- ValueType x{}; /**< The point's X coordinate. */\r
- ValueType y{}; /**< The point's Y coordinate. */\r
+ ValueType x; /**< The point's X coordinate. */\r
+ ValueType y; /**< The point's Y coordinate. */\r
};\r
\r
/** Multiplies the point's coordinates by a scalar value. */\r
/** Creates a rectangle of zero size.\r
The default coordinates will be (0, 0, 0, 0).\r
*/\r
- Rectangle() = default;\r
+ Rectangle() noexcept\r
+ : w(), h()\r
+ {\r
+ }\r
\r
/** Creates a copy of another rectangle. */\r
- Rectangle (const Rectangle&) = default;\r
+ Rectangle (const Rectangle& other) noexcept\r
+ : pos (other.pos), w (other.w), h (other.h)\r
+ {\r
+ }\r
\r
/** Creates a rectangle with a given position and size. */\r
Rectangle (ValueType initialX, ValueType initialY,\r
return { left, top, right - left, bottom - top };\r
}\r
\r
- /** Creates a copy of another rectangle. */\r
- Rectangle& operator= (const Rectangle&) = default;\r
+ Rectangle& operator= (const Rectangle& other) noexcept\r
+ {\r
+ pos = other.pos;\r
+ w = other.w; h = other.h;\r
+ return *this;\r
+ }\r
\r
/** Destructor. */\r
- ~Rectangle() = default;\r
+ ~Rectangle() noexcept {}\r
\r
//==============================================================================\r
/** Returns true if the rectangle's width or height are zero or less */\r
template <typename OtherType> friend class Rectangle;\r
\r
Point<ValueType> pos;\r
- ValueType w{}, h{};\r
+ ValueType w, h;\r
\r
static ValueType parseIntAfterSpace (StringRef s) noexcept\r
{ return static_cast<ValueType> (s.text.findEndOfWhitespace().getIntValue32()); }\r
class RectangleList final\r
{\r
public:\r
- using RectangleType = Rectangle<ValueType>;\r
+ typedef Rectangle<ValueType> RectangleType;\r
\r
//==============================================================================\r
/** Creates an empty RectangleList */\r
void add (const RectangleList& other)\r
{\r
for (auto& r : other)\r
- add (r);\r
+ add (*r);\r
}\r
\r
/** Removes a rectangular region from the list.\r
namespace jpeglibNamespace\r
{\r
#if JUCE_INCLUDE_JPEGLIB_CODE || ! defined (JUCE_INCLUDE_JPEGLIB_CODE)\r
- #if JUCE_MINGW\r
- typedef unsigned char boolean;\r
- #endif\r
-\r
- #if JUCE_CLANG\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wconversion"\r
- #pragma clang diagnostic ignored "-Wdeprecated-register"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
- #if __has_warning("-Wcomma")\r
- #pragma clang diagnostic ignored "-Wcomma"\r
- #endif\r
- #endif\r
+ #if JUCE_MINGW\r
+ typedef unsigned char boolean;\r
+ #endif\r
\r
- #if JUCE_GCC && __GNUC__ > 5\r
- #pragma GCC diagnostic push\r
- #pragma GCC diagnostic ignored "-Wshift-negative-value"\r
+ #if JUCE_CLANG\r
+ #pragma clang diagnostic push\r
+ #pragma clang diagnostic ignored "-Wconversion"\r
+ #pragma clang diagnostic ignored "-Wdeprecated-register"\r
+ #if __has_warning("-Wcomma")\r
+ #pragma clang diagnostic ignored "-Wcomma"\r
#endif\r
+ #endif\r
\r
#define JPEG_INTERNALS\r
#undef FAR\r
#include "jpglib/jutils.c"\r
#include "jpglib/transupp.c"\r
\r
- #if JUCE_CLANG\r
- #pragma clang diagnostic pop\r
- #endif\r
-\r
- #if JUCE_GCC && __GNUC__ > 5\r
- #pragma GCC diagnostic pop\r
- #endif\r
+ #if JUCE_CLANG\r
+ #pragma clang diagnostic pop\r
+ #endif\r
#else\r
#define JPEG_INTERNALS\r
#undef FAR\r
#if JUCE_CLANG\r
#pragma clang diagnostic push\r
#pragma clang diagnostic ignored "-Wsign-conversion"\r
- #if __has_warning("-Wzero-as-null-pointer-constant")\r
- #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"\r
- #endif\r
#if __has_warning("-Wcomma")\r
#pragma clang diagnostic ignored "-Wcomma"\r
#endif\r
bool PNGImageFormat::writeImageToStream (const Image& image, OutputStream& out)\r
{\r
using namespace pnglibNamespace;\r
- auto width = image.getWidth();\r
- auto height = image.getHeight();\r
+ const int width = image.getWidth();\r
+ const int height = image.getHeight();\r
\r
- auto pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);\r
+ png_structp pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);\r
\r
if (pngWriteStruct == nullptr)\r
return false;\r
\r
- auto pngInfoStruct = png_create_info_struct (pngWriteStruct);\r
+ png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct);\r
\r
if (pngInfoStruct == nullptr)\r
{\r
- png_destroy_write_struct (&pngWriteStruct, nullptr);\r
+ png_destroy_write_struct (&pngWriteStruct, (png_infopp) nullptr);\r
return false;\r
}\r
\r
- png_set_write_fn (pngWriteStruct, &out, PNGHelpers::writeDataCallback, nullptr);\r
+ png_set_write_fn (pngWriteStruct, &out, PNGHelpers::writeDataCallback, 0);\r
\r
png_set_IHDR (pngWriteStruct, pngInfoStruct, (png_uint_32) width, (png_uint_32) height, 8,\r
image.hasAlphaChannel() ? PNG_COLOR_TYPE_RGB_ALPHA\r
namespace juce\r
{\r
\r
-ImagePixelData::ImagePixelData (Image::PixelFormat format, int w, int h)\r
+ImagePixelData::ImagePixelData (const Image::PixelFormat format, const int w, const int h)\r
: pixelFormat (format), width (w), height (h)\r
{\r
jassert (format == Image::RGB || format == Image::ARGB || format == Image::SingleChannel);\r
class SoftwarePixelData : public ImagePixelData\r
{\r
public:\r
- SoftwarePixelData (Image::PixelFormat formatToUse, int w, int h, bool clearImage)\r
- : ImagePixelData (formatToUse, w, h),\r
- pixelStride (formatToUse == Image::RGB ? 3 : ((formatToUse == Image::ARGB) ? 4 : 1)),\r
+ SoftwarePixelData (const Image::PixelFormat format_, const int w, const int h, const bool clearImage)\r
+ : ImagePixelData (format_, w, h),\r
+ pixelStride (format_ == Image::RGB ? 3 : ((format_ == Image::ARGB) ? 4 : 1)),\r
lineStride ((pixelStride * jmax (1, w) + 3) & ~3)\r
{\r
imageData.allocate ((size_t) lineStride * (size_t) jmax (1, h), clearImage);\r
LowLevelGraphicsContext* createLowLevelContext() override\r
{\r
sendDataChangeMessage();\r
- return new LowLevelGraphicsSoftwareRenderer (Image (*this));\r
+ return new LowLevelGraphicsSoftwareRenderer (Image (this));\r
}\r
\r
void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
\r
ImagePixelData::Ptr clone() override\r
{\r
- auto s = new SoftwarePixelData (pixelFormat, width, height, false);\r
+ SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false);\r
memcpy (s->imageData, imageData, (size_t) lineStride * (size_t) height);\r
- return *s;\r
+ return s;\r
}\r
\r
ImageType* createType() const override { return new SoftwareImageType(); }\r
\r
ImagePixelData::Ptr SoftwareImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const\r
{\r
- return *new SoftwarePixelData (format, width, height, clearImage);\r
+ return new SoftwarePixelData (format, width, height, clearImage);\r
}\r
\r
int SoftwareImageType::getTypeID() const\r
class SubsectionPixelData : public ImagePixelData\r
{\r
public:\r
- SubsectionPixelData (ImagePixelData::Ptr source, Rectangle<int> r)\r
- : ImagePixelData (source->pixelFormat, r.getWidth(), r.getHeight()),\r
- sourceImage (static_cast<ImagePixelData::Ptr&&> (source)), area (r)\r
+ SubsectionPixelData (ImagePixelData* const im, const Rectangle<int>& r)\r
+ : ImagePixelData (im->pixelFormat, r.getWidth(), r.getHeight()),\r
+ sourceImage (im), area (r)\r
{\r
}\r
\r
\r
{\r
Graphics g (newImage);\r
- g.drawImageAt (Image (*this), 0, 0);\r
+ g.drawImageAt (Image (this), 0, 0);\r
}\r
\r
- return *newImage.getPixelData();\r
+ return newImage.getPixelData();\r
}\r
\r
ImageType* createType() const override { return sourceImage->createType(); }\r
if (area.contains (getBounds()))\r
return *this;\r
\r
- auto validArea = area.getIntersection (getBounds());\r
-\r
- if (validArea.isEmpty())\r
- return {};\r
-\r
- return Image (*new SubsectionPixelData (image, validArea));\r
+ const Rectangle<int> validArea (area.getIntersection (getBounds()));\r
+ return Image (validArea.isEmpty() ? nullptr : new SubsectionPixelData (image, validArea));\r
}\r
\r
\r
{\r
}\r
\r
-Image::Image (ReferenceCountedObjectPtr<ImagePixelData> instance) noexcept\r
- : image (static_cast<ReferenceCountedObjectPtr<ImagePixelData>&&> (instance))\r
+Image::Image (ImagePixelData* const instance) noexcept\r
+ : image (instance)\r
{\r
}\r
\r
-Image::Image (PixelFormat format, int width, int height, bool clearImage)\r
+Image::Image (const PixelFormat format, int width, int height, bool clearImage)\r
: image (NativeImageType().create (format, width, height, clearImage))\r
{\r
}\r
\r
-Image::Image (PixelFormat format, int width, int height, bool clearImage, const ImageType& type)\r
+Image::Image (const PixelFormat format, int width, int height, bool clearImage, const ImageType& type)\r
: image (type.create (format, width, height, clearImage))\r
{\r
}\r
}\r
\r
Image::Image (Image&& other) noexcept\r
- : image (std::move (other.image))\r
+ : image (static_cast<ImagePixelData::Ptr&&> (other.image))\r
{\r
}\r
\r
Image& Image::operator= (Image&& other) noexcept\r
{\r
- image = std::move (other.image);\r
+ image = static_cast<ImagePixelData::Ptr&&> (other.image);\r
return *this;\r
}\r
\r
{\r
}\r
\r
-JUCE_DECLARE_DEPRECATED_STATIC (const Image Image::null;)\r
+JUCE_DECLARE_DEPRECATED_STATIC (const Image Image::null);\r
\r
int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); }\r
int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; }\r
if (image != nullptr)\r
return Image (image->clone());\r
\r
- return {};\r
+ return Image();\r
}\r
\r
-Image Image::rescaled (int newWidth, int newHeight, Graphics::ResamplingQuality quality) const\r
+Image Image::rescaled (const int newWidth, const int newHeight, const Graphics::ResamplingQuality quality) const\r
{\r
if (image == nullptr || (image->width == newWidth && image->height == newHeight))\r
return *this;\r
if (image == nullptr || newFormat == image->pixelFormat)\r
return *this;\r
\r
- auto w = image->width, h = image->height;\r
+ const int w = image->width, h = image->height;\r
\r
const std::unique_ptr<ImageType> type (image->createType());\r
Image newImage (type->create (newFormat, w, h, false));\r
\r
for (int y = 0; y < h; ++y)\r
{\r
- auto src = reinterpret_cast<const PixelARGB*> (srcData.getLinePointer (y));\r
- auto dst = destData.getLinePointer (y);\r
+ const PixelARGB* const src = (const PixelARGB*) srcData.getLinePointer (y);\r
+ uint8* const dst = destData.getLinePointer (y);\r
\r
for (int x = 0; x < w; ++x)\r
dst[x] = src[x].getAlpha();\r
\r
for (int y = 0; y < h; ++y)\r
{\r
- auto src = reinterpret_cast<const PixelAlpha*> (srcData.getLinePointer (y));\r
- auto dst = reinterpret_cast<PixelARGB*> (destData.getLinePointer (y));\r
+ const PixelAlpha* const src = (const PixelAlpha*) srcData.getLinePointer (y);\r
+ PixelARGB* const dst = (PixelARGB*) destData.getLinePointer (y);\r
\r
for (int x = 0; x < w; ++x)\r
dst[x].set (src[x]);\r
}\r
\r
//==============================================================================\r
-Image::BitmapData::BitmapData (Image& im, int x, int y, int w, int h, BitmapData::ReadWriteMode mode)\r
+Image::BitmapData::BitmapData (Image& im, const int x, const int y, const int w, const int h, BitmapData::ReadWriteMode mode)\r
: width (w), height (h)\r
{\r
// The BitmapData class must be given a valid image, and a valid rectangle within it!\r
jassert (data != nullptr && pixelStride > 0 && lineStride != 0);\r
}\r
\r
-Image::BitmapData::BitmapData (const Image& im, int x, int y, int w, int h)\r
+Image::BitmapData::BitmapData (const Image& im, const int x, const int y, const int w, const int h)\r
: width (w), height (h)\r
{\r
// The BitmapData class must be given a valid image, and a valid rectangle within it!\r
{\r
}\r
\r
-Colour Image::BitmapData::getPixelColour (int x, int y) const noexcept\r
+Colour Image::BitmapData::getPixelColour (const int x, const int y) const noexcept\r
{\r
jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height));\r
\r
- auto pixel = getPixelPointer (x, y);\r
+ const uint8* const pixel = getPixelPointer (x, y);\r
\r
switch (pixelFormat)\r
{\r
default: jassertfalse; break;\r
}\r
\r
- return {};\r
+ return Colour();\r
}\r
\r
-void Image::BitmapData::setPixelColour (int x, int y, Colour colour) const noexcept\r
+void Image::BitmapData::setPixelColour (const int x, const int y, Colour colour) const noexcept\r
{\r
jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height));\r
\r
- auto pixel = getPixelPointer (x, y);\r
- auto col = colour.getPixelARGB();\r
+ uint8* const pixel = getPixelPointer (x, y);\r
+ const PixelARGB col (colour.getPixelARGB());\r
\r
switch (pixelFormat)\r
{\r
}\r
\r
//==============================================================================\r
-Colour Image::getPixelAt (int x, int y) const\r
+Colour Image::getPixelAt (const int x, const int y) const\r
{\r
if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight()))\r
{\r
return srcData.getPixelColour (0, 0);\r
}\r
\r
- return {};\r
+ return Colour();\r
}\r
\r
-void Image::setPixelAt (int x, int y, Colour colour)\r
+void Image::setPixelAt (const int x, const int y, Colour colour)\r
{\r
if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight()))\r
{\r
}\r
}\r
\r
-void Image::multiplyAlphaAt (int x, int y, float multiplier)\r
+void Image::multiplyAlphaAt (const int x, const int y, const float multiplier)\r
{\r
if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight())\r
&& hasAlphaChannel())\r
const BitmapData destData (*this, x, y, 1, 1, BitmapData::readWrite);\r
\r
if (isARGB())\r
- reinterpret_cast<PixelARGB*> (destData.data)->multiplyAlpha (multiplier);\r
+ ((PixelARGB*) destData.data)->multiplyAlpha (multiplier);\r
else\r
*(destData.data) = (uint8) (*(destData.data) * multiplier);\r
}\r
{\r
for (int y = 0; y < data.height; ++y)\r
{\r
- auto p = data.getLinePointer (y);\r
+ uint8* p = data.getLinePointer (y);\r
\r
for (int x = 0; x < data.width; ++x)\r
{\r
- pixelOp (*reinterpret_cast<PixelType*> (p));\r
+ pixelOp (*(PixelType*) p);\r
p += data.pixelStride;\r
}\r
}\r
}\r
};\r
\r
-void Image::multiplyAllAlphas (float amountToMultiplyBy)\r
+void Image::multiplyAllAlphas (const float amountToMultiplyBy)\r
{\r
jassert (hasAlphaChannel());\r
\r
}\r
}\r
\r
-void Image::createSolidAreaMask (RectangleList<int>& result, float alphaThreshold) const\r
+void Image::createSolidAreaMask (RectangleList<int>& result, const float alphaThreshold) const\r
{\r
if (hasAlphaChannel())\r
{\r
- auto threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));\r
+ const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));\r
SparseSet<int> pixelsOnRow;\r
\r
const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());\r
for (int y = 0; y < srcData.height; ++y)\r
{\r
pixelsOnRow.clear();\r
- auto lineData = srcData.getLinePointer (y);\r
+ const uint8* lineData = srcData.getLinePointer (y);\r
\r
if (isARGB())\r
{\r
for (int x = 0; x < srcData.width; ++x)\r
{\r
- if (reinterpret_cast<const PixelARGB*> (lineData)->getAlpha() >= threshold)\r
+ if (((const PixelARGB*) lineData)->getAlpha() >= threshold)\r
pixelsOnRow.addRange (Range<int> (x, x + 1));\r
\r
lineData += srcData.pixelStride;\r
\r
for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)\r
{\r
- auto range = pixelsOnRow.getRange (i);\r
+ const Range<int> range (pixelsOnRow.getRange (i));\r
result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));\r
}\r
\r
\r
if (w > 0 && h > 0)\r
{\r
- auto maxX = jmax (dx, sx) + w;\r
- auto maxY = jmax (dy, sy) + h;\r
+ const int maxX = jmax (dx, sx) + w;\r
+ const int maxY = jmax (dy, sy) + h;\r
\r
const BitmapData destData (*this, minX, minY, maxX - minX, maxY - minY, BitmapData::readWrite);\r
\r
- auto dst = destData.getPixelPointer (dx - minX, dy - minY);\r
- auto src = destData.getPixelPointer (sx - minX, sy - minY);\r
+ uint8* dst = destData.getPixelPointer (dx - minX, dy - minY);\r
+ const uint8* src = destData.getPixelPointer (sx - minX, sy - minY);\r
\r
- auto lineSize = (size_t) (destData.pixelStride * w);\r
+ const size_t lineSize = (size_t) (destData.pixelStride * w);\r
\r
if (dy > sy)\r
{\r
\r
//==============================================================================\r
/** @internal */\r
- ImagePixelData* getPixelData() const noexcept { return image.get(); }\r
+ ImagePixelData* getPixelData() const noexcept { return image; }\r
\r
/** @internal */\r
- explicit Image (ReferenceCountedObjectPtr<ImagePixelData>) noexcept;\r
+ explicit Image (ImagePixelData*) noexcept;\r
\r
/* A null Image object that can be used when you need to return an invalid image.\r
@deprecated If you need a default-constructed var, just use Image() or {}.\r
*/\r
- JUCE_DEPRECATED_STATIC (static const Image null;)\r
+ JUCE_DEPRECATED_STATIC (static const Image null);\r
\r
private:\r
//==============================================================================\r
#include <cstdio>\r
#endif\r
\r
- #include <unordered_map>\r
-\r
#ifdef JUCE_MSVC\r
#pragma warning (pop)\r
#endif\r
\r
ID: juce_graphics\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE graphics classes\r
description: Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
website: http://www.juce.com/juce\r
#define JUCE_USE_DIRECTWRITE 1\r
#endif\r
\r
-/** Config: JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
-\r
- Setting this flag will turn off CoreGraphics font smoothing, which some people\r
- find makes the text too 'fat' for their taste.\r
-*/\r
-#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- #define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0\r
-#endif\r
-\r
#ifndef JUCE_INCLUDE_PNGLIB_CODE\r
#define JUCE_INCLUDE_PNGLIB_CODE 1\r
#endif\r
{\r
const ScopedLock sl (lock);\r
\r
- if (auto g = findExistingGlyph (font, glyphNumber))\r
+ if (auto* g = findExistingGlyph (font, glyphNumber))\r
{\r
++hits;\r
return g;\r
}\r
\r
++misses;\r
- auto g = getGlyphForReuse();\r
+ auto* g = getGlyphForReuse();\r
jassert (g != nullptr);\r
g->generate (font, glyphNumber);\r
return g;\r
}\r
\r
private:\r
+ friend struct ContainerDeletePolicy<CachedGlyphType>;\r
ReferenceCountedArray<CachedGlyphType> glyphs;\r
Atomic<int> accessCounter, hits, misses;\r
CriticalSection lock;\r
\r
- ReferenceCountedObjectPtr<CachedGlyphType> findExistingGlyph (const Font& font, int glyphNumber) const noexcept\r
+ CachedGlyphType* findExistingGlyph (const Font& font, int glyphNumber) const noexcept\r
{\r
- for (auto g : glyphs)\r
+ for (auto* g : glyphs)\r
if (g->glyph == glyphNumber && g->font == font)\r
- return *g;\r
+ return g;\r
\r
- return {};\r
+ return nullptr;\r
}\r
\r
- ReferenceCountedObjectPtr<CachedGlyphType> getGlyphForReuse()\r
+ CachedGlyphType* getGlyphForReuse()\r
{\r
if (hits.get() + misses.get() > glyphs.size() * 16)\r
{\r
misses = 0;\r
}\r
\r
- if (auto g = findLeastRecentlyUsedGlyph())\r
- return *g;\r
+ if (auto* g = findLeastRecentlyUsedGlyph())\r
+ return g;\r
\r
addNewGlyphSlots (32);\r
return glyphs.getLast();\r
SolidColour (const Image::BitmapData& image, PixelARGB colour)\r
: destData (image), sourceColour (colour)\r
{\r
- if (sizeof (PixelType) == 3 && (size_t) destData.pixelStride == sizeof (PixelType))\r
+ if (sizeof (PixelType) == 3 && destData.pixelStride == sizeof (PixelType))\r
{\r
areRGBComponentsEqual = sourceColour.getRed() == sourceColour.getGreen()\r
&& sourceColour.getGreen() == sourceColour.getBlue();\r
\r
forcedinline void replaceLine (PixelRGB* dest, PixelARGB colour, int width) const noexcept\r
{\r
- if ((size_t) destData.pixelStride == sizeof (*dest))\r
+ if (destData.pixelStride == sizeof (*dest))\r
{\r
if (areRGBComponentsEqual) // if all the component values are the same, we can cheat..\r
{\r
- memset ((void*) dest, colour.getRed(), (size_t) width * 3);\r
+ memset (dest, colour.getRed(), (size_t) width * 3);\r
}\r
else\r
{\r
\r
forcedinline void replaceLine (PixelAlpha* dest, const PixelARGB colour, int width) const noexcept\r
{\r
- if ((size_t) destData.pixelStride == sizeof (*dest))\r
- memset ((void*) dest, colour.getAlpha(), (size_t) width);\r
+ if (destData.pixelStride == sizeof (*dest))\r
+ memset (dest, colour.getAlpha(), (size_t) width);\r
else\r
JUCE_PERFORM_PIXEL_OP_LOOP (setAlpha (colour.getAlpha()))\r
}\r
&& srcData.pixelFormat == Image::RGB\r
&& destData.pixelFormat == Image::RGB)\r
{\r
- memcpy ((void*) dest, src, (size_t) (width * srcStride));\r
+ memcpy (dest, src, (size_t) (width * srcStride));\r
}\r
else\r
{\r
\r
using Ptr = typename Base::Ptr;\r
\r
- Ptr clone() const override { return *new EdgeTableRegion (*this); }\r
+ Ptr clone() const override { return new EdgeTableRegion (*this); }\r
Ptr applyClipTo (const Ptr& target) const override { return target->clipToEdgeTable (edgeTable); }\r
\r
Ptr clipToRectangle (Rectangle<int> r) override\r
{\r
edgeTable.clipToRectangle (r);\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToRectangleList (const RectangleList<int>& r) override\r
for (auto& i : inverse)\r
edgeTable.excludeRectangle (i);\r
\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr excludeClipRectangle (Rectangle<int> r) override\r
{\r
edgeTable.excludeRectangle (r);\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToPath (const Path& p, const AffineTransform& transform) override\r
{\r
EdgeTable et (edgeTable.getMaximumBounds(), p, transform);\r
edgeTable.clipToEdgeTable (et);\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToEdgeTable (const EdgeTable& et) override\r
{\r
edgeTable.clipToEdgeTable (et);\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToImageAlpha (const Image& image, const AffineTransform& transform, Graphics::ResamplingQuality quality) override\r
auto imageY = ((ty + 128) >> 8);\r
\r
if (image.getFormat() == Image::ARGB)\r
- straightClipImage (srcData, imageX, imageY, (PixelARGB*) nullptr);\r
+ straightClipImage (srcData, imageX, imageY, (PixelARGB*) 0);\r
else\r
- straightClipImage (srcData, imageX, imageY, (PixelAlpha*) nullptr);\r
+ straightClipImage (srcData, imageX, imageY, (PixelAlpha*) 0);\r
\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
}\r
\r
if (! edgeTable.isEmpty())\r
{\r
if (image.getFormat() == Image::ARGB)\r
- transformedClipImage (srcData, transform, quality, (PixelARGB*) nullptr);\r
+ transformedClipImage (srcData, transform, quality, (PixelARGB*) 0);\r
else\r
- transformedClipImage (srcData, transform, quality, (PixelAlpha*) nullptr);\r
+ transformedClipImage (srcData, transform, quality, (PixelAlpha*) 0);\r
}\r
\r
- return edgeTable.isEmpty() ? Ptr() : Ptr (*this);\r
+ return edgeTable.isEmpty() ? nullptr : this;\r
}\r
\r
void translate (Point<int> delta) override\r
\r
using Ptr = typename Base::Ptr;\r
\r
- Ptr clone() const override { return *new RectangleListRegion (*this); }\r
+ Ptr clone() const override { return new RectangleListRegion (*this); }\r
Ptr applyClipTo (const Ptr& target) const override { return target->clipToRectangleList (clip); }\r
\r
Ptr clipToRectangle (Rectangle<int> r) override\r
{\r
clip.clipTo (r);\r
- return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+ return clip.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToRectangleList (const RectangleList<int>& r) override\r
{\r
clip.clipTo (r);\r
- return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+ return clip.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr excludeClipRectangle (Rectangle<int> r) override\r
{\r
clip.subtract (r);\r
- return clip.isEmpty() ? Ptr() : Ptr (*this);\r
+ return clip.isEmpty() ? nullptr : this;\r
}\r
\r
Ptr clipToPath (const Path& p, const AffineTransform& transform) override { return toEdgeTable()->clipToPath (p, transform); }\r
JUCE_DECLARE_NON_COPYABLE (SubRectangleIteratorFloat)\r
};\r
\r
- Ptr toEdgeTable() const { return *new EdgeTableRegion (clip); }\r
+ Ptr toEdgeTable() const { return new EdgeTableRegion (clip); }\r
\r
RectangleListRegion& operator= (const RectangleListRegion&);\r
};\r
auto clipped = clip->getClipBounds().getIntersection (r);\r
\r
if (! clipped.isEmpty())\r
- fillShape (*new RectangleListRegionType (clipped), false);\r
+ fillShape (new RectangleListRegionType (clipped), false);\r
}\r
}\r
\r
auto clipped = clip->getClipBounds().toFloat().getIntersection (r);\r
\r
if (! clipped.isEmpty())\r
- fillShape (*new EdgeTableRegionType (clipped), false);\r
+ fillShape (new EdgeTableRegionType (clipped), false);\r
}\r
}\r
\r
\r
if (transform.isIdentity())\r
{\r
- fillShape (*new EdgeTableRegionType (list), false);\r
+ fillShape (new EdgeTableRegionType (list), false);\r
}\r
else if (! transform.isRotated)\r
{\r
else\r
transformed.transformAll (transform.getTransform());\r
\r
- fillShape (*new EdgeTableRegionType (transformed), false);\r
+ fillShape (new EdgeTableRegionType (transformed), false);\r
}\r
else\r
{\r
auto clipRect = clip->getClipBounds();\r
\r
if (path.getBoundsTransformed (trans).getSmallestIntegerContainer().intersects (clipRect))\r
- fillShape (*new EdgeTableRegionType (clipRect, path, trans), false);\r
+ fillShape (new EdgeTableRegionType (clipRect, path, trans), false);\r
}\r
}\r
\r
edgeTableClip->edgeTable.multiplyLevels (1.0f + 1.6f * brightness);\r
}\r
\r
- fillShape (*edgeTableClip, false);\r
+ fillShape (edgeTableClip, false);\r
}\r
}\r
\r
void drawImage (const Image& sourceImage, const AffineTransform& trans)\r
{\r
if (clip != nullptr && ! fillType.colour.isTransparent())\r
- renderImage (sourceImage, trans, {});\r
+ renderImage (sourceImage, trans, nullptr);\r
}\r
\r
- static bool isOnlyTranslationAllowingError (const AffineTransform& t, float tolerance) noexcept\r
+ static bool isOnlyTranslationAllowingError (const AffineTransform& t, float tolerence) noexcept\r
{\r
- return std::abs (t.mat01) < tolerance\r
- && std::abs (t.mat10) < tolerance\r
- && std::abs (t.mat00 - 1.0f) < tolerance\r
- && std::abs (t.mat11 - 1.0f) < tolerance;\r
+ return std::abs (t.mat01) < tolerence\r
+ && std::abs (t.mat10) < tolerence\r
+ && std::abs (t.mat00 - 1.0f) < tolerence\r
+ && std::abs (t.mat11 - 1.0f) < tolerence;\r
}\r
\r
void renderImage (const Image& sourceImage, const AffineTransform& trans, const BaseRegionType* tiledFillClipRegion)\r
area = area.getIntersection (getThis().getMaximumBounds());\r
\r
if (! area.isEmpty())\r
- if (auto c = clip->applyClipTo (*new EdgeTableRegionType (area)))\r
+ if (auto c = clip->applyClipTo (new EdgeTableRegionType (area)))\r
c->renderImageUntransformed (getThis(), sourceImage, alpha, tx, ty, false);\r
}\r
\r
}\r
else if (fillType.isTiledImage())\r
{\r
- renderImage (fillType.image, fillType.transform, shapeToFill.get());\r
+ renderImage (fillType.image, fillType.transform, shapeToFill);\r
}\r
else\r
{\r
std::unique_ptr<EdgeTable> et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight));\r
\r
if (et != nullptr)\r
- fillShape (*new EdgeTableRegionType (*et), false);\r
+ fillShape (new EdgeTableRegionType (*et), false);\r
}\r
}\r
}\r
\r
switch (destData.pixelFormat)\r
{\r
- case Image::ARGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) nullptr); break;\r
- case Image::RGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) nullptr); break;\r
- default: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) nullptr); break;\r
+ case Image::ARGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) 0); break;\r
+ case Image::RGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) 0); break;\r
+ default: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) 0); break;\r
}\r
}\r
\r
\r
switch (destData.pixelFormat)\r
{\r
- case Image::ARGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) nullptr); break;\r
- case Image::RGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) nullptr); break;\r
- default: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) nullptr); break;\r
+ case Image::ARGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) 0); break;\r
+ case Image::RGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) 0); break;\r
+ default: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) 0); break;\r
}\r
}\r
\r
STATICMETHOD (create, "create", "(Ljava/lang/String;I)Landroid/graphics/Typeface;") \\r
STATICMETHOD (createFromFile, "createFromFile", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \\r
\r
-DECLARE_JNI_CLASS (TypefaceClass, "android/graphics/Typeface")\r
+DECLARE_JNI_CLASS (TypefaceClass, "android/graphics/Typeface");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
float getStringWidth (const String& text) override\r
{\r
JNIEnv* env = getEnv();\r
- auto numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
- jfloatArray widths = env->NewFloatArray ((int) numChars);\r
+ const int numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
+ jfloatArray widths = env->NewFloatArray (numChars);\r
\r
const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);\r
\r
env->DeleteLocalRef (widths);\r
\r
float x = 0;\r
-\r
for (int i = 0; i < numDone; ++i)\r
x += localWidths[i];\r
\r
void getGlyphPositions (const String& text, Array<int>& glyphs, Array<float>& xOffsets) override\r
{\r
JNIEnv* env = getEnv();\r
- auto numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
- jfloatArray widths = env->NewFloatArray ((int) numChars);\r
+ const int numChars = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
+ jfloatArray widths = env->NewFloatArray (numChars);\r
\r
const int numDone = paint.callIntMethod (AndroidPaint.getTextWidths, javaString (text).get(), widths);\r
\r
auto s = text.getCharPointer();\r
\r
xOffsets.add (0);\r
- float x = 0;\r
\r
+ float x = 0;\r
for (int i = 0; i < numDone; ++i)\r
{\r
const float local = localWidths[i];\r
return getEnv()->NewObject (AndroidPaint, AndroidPaint.constructor, constructorFlags);\r
}\r
\r
- //\r
const jobject createMatrix (JNIEnv* env, const AffineTransform& t)\r
{\r
jobject m = env->NewObject (AndroidMatrix, AndroidMatrix.constructor);\r
namespace juce\r
{\r
\r
-struct FTLibWrapper : public ReferenceCountedObject\r
+struct FTLibWrapper : public ReferenceCountedObject\r
{\r
- FTLibWrapper()\r
+ FTLibWrapper() : library (0)\r
{\r
if (FT_Init_FreeType (&library) != 0)\r
{\r
- library = {};\r
+ library = 0;\r
DBG ("Failed to initialize FreeType");\r
}\r
}\r
FT_Done_FreeType (library);\r
}\r
\r
- FT_Library library = {};\r
+ FT_Library library;\r
\r
using Ptr = ReferenceCountedObjectPtr<FTLibWrapper>;\r
\r
struct FTFaceWrapper : public ReferenceCountedObject\r
{\r
FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const File& file, int faceIndex)\r
- : library (ftLib)\r
+ : face (0), library (ftLib)\r
{\r
if (FT_New_Face (ftLib->library, file.getFullPathName().toUTF8(), faceIndex, &face) != 0)\r
- face = {};\r
+ face = 0;\r
}\r
\r
FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const void* data, size_t dataSize, int faceIndex)\r
- : library (ftLib), savedFaceData (data, dataSize)\r
+ : face (0), library (ftLib), savedFaceData (data, dataSize)\r
{\r
if (FT_New_Memory_Face (ftLib->library, (const FT_Byte*) savedFaceData.getData(),\r
(FT_Long) savedFaceData.getSize(), faceIndex, &face) != 0)\r
- face = {};\r
+ face = 0;\r
}\r
\r
~FTFaceWrapper()\r
FT_Done_Face (face);\r
}\r
\r
- FT_Face face = {};\r
+ FT_Face face;\r
FTLibWrapper::Ptr library;\r
MemoryBlock savedFaceData;\r
\r
//==============================================================================\r
struct KnownTypeface\r
{\r
- KnownTypeface (const File& f, int index, const FTFaceWrapper& face)\r
+ KnownTypeface (const File& f, const int index, const FTFaceWrapper& face)\r
: file (f),\r
family (face.face->family_name),\r
style (face.face->style_name),\r
\r
FTFaceWrapper::Ptr createFace (const String& fontName, const String& fontStyle)\r
{\r
- auto ftFace = matchTypeface (fontName, fontStyle);\r
+ const KnownTypeface* ftFace = matchTypeface (fontName, fontStyle);\r
\r
if (ftFace == nullptr) ftFace = matchTypeface (fontName, "Regular");\r
- if (ftFace == nullptr) ftFace = matchTypeface (fontName, {});\r
+ if (ftFace == nullptr) ftFace = matchTypeface (fontName, String());\r
\r
if (ftFace != nullptr)\r
return createFace (ftFace->file, ftFace->faceIndex);\r
{\r
StringArray s;\r
\r
- for (auto* face : faces)\r
- s.addIfNotAlreadyThere (face->family);\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ s.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
\r
return s;\r
}\r
{\r
int i = styles.indexOf ("Regular", true);\r
\r
- if (i >= 0)\r
- return i;\r
+ if (i < 0)\r
+ for (i = 0; i < styles.size(); ++i)\r
+ if (! (styles[i].containsIgnoreCase ("Bold") || styles[i].containsIgnoreCase ("Italic")))\r
+ break;\r
\r
- for (i = 0; i < styles.size(); ++i)\r
- if (! (styles[i].containsIgnoreCase ("Bold") || styles[i].containsIgnoreCase ("Italic")))\r
- return i;\r
-\r
- return -1;\r
+ return i;\r
}\r
\r
StringArray findAllTypefaceStyles (const String& family) const\r
{\r
StringArray s;\r
\r
- for (auto* face : faces)\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ {\r
+ const KnownTypeface* const face = faces.getUnchecked(i);\r
+\r
if (face->family == family)\r
s.addIfNotAlreadyThere (face->style);\r
+ }\r
\r
// try to get a regular style to be first in the list\r
- auto regular = indexOfRegularStyle (s);\r
-\r
+ const int regular = indexOfRegularStyle (s);\r
if (regular > 0)\r
s.strings.swap (0, regular);\r
\r
\r
void scanFontPaths (const StringArray& paths)\r
{\r
- for (auto& path : paths)\r
+ for (int i = 0; i < paths.size(); ++i)\r
{\r
- DirectoryIterator iter (File::getCurrentWorkingDirectory().getChildFile (path), true);\r
+ DirectoryIterator iter (File::getCurrentWorkingDirectory()\r
+ .getChildFile (paths[i]), true);\r
\r
while (iter.next())\r
if (iter.getFile().hasFileExtension ("ttf;pfb;pcf;otf"))\r
\r
void getMonospacedNames (StringArray& monoSpaced) const\r
{\r
- for (auto* face : faces)\r
- if (face->isMonospaced)\r
- monoSpaced.addIfNotAlreadyThere (face->family);\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ if (faces.getUnchecked(i)->isMonospaced)\r
+ monoSpaced.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
}\r
\r
void getSerifNames (StringArray& serif) const\r
{\r
- for (auto* face : faces)\r
- if (! (face->isSansSerif || face->isMonospaced))\r
- serif.addIfNotAlreadyThere (face->family);\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ if (! faces.getUnchecked(i)->isSansSerif)\r
+ serif.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
}\r
\r
void getSansSerifNames (StringArray& sansSerif) const\r
{\r
- for (auto* face : faces)\r
- if (face->isSansSerif)\r
- sansSerif.addIfNotAlreadyThere (face->family);\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ if (faces.getUnchecked(i)->isSansSerif)\r
+ sansSerif.addIfNotAlreadyThere (faces.getUnchecked(i)->family);\r
}\r
\r
JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL (FTTypefaceList)\r
\r
const KnownTypeface* matchTypeface (const String& familyName, const String& style) const noexcept\r
{\r
- for (auto* face : faces)\r
+ for (int i = 0; i < faces.size(); ++i)\r
+ {\r
+ const KnownTypeface* const face = faces.getUnchecked(i);\r
+\r
if (face->family == familyName\r
&& (face->style.equalsIgnoreCase (style) || style.isEmpty()))\r
return face;\r
+ }\r
\r
return nullptr;\r
}\r
{\r
static const char* sansNames[] = { "Sans", "Verdana", "Arial", "Ubuntu" };\r
\r
- for (auto* name : sansNames)\r
- if (family.containsIgnoreCase (name))\r
+ for (int i = 0; i < numElementsInArray (sansNames); ++i)\r
+ if (family.containsIgnoreCase (sansNames[i]))\r
return true;\r
\r
return false;\r
{\r
if (faceWrapper != nullptr)\r
{\r
- auto face = faceWrapper->face;\r
- auto glyphIndex = FT_Get_Char_Index (face, (FT_ULong) character);\r
+ FT_Face face = faceWrapper->face;\r
+ const unsigned int glyphIndex = FT_Get_Char_Index (face, (FT_ULong) character);\r
\r
if (FT_Load_Glyph (face, glyphIndex, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM | FT_LOAD_NO_HINTING) == 0\r
&& face->glyph->format == ft_glyph_format_outline)\r
{\r
- auto scale = 1.0f / (float) (face->ascender - face->descender);\r
+ const float scale = 1.0f / (float) (face->ascender - face->descender);\r
Path destShape;\r
\r
if (getGlyphShape (destShape, face->glyph->outline, scale))\r
private:\r
FTFaceWrapper::Ptr faceWrapper;\r
\r
- bool getGlyphShape (Path& destShape, const FT_Outline& outline, float scaleX)\r
+ bool getGlyphShape (Path& destShape, const FT_Outline& outline, const float scaleX)\r
{\r
- auto scaleY = -scaleX;\r
- auto* contours = outline.contours;\r
- auto* tags = outline.tags;\r
- auto* points = outline.points;\r
+ const float scaleY = -scaleX;\r
+ const short* const contours = outline.contours;\r
+ const char* const tags = outline.tags;\r
+ const FT_Vector* const points = outline.points;\r
\r
for (int c = 0; c < outline.n_contours; ++c)\r
{\r
\r
for (int p = startPoint; p <= endPoint; ++p)\r
{\r
- auto x = scaleX * points[p].x;\r
- auto y = scaleY * points[p].y;\r
+ const float x = scaleX * points[p].x;\r
+ const float y = scaleY * points[p].y;\r
\r
if (p == startPoint)\r
{\r
if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic)\r
{\r
- auto x2 = scaleX * points [endPoint].x;\r
- auto y2 = scaleY * points [endPoint].y;\r
+ float x2 = scaleX * points [endPoint].x;\r
+ float y2 = scaleY * points [endPoint].y;\r
\r
if (FT_CURVE_TAG (tags[endPoint]) != FT_Curve_Tag_On)\r
{\r
else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic)\r
{\r
const int nextIndex = (p == endPoint) ? startPoint : p + 1;\r
- auto x2 = scaleX * points [nextIndex].x;\r
- auto y2 = scaleY * points [nextIndex].y;\r
+ float x2 = scaleX * points [nextIndex].x;\r
+ float y2 = scaleY * points [nextIndex].y;\r
\r
if (FT_CURVE_TAG (tags [nextIndex]) == FT_Curve_Tag_Conic)\r
{\r
|| FT_CURVE_TAG (tags[next2]) != FT_Curve_Tag_On)\r
return false;\r
\r
- auto x2 = scaleX * points [next1].x;\r
- auto y2 = scaleY * points [next1].y;\r
- auto x3 = scaleX * points [next2].x;\r
- auto y3 = scaleY * points [next2].y;\r
+ const float x2 = scaleX * points [next1].x;\r
+ const float y2 = scaleY * points [next1].y;\r
+ const float x3 = scaleX * points [next2].x;\r
+ const float y3 = scaleY * points [next2].y;\r
\r
destShape.cubicTo (x, y, x2, y2, x3, y3);\r
p += 2;\r
\r
void addKerning (FT_Face face, const uint32 character, const uint32 glyphIndex)\r
{\r
- auto height = (float) (face->ascender - face->descender);\r
+ const float height = (float) (face->ascender - face->descender);\r
\r
uint32 rightGlyphIndex;\r
- auto rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex);\r
+ FT_ULong rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex);\r
\r
while (rightGlyphIndex != 0)\r
{\r
namespace juce\r
{\r
\r
-static std::unique_ptr<XmlElement> findFontsConfFile()\r
+static XmlElement* findFontsConfFile()\r
{\r
static const char* pathsToSearch[] = { "/etc/fonts/fonts.conf",\r
"/usr/share/fonts/fonts.conf" };\r
\r
for (auto* path : pathsToSearch)\r
- if (auto xml = parseXML (File (path)))\r
+ if (auto* xml = XmlDocument::parse (File (path)))\r
return xml;\r
\r
- return {};\r
+ return nullptr;\r
}\r
\r
StringArray FTTypefaceList::getDefaultFontDirectories()\r
\r
if (fontDirs.isEmpty())\r
{\r
- if (auto fontsInfo = findFontsConfFile())\r
+ std::unique_ptr<XmlElement> fontsInfo (findFontsConfFile());\r
+\r
+ if (fontsInfo != nullptr)\r
{\r
forEachXmlChildElementWithTagName (*fontsInfo, e, "dir")\r
{\r
float targetScale;\r
CGColorSpaceRef rgbColourSpace, greyColourSpace;\r
mutable Rectangle<int> lastClipRect;\r
- mutable bool lastClipRectIsValid = false;\r
+ mutable bool lastClipRectIsValid;\r
\r
struct SavedState\r
{\r
\r
FillType fillType;\r
Font font;\r
- CGFontRef fontRef = {};\r
+ CGFontRef fontRef;\r
CGAffineTransform fontTransform;\r
- CGGradientRef gradient = {};\r
+ CGGradientRef gradient;\r
};\r
\r
std::unique_ptr<SavedState> state;\r
namespace juce\r
{\r
\r
-#if (JUCE_IOS && defined (__IPHONE_12_0))\r
- #define JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION 1\r
-#endif\r
-\r
-#if JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION\r
-class CoreGraphicsImageGarbageCollector : public Timer,\r
- public DeletedAtShutdown\r
-{\r
-public:\r
- CoreGraphicsImageGarbageCollector()\r
- {\r
- // TODO: Add an assertion here telling JUCE developers to move to the\r
- // latest SDK if/when the CoreGraphics memory handling is fixed.\r
- }\r
-\r
- ~CoreGraphicsImageGarbageCollector()\r
- {\r
- clearSingletonInstance();\r
- }\r
-\r
- JUCE_DECLARE_SINGLETON (CoreGraphicsImageGarbageCollector, false)\r
-\r
- void addItem (HeapBlock<uint8>&& data)\r
- {\r
- ScopedLock lock (queueLock);\r
-\r
- queue.emplace_back (Time::getApproximateMillisecondCounter(), std::move (data));\r
-\r
- if (! isTimerRunning())\r
- startTimer (timeDelta);\r
- }\r
-\r
- void timerCallback() override\r
- {\r
- ScopedLock lock (queueLock);\r
-\r
- auto cutoffTime = Time::getApproximateMillisecondCounter() - timeDelta;\r
-\r
- auto it = std::find_if (queue.begin(), queue.end(),\r
- [cutoffTime](const std::pair<uint32, HeapBlock<uint8>>& x) { return x.first > cutoffTime; });\r
- queue.erase (queue.begin(), it);\r
-\r
- queue.empty() ? stopTimer() : startTimer (timeDelta);\r
- }\r
-\r
-private:\r
- CriticalSection queueLock;\r
- std::vector<std::pair<uint32, HeapBlock<uint8>>> queue;\r
- static constexpr uint32 timeDelta = 50;\r
-};\r
-\r
-JUCE_IMPLEMENT_SINGLETON (CoreGraphicsImageGarbageCollector)\r
-#endif\r
-\r
-//==============================================================================\r
class CoreGraphicsImage : public ImagePixelData\r
{\r
public:\r
- CoreGraphicsImage (const Image::PixelFormat format, int w, int h, bool clearImage)\r
- : ImagePixelData (format, w, h)\r
+ CoreGraphicsImage (const Image::PixelFormat format, const int w, const int h, const bool clearImage)\r
+ : ImagePixelData (format, w, h), cachedImageRef (0)\r
{\r
pixelStride = format == Image::RGB ? 3 : ((format == Image::ARGB) ? 4 : 1);\r
lineStride = (pixelStride * jmax (1, width) + 3) & ~3;\r
\r
- auto numComponents = (size_t) lineStride * (size_t) jmax (1, height);\r
-\r
- # if JUCE_MAC && defined (__MAC_10_14)\r
- // This version of the SDK intermittently requires a bit of extra space\r
- // at the end of the image data. This feels like something has gone\r
- // wrong in Apple's code.\r
- numComponents += (size_t) lineStride;\r
- #endif\r
-\r
- imageData.allocate (numComponents, clearImage);\r
+ imageData.allocate ((size_t) lineStride * (size_t) jmax (1, height), clearImage);\r
\r
CGColorSpaceRef colourSpace = (format == Image::SingleChannel) ? CGColorSpaceCreateDeviceGray()\r
: CGColorSpaceCreateDeviceRGB();\r
{\r
freeCachedImageRef();\r
CGContextRelease (context);\r
-\r
- #if JUCE_CORE_GRAPHICS_NEEDS_DELAYED_GARBAGE_COLLECTION\r
- CoreGraphicsImageGarbageCollector::getInstance()->addItem (std::move (imageData));\r
- #endif\r
}\r
\r
LowLevelGraphicsContext* createLowLevelContext() override\r
\r
ImagePixelData::Ptr clone() override\r
{\r
- auto im = new CoreGraphicsImage (pixelFormat, width, height, false);\r
+ CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false);\r
memcpy (im->imageData, imageData, (size_t) (lineStride * height));\r
- return *im;\r
+ return im;\r
}\r
\r
ImageType* createType() const override { return new NativeImageType(); }\r
//==============================================================================\r
static CGImageRef getCachedImageRef (const Image& juceImage, CGColorSpaceRef colourSpace)\r
{\r
- auto cgim = dynamic_cast<CoreGraphicsImage*> (juceImage.getPixelData());\r
+ CoreGraphicsImage* const cgim = dynamic_cast<CoreGraphicsImage*> (juceImage.getPixelData());\r
\r
- if (cgim != nullptr && cgim->cachedImageRef != nullptr)\r
+ if (cgim != nullptr && cgim->cachedImageRef != 0)\r
{\r
CGImageRetain (cgim->cachedImageRef);\r
return cgim->cachedImageRef;\r
return ref;\r
}\r
\r
- static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace, bool mustOutliveSource)\r
+ static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace, const bool mustOutliveSource)\r
{\r
const Image::BitmapData srcData (juceImage, Image::BitmapData::readOnly);\r
CGDataProviderRef provider;\r
\r
if (mustOutliveSource)\r
{\r
- CFDataRef data = CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height));\r
+ CFDataRef data = CFDataCreate (0, (const UInt8*) srcData.data, (CFIndex) ((size_t) srcData.lineStride * (size_t) srcData.height));\r
provider = CGDataProviderCreateWithCFData (data);\r
CFRelease (data);\r
}\r
else\r
{\r
- provider = CGDataProviderCreateWithData (nullptr, srcData.data, (size_t) srcData.lineStride * (size_t) srcData.height, nullptr);\r
+ provider = CGDataProviderCreateWithData (0, srcData.data, (size_t) srcData.lineStride * (size_t) srcData.height, 0);\r
}\r
\r
CGImageRef imageRef = CGImageCreate ((size_t) srcData.width,\r
(size_t) srcData.height,\r
- 8,\r
- (size_t) srcData.pixelStride * 8,\r
+ 8, (size_t) srcData.pixelStride * 8,\r
(size_t) srcData.lineStride,\r
colourSpace, getCGImageFlags (juceImage.getFormat()), provider,\r
- nullptr, true, kCGRenderingIntentDefault);\r
+ 0, true, kCGRenderingIntentDefault);\r
\r
CGDataProviderRelease (provider);\r
return imageRef;\r
\r
//==============================================================================\r
CGContextRef context;\r
- CGImageRef cachedImageRef = {};\r
+ CGImageRef cachedImageRef;\r
HeapBlock<uint8> imageData;\r
int pixelStride, lineStride;\r
\r
private:\r
void freeCachedImageRef()\r
{\r
- if (cachedImageRef != CGImageRef())\r
+ if (cachedImageRef != 0)\r
{\r
CGImageRelease (cachedImageRef);\r
- cachedImageRef = {};\r
+ cachedImageRef = 0;\r
}\r
}\r
\r
\r
ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const\r
{\r
- return *new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage);\r
+ return new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage);\r
}\r
\r
//==============================================================================\r
-CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, float h, float scale)\r
+CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, const float h, const float scale)\r
: context (c),\r
flipHeight (h),\r
targetScale (scale),\r
+ lastClipRectIsValid (false),\r
state (new SavedState())\r
{\r
CGContextRetain (context);\r
CGContextSaveGState (context);\r
-\r
- bool enableFontSmoothing\r
- #if JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING\r
- = false;\r
- #else\r
- = true;\r
- #endif\r
-\r
- CGContextSetShouldSmoothFonts (context, enableFontSmoothing);\r
- CGContextSetAllowsFontSmoothing (context, enableFontSmoothing);\r
+ CGContextSetShouldSmoothFonts (context, true);\r
+ CGContextSetAllowsFontSmoothing (context, true);\r
CGContextSetShouldAntialias (context, true);\r
CGContextSetBlendMode (context, kCGBlendModeNormal);\r
rgbColourSpace = CGColorSpaceCreateDeviceRGB();\r
\r
float CoreGraphicsContext::getPhysicalPixelScaleFactor()\r
{\r
- auto t = CGContextGetCTM (context);\r
+ const CGAffineTransform t = CGContextGetCTM (context);\r
\r
return targetScale * (float) (juce_hypot (t.a, t.c) + juce_hypot (t.b, t.d)) / 2.0f;\r
}\r
\r
bool CoreGraphicsContext::clipToRectangle (const Rectangle<int>& r)\r
{\r
- CGContextClipToRect (context, CGRectMake (r.getX(), flipHeight - r.getBottom(),\r
- r.getWidth(), r.getHeight()));\r
+ CGContextClipToRect (context, CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()));\r
\r
if (lastClipRectIsValid)\r
{\r
CGImageRef image = CoreGraphicsImage::createImage (singleChannelImage, greyColourSpace, true);\r
\r
flip();\r
- auto t = AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform);\r
+ AffineTransform t (AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform));\r
applyTransform (t);\r
\r
- auto r = convertToCGRect (sourceImage.getBounds());\r
+ CGRect r = convertToCGRect (sourceImage.getBounds());\r
CGContextClipToMask (context, r, image);\r
\r
applyTransform (t.inverted());\r
{\r
if (! lastClipRectIsValid)\r
{\r
- auto bounds = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
+ CGRect bounds = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
\r
lastClipRectIsValid = true;\r
lastClipRect.setBounds (roundToInt (bounds.origin.x),\r
{\r
saveState();\r
CGContextSetAlpha (context, opacity);\r
- CGContextBeginTransparencyLayer (context, nullptr);\r
+ CGContextBeginTransparencyLayer (context, 0);\r
}\r
\r
void CoreGraphicsContext::endTransparencyLayer()\r
}\r
\r
//==============================================================================\r
-void CoreGraphicsContext::fillRect (const Rectangle<int>& r, bool replaceExistingContents)\r
+void CoreGraphicsContext::fillRect (const Rectangle<int>& r, const bool replaceExistingContents)\r
{\r
fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), replaceExistingContents);\r
}\r
fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), false);\r
}\r
\r
-void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, bool replaceExistingContents)\r
+void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, const bool replaceExistingContents)\r
{\r
if (replaceExistingContents)\r
{\r
drawImage (sourceImage, transform, false);\r
}\r
\r
-void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform, bool fillEntireClipAsTiles)\r
+void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform, const bool fillEntireClipAsTiles)\r
{\r
- auto iw = sourceImage.getWidth();\r
- auto ih = sourceImage.getHeight();\r
-\r
- auto colourSpace = sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace\r
- : rgbColourSpace;\r
- CGImageRef image = CoreGraphicsImage::getCachedImageRef (sourceImage, colourSpace);\r
+ const int iw = sourceImage.getWidth();\r
+ const int ih = sourceImage.getHeight();\r
+ CGImageRef image = CoreGraphicsImage::getCachedImageRef (sourceImage, sourceImage.getFormat() == Image::PixelFormat::SingleChannel ? greyColourSpace\r
+ : rgbColourSpace);\r
\r
CGContextSaveGState (context);\r
CGContextSetAlpha (context, state->fillType.getOpacity());\r
\r
flip();\r
applyTransform (AffineTransform::verticalFlip (ih).followedBy (transform));\r
- auto imageRect = CGRectMake (0, 0, iw, ih);\r
+ CGRect imageRect = CGRectMake (0, 0, iw, ih);\r
\r
if (fillEntireClipAsTiles)\r
{\r
#else\r
// There's a bug in CGContextDrawTiledImage that makes it incredibly slow\r
// if it's doing a transformation - it's quicker to just draw lots of images manually\r
- if (&CGContextDrawTiledImage != nullptr && transform.isOnlyTranslation())\r
+ if (&CGContextDrawTiledImage != 0 && transform.isOnlyTranslation())\r
{\r
CGContextDrawTiledImage (context, imageRect, image);\r
}\r
else\r
{\r
// Fallback to manually doing a tiled fill\r
- auto clip = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
+ CGRect clip = CGRectIntegral (CGContextGetClipBoundingBox (context));\r
\r
int x = 0, y = 0;\r
while (x > clip.origin.x) x -= iw;\r
while (y > clip.origin.y) y -= ih;\r
\r
- auto right = (int) (clip.origin.x + clip.size.width);\r
- auto bottom = (int) (clip.origin.y + clip.size.height);\r
+ const int right = (int) (clip.origin.x + clip.size.width);\r
+ const int bottom = (int) (clip.origin.y + clip.size.height);\r
\r
while (y < bottom)\r
{\r
//==============================================================================\r
void CoreGraphicsContext::drawLine (const Line<float>& line)\r
{\r
- Path p;\r
- p.addLineSegment (line, 1.0f);\r
- fillPath (p, {});\r
+ if (state->fillType.isColour())\r
+ {\r
+ CGContextSetLineCap (context, kCGLineCapSquare);\r
+ CGContextSetLineWidth (context, 1.0f);\r
+ CGContextSetRGBStrokeColor (context,\r
+ state->fillType.colour.getFloatRed(), state->fillType.colour.getFloatGreen(),\r
+ state->fillType.colour.getFloatBlue(), state->fillType.colour.getFloatAlpha());\r
+\r
+ CGPoint cgLine[] = { { (CGFloat) line.getStartX(), flipHeight - (CGFloat) line.getStartY() },\r
+ { (CGFloat) line.getEndX(), flipHeight - (CGFloat) line.getEndY() } };\r
+\r
+ CGContextStrokeLineSegments (context, cgLine, 1);\r
+ }\r
+ else\r
+ {\r
+ Path p;\r
+ p.addLineSegment (line, 1.0f);\r
+ fillPath (p, AffineTransform());\r
+ }\r
}\r
\r
void CoreGraphicsContext::fillRectList (const RectangleList<float>& list)\r
{\r
if (state->font != newFont)\r
{\r
- state->fontRef = nullptr;\r
+ state->fontRef = 0;\r
state->font = newFont;\r
\r
- if (auto osxTypeface = dynamic_cast<OSXTypeface*> (state->font.getTypeface()))\r
+ if (OSXTypeface* osxTypeface = dynamic_cast<OSXTypeface*> (state->font.getTypeface()))\r
{\r
state->fontRef = osxTypeface->fontRef;\r
CGContextSetFont (context, state->fontRef);\r
\r
void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& transform)\r
{\r
- if (state->fontRef != nullptr && state->fillType.isColour())\r
+ if (state->fontRef != 0 && state->fillType.isColour())\r
{\r
#if JUCE_CLANG\r
#pragma clang diagnostic push\r
{\r
CGContextSetTextMatrix (context, state->fontTransform); // have to set this each time, as it's not saved as part of the state\r
\r
- auto g = (CGGlyph) glyphNumber;\r
+ CGGlyph g = (CGGlyph) glyphNumber;\r
CGContextShowGlyphsAtPoint (context, transform.getTranslationX(),\r
flipHeight - roundToInt (transform.getTranslationY()), &g, 1);\r
}\r
flip();\r
applyTransform (transform);\r
\r
- auto t = state->fontTransform;\r
+ CGAffineTransform t = state->fontTransform;\r
t.d = -t.d;\r
CGContextSetTextMatrix (context, t);\r
\r
- auto g = (CGGlyph) glyphNumber;\r
+ CGGlyph g = (CGGlyph) glyphNumber;\r
CGContextShowGlyphsAtPoint (context, 0, 0, &g, 1);\r
\r
CGContextRestoreGState (context);\r
else\r
{\r
Path p;\r
- auto& f = state->font;\r
+ Font& f = state->font;\r
f.getTypeface()->getOutlineForGlyph (glyphNumber, p);\r
\r
fillPath (p, AffineTransform::scale (f.getHeight() * f.getHorizontalScale(), f.getHeight())\r
}\r
\r
CoreGraphicsContext::SavedState::SavedState()\r
- : font (1.0f), fontTransform (CGAffineTransformIdentity)\r
+ : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), gradient (0)\r
{\r
}\r
\r
: fillType (other.fillType), font (other.font), fontRef (other.fontRef),\r
fontTransform (other.fontTransform), gradient (other.gradient)\r
{\r
- if (gradient != nullptr)\r
+ if (gradient != 0)\r
CGGradientRetain (gradient);\r
}\r
\r
CoreGraphicsContext::SavedState::~SavedState()\r
{\r
- if (gradient != nullptr)\r
+ if (gradient != 0)\r
CGGradientRelease (gradient);\r
}\r
\r
{\r
fillType = newFill;\r
\r
- if (gradient != nullptr)\r
+ if (gradient != 0)\r
{\r
CGGradientRelease (gradient);\r
- gradient = nullptr;\r
+ gradient = 0;\r
}\r
}\r
\r
static CGGradientRef createGradient (const ColourGradient& g, CGColorSpaceRef colourSpace)\r
{\r
- auto numColours = g.getNumColours();\r
- auto data = (CGFloat*) alloca ((size_t) numColours * 5 * sizeof (CGFloat));\r
- auto locations = data;\r
- auto components = data + numColours;\r
- auto comps = components;\r
+ const int numColours = g.getNumColours();\r
+ CGFloat* const data = (CGFloat*) alloca ((size_t) numColours * 5 * sizeof (CGFloat));\r
+ CGFloat* const locations = data;\r
+ CGFloat* const components = data + numColours;\r
+ CGFloat* comps = components;\r
\r
for (int i = 0; i < numColours; ++i)\r
{\r
- auto colour = g.getColour (i);\r
+ const Colour colour (g.getColour (i));\r
*comps++ = (CGFloat) colour.getFloatRed();\r
*comps++ = (CGFloat) colour.getFloatGreen();\r
*comps++ = (CGFloat) colour.getFloatBlue();\r
applyTransform (state->fillType.transform);\r
CGContextSetAlpha (context, state->fillType.getOpacity());\r
\r
- auto& g = *state->fillType.gradient;\r
+ const ColourGradient& g = *state->fillType.gradient;\r
\r
- auto p1 = convertToCGPoint (g.point1);\r
- auto p2 = convertToCGPoint (g.point2);\r
+ CGPoint p1 (convertToCGPoint (g.point1));\r
+ CGPoint p2 (convertToCGPoint (g.point2));\r
\r
state->fillType.transform.transformPoints (p1.x, p1.y, p2.x, p2.y);\r
\r
- if (state->gradient == nullptr)\r
+ if (state->gradient == 0)\r
state->gradient = createGradient (g, rgbColourSpace);\r
\r
if (g.isRadial)\r
CGImageRef loadedImage = uiImage.CGImage;\r
\r
#else\r
- auto provider = CGDataProviderCreateWithData (nullptr, data.getData(), data.getSize(), nullptr);\r
- auto imageSource = CGImageSourceCreateWithDataProvider (provider, nullptr);\r
+ CGDataProviderRef provider = CGDataProviderCreateWithData (0, data.getData(), data.getSize(), 0);\r
+ CGImageSourceRef imageSource = CGImageSourceCreateWithDataProvider (provider, 0);\r
CGDataProviderRelease (provider);\r
\r
- if (imageSource != nullptr)\r
+ if (imageSource != 0)\r
{\r
- auto loadedImage = CGImageSourceCreateImageAtIndex (imageSource, 0, nullptr);\r
+ CGImageRef loadedImage = CGImageSourceCreateImageAtIndex (imageSource, 0, 0);\r
CFRelease (imageSource);\r
#endif\r
\r
- if (loadedImage != nullptr)\r
+ if (loadedImage != 0)\r
{\r
- auto alphaInfo = CGImageGetAlphaInfo (loadedImage);\r
+ CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo (loadedImage);\r
const bool hasAlphaChan = (alphaInfo != kCGImageAlphaNone\r
&& alphaInfo != kCGImageAlphaNoneSkipLast\r
&& alphaInfo != kCGImageAlphaNoneSkipFirst);\r
(int) CGImageGetHeight (loadedImage),\r
hasAlphaChan));\r
\r
- auto cgImage = dynamic_cast<CoreGraphicsImage*> (image.getPixelData());\r
+ CoreGraphicsImage* const cgImage = dynamic_cast<CoreGraphicsImage*> (image.getPixelData());\r
jassert (cgImage != nullptr); // if USE_COREGRAPHICS_RENDERING is set, the CoreGraphicsImage class should have been used.\r
\r
CGContextDrawImage (cgImage->context, convertToCGRect (image.getBounds()), loadedImage);\r
}\r
}\r
\r
- return {};\r
+ return Image();\r
}\r
#endif\r
\r
Image juce_createImageFromCIImage (CIImage*, int, int);\r
Image juce_createImageFromCIImage (CIImage* im, int w, int h)\r
{\r
- auto cgImage = new CoreGraphicsImage (Image::ARGB, w, h, false);\r
+ CoreGraphicsImage* cgImage = new CoreGraphicsImage (Image::ARGB, w, h, false);\r
\r
CIContext* cic = [CIContext contextWithCGContext: cgImage->context options: nil];\r
[cic drawImage: im inRect: CGRectMake (0, 0, w, h) fromRect: CGRectMake (0, 0, w, h)];\r
CGContextFlush (cgImage->context);\r
\r
- return Image (*cgImage);\r
+ return Image (cgImage);\r
}\r
\r
CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef colourSpace,\r
\r
CGContextRef juce_getImageContext (const Image& image)\r
{\r
- if (auto cgi = dynamic_cast<CoreGraphicsImage*> (image.getPixelData()))\r
+ if (CoreGraphicsImage* const cgi = dynamic_cast<CoreGraphicsImage*> (image.getPixelData()))\r
return cgi->context;\r
\r
jassertfalse;\r
- return {};\r
+ return 0;\r
}\r
\r
#if JUCE_IOS\r
auto requiredSize = NSMakeSize (image.getWidth() / scaleFactor, image.getHeight() / scaleFactor);\r
\r
[im setSize: requiredSize];\r
- auto colourSpace = CGColorSpaceCreateDeviceRGB();\r
- auto imageRef = juce_createCoreGraphicsImage (image, colourSpace, true);\r
+ CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();\r
+ CGImageRef imageRef = juce_createCoreGraphicsImage (image, colourSpace, true);\r
CGColorSpaceRelease (colourSpace);\r
\r
NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage: imageRef];\r
{\r
extraKerning *= attr.font.getHeight();\r
\r
- auto numberRef = CFNumberCreate (nullptr, kCFNumberFloatType, &extraKerning);\r
+ auto numberRef = CFNumberCreate (0, kCFNumberFloatType, &extraKerning);\r
CFAttributedStringSetAttribute (attribString, range, kCTKernAttributeName, numberRef);\r
CFRelease (numberRef);\r
}\r
fontHeightToPointsFactor = referenceFontSize / ctTotalHeight;\r
\r
const short zero = 0;\r
- auto numberRef = CFNumberCreate (nullptr, kCFNumberShortType, &zero);\r
+ auto numberRef = CFNumberCreate (0, kCFNumberShortType, &zero);\r
\r
CFStringRef keys[] = { kCTFontAttributeName, kCTLigatureAttributeName };\r
CFTypeRef values[] = { ctFontRef, numberRef };\r
\r
\r
//==============================================================================\r
-Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) { return *new OSXTypeface (font); }\r
-Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size) { return *new OSXTypeface (data, size); }\r
+Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) { return new OSXTypeface (font); }\r
+Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size) { return new OSXTypeface (data, size); }\r
\r
void Typeface::scanFolderForFonts (const File&)\r
{\r
pimpl->renderingTarget->SetTransform (D2D1::IdentityMatrix());\r
}\r
\r
-void Direct2DLowLevelGraphicsContext::drawLine (const Line<float>& line)\r
+void Direct2DLowLevelGraphicsContext::drawLine (const Line <float>& line)\r
{\r
// xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour\r
pimpl->renderingTarget->SetTransform (transformToMatrix (currentState->transform));\r
Rectangle<int> bounds;\r
\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Direct2DLowLevelGraphicsContext)\r
CustomDirectWriteTextRenderer (IDWriteFontCollection& fonts, const AttributedString& as)\r
: ComBaseClassHelper<IDWriteTextRenderer> (0),\r
attributedString (as),\r
- fontCollection (fonts)\r
+ fontCollection (fonts),\r
+ currentLine (-1),\r
+ lastOriginY (-10000.0f)\r
{\r
}\r
\r
DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* runDescription,\r
IUnknown* clientDrawingEffect) override\r
{\r
- auto layout = static_cast<TextLayout*> (clientDrawingContext);\r
+ TextLayout* const layout = static_cast<TextLayout*> (clientDrawingContext);\r
\r
if (! (baselineOriginY >= -1.0e10f && baselineOriginY <= 1.0e10f))\r
baselineOriginY = 0; // DirectWrite sometimes sends NaNs in this parameter\r
if (currentLine >= layout->getNumLines())\r
{\r
jassert (currentLine == layout->getNumLines());\r
- auto line = new TextLayout::Line();\r
+ TextLayout::Line* const line = new TextLayout::Line();\r
layout->addLine (line);\r
\r
line->lineOrigin = Point<float> (baselineOriginX, baselineOriginY);\r
}\r
}\r
\r
- auto& glyphLine = layout->getLine (currentLine);\r
+ TextLayout::Line& glyphLine = layout->getLine (currentLine);\r
\r
DWRITE_FONT_METRICS dwFontMetrics;\r
glyphRun->fontFace->GetMetrics (&dwFontMetrics);\r
glyphLine.ascent = jmax (glyphLine.ascent, scaledFontSize (dwFontMetrics.ascent, dwFontMetrics, *glyphRun));\r
glyphLine.descent = jmax (glyphLine.descent, scaledFontSize (dwFontMetrics.descent, dwFontMetrics, *glyphRun));\r
\r
- auto glyphRunLayout = new TextLayout::Run (Range<int> (runDescription->textPosition,\r
- runDescription->textPosition + runDescription->stringLength),\r
- glyphRun->glyphCount);\r
+ TextLayout::Run* const glyphRunLayout = new TextLayout::Run (Range<int> (runDescription->textPosition,\r
+ runDescription->textPosition + runDescription->stringLength),\r
+ glyphRun->glyphCount);\r
glyphLine.runs.add (glyphRunLayout);\r
\r
glyphRun->fontFace->GetMetrics (&dwFontMetrics);\r
- auto totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent);\r
- auto fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight;\r
+ const float totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent);\r
+ const float fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight;\r
\r
glyphRunLayout->font = getFontForRun (*glyphRun, glyphRun->fontEmSize / fontHeightToEmSizeFactor);\r
glyphRunLayout->colour = getColourOf (static_cast<ID2D1SolidColorBrush*> (clientDrawingEffect));\r
\r
- auto lineOrigin = layout->getLine (currentLine).lineOrigin;\r
- auto x = baselineOriginX - lineOrigin.x;\r
+ const Point<float> lineOrigin (layout->getLine (currentLine).lineOrigin);\r
+ float x = baselineOriginX - lineOrigin.x;\r
\r
- auto extraKerning = glyphRunLayout->font.getExtraKerningFactor()\r
- * glyphRunLayout->font.getHeight();\r
+ const float extraKerning = glyphRunLayout->font.getExtraKerningFactor()\r
+ * glyphRunLayout->font.getHeight();\r
\r
for (UINT32 i = 0; i < glyphRun->glyphCount; ++i)\r
{\r
- auto advance = glyphRun->glyphAdvances[i];\r
+ const float advance = glyphRun->glyphAdvances[i];\r
\r
if ((glyphRun->bidiLevel & 1) != 0)\r
x -= advance + extraKerning; // RTL text\r
private:\r
const AttributedString& attributedString;\r
IDWriteFontCollection& fontCollection;\r
- int currentLine = -1;\r
- float lastOriginY = -10000.0f;\r
+ int currentLine;\r
+ float lastOriginY;\r
\r
static float scaledFontSize (int n, const DWRITE_FONT_METRICS& metrics, const DWRITE_GLYPH_RUN& glyphRun) noexcept\r
{\r
{\r
for (int i = 0; i < attributedString.getNumAttributes(); ++i)\r
{\r
- auto& font = attributedString.getAttribute(i).font;\r
+ const Font& font = attributedString.getAttribute(i).font;\r
\r
- if (auto* wt = dynamic_cast<WindowsDirectWriteTypeface*> (font.getTypeface()))\r
+ if (WindowsDirectWriteTypeface* wt = dynamic_cast<WindowsDirectWriteTypeface*> (font.getTypeface()))\r
if (wt->getIDWriteFontFace() == glyphRun.fontFace)\r
return font.withHeight (fontHeight);\r
}\r
\r
ComSmartPtr<IDWriteFont> dwFont;\r
- auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
+ HRESULT hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
jassert (dwFont != nullptr);\r
\r
ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
range.length = jmin (attr.range.getLength(), textLen - attr.range.getStart());\r
\r
{\r
- auto familyName = FontStyleHelpers::getConcreteFamilyName (attr.font);\r
+ const String familyName (FontStyleHelpers::getConcreteFamilyName (attr.font));\r
\r
BOOL fontFound = false;\r
uint32 fontIndex;\r
fontIndex = 0;\r
\r
ComSmartPtr<IDWriteFontFamily> fontFamily;\r
- auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
+ HRESULT hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
\r
ComSmartPtr<IDWriteFont> dwFont;\r
uint32 fontFacesCount = 0;\r
textLayout.SetFontStretch (dwFont->GetStretch(), range);\r
textLayout.SetFontStyle (dwFont->GetStyle(), range);\r
\r
- auto fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
+ const float fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
textLayout.SetFontSize (attr.font.getHeight() * fontHeightToEmSizeFactor, range);\r
}\r
\r
{\r
- auto col = attr.colour;\r
+ const Colour col (attr.colour);\r
ComSmartPtr<ID2D1SolidColorBrush> d2dBrush;\r
renderTarget.CreateSolidColorBrush (D2D1::ColorF (col.getFloatRed(),\r
col.getFloatGreen(),\r
}\r
}\r
\r
- bool setupLayout (const AttributedString& text, float maxWidth, float maxHeight,\r
+ bool setupLayout (const AttributedString& text, const float maxWidth, const float maxHeight,\r
ID2D1RenderTarget& renderTarget, IDWriteFactory& directWriteFactory,\r
IDWriteFontCollection& fontCollection, ComSmartPtr<IDWriteTextLayout>& textLayout)\r
{\r
fontIndex = 0;\r
\r
ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
- auto hr = fontCollection.GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress());\r
+ HRESULT hr = fontCollection.GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress());\r
\r
ComSmartPtr<IDWriteFont> dwFont;\r
hr = dwFontFamily->GetFirstMatchingFont (DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL,\r
dwFont.resetAndGetPointerAddress());\r
jassert (dwFont != nullptr);\r
\r
- auto defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
+ const float defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*dwFont);\r
\r
ComSmartPtr<IDWriteTextFormat> dwTextFormat;\r
hr = directWriteFactory.CreateTextFormat (defaultFont.getTypefaceName().toWideCharPointer(), &fontCollection,\r
hr = dwTextFormat->SetTrimming (&trimming, trimmingSign);\r
}\r
\r
- auto textLen = text.getText().length();\r
+ const int textLen = text.getText().length();\r
\r
hr = directWriteFactory.CreateTextLayout (text.getText().toWideCharPointer(), textLen, dwTextFormat,\r
maxWidth, maxHeight, textLayout.resetAndGetPointerAddress());\r
if (FAILED (hr) || textLayout == nullptr)\r
return false;\r
\r
- auto numAttributes = text.getNumAttributes();\r
+ const int numAttributes = text.getNumAttributes();\r
\r
for (int i = 0; i < numAttributes; ++i)\r
addAttributedRange (text.getAttribute (i), *textLayout, textLen, renderTarget, fontCollection);\r
return;\r
\r
UINT32 actualLineCount = 0;\r
- auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
+ HRESULT hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
\r
layout.ensureStorageAllocated (actualLineCount);\r
\r
HeapBlock<DWRITE_LINE_METRICS> dwLineMetrics (actualLineCount);\r
hr = dwTextLayout->GetLineMetrics (dwLineMetrics, actualLineCount, &actualLineCount);\r
int lastLocation = 0;\r
- auto numLines = jmin ((int) actualLineCount, layout.getNumLines());\r
+ const int numLines = jmin ((int) actualLineCount, layout.getNumLines());\r
float yAdjustment = 0;\r
- auto extraLineSpacing = text.getLineSpacing();\r
+ const float extraLineSpacing = text.getLineSpacing();\r
\r
for (int i = 0; i < numLines; ++i)\r
{\r
- auto& line = layout.getLine (i);\r
+ TextLayout::Line& line = layout.getLine (i);\r
line.stringRange = Range<int> (lastLocation, (int) lastLocation + dwLineMetrics[i].length);\r
line.lineOrigin.y += yAdjustment;\r
yAdjustment += extraLineSpacing;\r
\r
static bool canAllTypefacesBeUsedInLayout (const AttributedString& text)\r
{\r
- auto numCharacterAttributes = text.getNumAttributes();\r
+ const int numCharacterAttributes = text.getNumAttributes();\r
\r
for (int i = 0; i < numCharacterAttributes; ++i)\r
if (dynamic_cast<WindowsDirectWriteTypeface*> (text.getAttribute(i).font.getTypeface()) == nullptr)\r
\r
uint32 index = 0;\r
BOOL exists = false;\r
- auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
-\r
+ HRESULT hr = names->FindLocaleName (L"en-us", &index, &exists);\r
if (! exists)\r
index = 0;\r
\r
{\r
jassert (family != nullptr);\r
ComSmartPtr<IDWriteLocalizedStrings> familyNames;\r
- auto hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
+ HRESULT hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
return getLocalisedName (familyNames);\r
}\r
{\r
jassert (font != nullptr);\r
ComSmartPtr<IDWriteLocalizedStrings> faceNames;\r
- auto hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
+ HRESULT hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
return getLocalisedName (faceNames);\r
}\r
\r
if (d2dFactory != nullptr)\r
{\r
- auto d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE,\r
- D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM,\r
- D2D1_ALPHA_MODE_IGNORE),\r
- 0, 0,\r
- D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,\r
- D2D1_FEATURE_LEVEL_DEFAULT);\r
+ D2D1_RENDER_TARGET_PROPERTIES d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE,\r
+ D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM,\r
+ D2D1_ALPHA_MODE_IGNORE),\r
+ 0, 0,\r
+ D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,\r
+ D2D1_FEATURE_LEVEL_DEFAULT);\r
\r
d2dFactory->CreateDCRenderTarget (&d2dRTProp, directWriteRenderTarget.resetAndGetPointerAddress());\r
}\r
{\r
public:\r
WindowsDirectWriteTypeface (const Font& font, IDWriteFontCollection* fontCollection)\r
- : Typeface (font.getTypefaceName(), font.getTypefaceStyle())\r
+ : Typeface (font.getTypefaceName(), font.getTypefaceStyle()),\r
+ unitsToHeightScaleFactor (1.0f), heightToPointsFactor (1.0f), ascent (0.0f)\r
{\r
jassert (fontCollection != nullptr);\r
\r
BOOL fontFound = false;\r
uint32 fontIndex = 0;\r
- auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
-\r
+ HRESULT hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
if (! fontFound)\r
fontIndex = 0;\r
\r
designUnitsPerEm = dwFontMetrics.designUnitsPerEm;\r
\r
ascent = std::abs ((float) dwFontMetrics.ascent);\r
- auto totalSize = ascent + std::abs ((float) dwFontMetrics.descent);\r
+ const float totalSize = ascent + std::abs ((float) dwFontMetrics.descent);\r
ascent /= totalSize;\r
unitsToHeightScaleFactor = designUnitsPerEm / totalSize;\r
\r
- auto tempDC = GetDC (0);\r
- auto dpi = (GetDeviceCaps (tempDC, LOGPIXELSX) + GetDeviceCaps (tempDC, LOGPIXELSY)) / 2.0f;\r
+ HDC tempDC = GetDC (0);\r
+ float dpi = (GetDeviceCaps (tempDC, LOGPIXELSX) + GetDeviceCaps (tempDC, LOGPIXELSY)) / 2.0f;\r
heightToPointsFactor = (dpi / GetDeviceCaps (tempDC, LOGPIXELSY)) * unitsToHeightScaleFactor;\r
ReleaseDC (0, tempDC);\r
\r
- auto pathAscent = (1024.0f * dwFontMetrics.ascent) / designUnitsPerEm;\r
- auto pathDescent = (1024.0f * dwFontMetrics.descent) / designUnitsPerEm;\r
- auto pathScale = 1.0f / (std::abs (pathAscent) + std::abs (pathDescent));\r
+ const float pathAscent = (1024.0f * dwFontMetrics.ascent) / designUnitsPerEm;\r
+ const float pathDescent = (1024.0f * dwFontMetrics.descent) / designUnitsPerEm;\r
+ const float pathScale = 1.0f / (std::abs (pathAscent) + std::abs (pathDescent));\r
pathTransform = AffineTransform::scale (pathScale);\r
}\r
}\r
\r
float getStringWidth (const String& text)\r
{\r
- auto textUTF32 = text.toUTF32();\r
- auto len = textUTF32.length();\r
+ const CharPointer_UTF32 textUTF32 (text.toUTF32());\r
+ const size_t len = textUTF32.length();\r
\r
HeapBlock<UINT16> glyphIndices (len);\r
dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices);\r
dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false);\r
\r
float x = 0;\r
-\r
for (size_t i = 0; i < len; ++i)\r
x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm;\r
\r
{\r
xOffsets.add (0);\r
\r
- auto textUTF32 = text.toUTF32();\r
- auto len = textUTF32.length();\r
+ const CharPointer_UTF32 textUTF32 (text.toUTF32());\r
+ const size_t len = textUTF32.length();\r
\r
HeapBlock<UINT16> glyphIndices (len);\r
dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices);\r
dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false);\r
\r
float x = 0;\r
-\r
for (size_t i = 0; i < len; ++i)\r
{\r
x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm;\r
bool getOutlineForGlyph (int glyphNumber, Path& path)\r
{\r
jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty\r
- auto glyphIndex = (UINT16) glyphNumber;\r
+ UINT16 glyphIndex = (UINT16) glyphNumber;\r
ComSmartPtr<PathGeometrySink> pathGeometrySink (new PathGeometrySink());\r
\r
- dwFontFace->GetGlyphRunOutline (1024.0f, &glyphIndex, nullptr, nullptr,\r
- 1, false, false, pathGeometrySink);\r
+ dwFontFace->GetGlyphRunOutline (1024.0f, &glyphIndex, nullptr, nullptr, 1, false, false, pathGeometrySink);\r
path = pathGeometrySink->path;\r
\r
if (! pathTransform.isIdentity())\r
private:\r
SharedResourcePointer<Direct2DFactories> factories;\r
ComSmartPtr<IDWriteFontFace> dwFontFace;\r
- float unitsToHeightScaleFactor = 1.0f, heightToPointsFactor = 1.0f, ascent = 0;\r
- int designUnitsPerEm = 0;\r
+ float unitsToHeightScaleFactor, heightToPointsFactor, ascent;\r
+ int designUnitsPerEm;\r
AffineTransform pathTransform;\r
\r
struct PathGeometrySink : public ComBaseClassHelper<IDWriteGeometrySink>\r
const int64 directoryOffset, const int64 offsetOfStringStorage)\r
{\r
String result;\r
- auto oldPos = input.getPosition();\r
+ const int64 oldPos = input.getPosition();\r
input.setPosition (directoryOffset + offsetOfStringStorage + ByteOrder::swapIfLittleEndian (nameRecord.offsetFromStorageArea));\r
- auto stringLength = (int) ByteOrder::swapIfLittleEndian (nameRecord.stringLength);\r
- auto platformID = ByteOrder::swapIfLittleEndian (nameRecord.platformID);\r
+ const int stringLength = (int) ByteOrder::swapIfLittleEndian (nameRecord.stringLength);\r
+ const int platformID = ByteOrder::swapIfLittleEndian (nameRecord.platformID);\r
\r
if (platformID == 0 || platformID == 3)\r
{\r
- auto numChars = stringLength / 2 + 1;\r
+ const int numChars = stringLength / 2 + 1;\r
HeapBlock<uint16> buffer;\r
buffer.calloc (numChars + 1);\r
input.read (buffer, stringLength);\r
const String fontName (lpelfe->elfLogFont.lfFaceName);\r
fontName.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName));\r
\r
- auto dc = CreateCompatibleDC (0);\r
- EnumFontFamiliesEx (dc, &lf, (FONTENUMPROCW) &fontEnum2, lParam, 0);\r
+ HDC dc = CreateCompatibleDC (0);\r
+ EnumFontFamiliesEx (dc, &lf,\r
+ (FONTENUMPROCW) &fontEnum2,\r
+ lParam, 0);\r
DeleteDC (dc);\r
}\r
\r
\r
for (uint32 i = 0; i < fontFamilyCount; ++i)\r
{\r
- auto hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress());\r
+ HRESULT hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress());\r
\r
if (SUCCEEDED (hr))\r
results.addIfNotAlreadyThere (getFontFamilyName (fontFamily));\r
else\r
#endif\r
{\r
- auto dc = CreateCompatibleDC (0);\r
+ HDC dc = CreateCompatibleDC (0);\r
\r
{\r
LOGFONTW lf = { 0 };\r
{\r
BOOL fontFound = false;\r
uint32 fontIndex = 0;\r
- auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
-\r
+ HRESULT hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
if (! fontFound)\r
fontIndex = 0;\r
\r
static DefaultFontNames defaultNames;\r
\r
Font newFont (font);\r
- auto& faceName = font.getTypefaceName();\r
+ const String& faceName = font.getTypefaceName();\r
\r
if (faceName == getDefaultSansSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSans);\r
else if (faceName == getDefaultSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSerif);\r
class WindowsTypeface : public Typeface\r
{\r
public:\r
- WindowsTypeface (const Font& font) : Typeface (font.getTypefaceName(),\r
- font.getTypefaceStyle())\r
+ WindowsTypeface (const Font& font)\r
+ : Typeface (font.getTypefaceName(), font.getTypefaceStyle()),\r
+ fontH (0), previousFontH (0),\r
+ dc (CreateCompatibleDC (0)), memoryFont (0),\r
+ ascent (1.0f), heightToPointsFactor (1.0f),\r
+ defaultGlyph (-1)\r
{\r
loadFont();\r
}\r
\r
WindowsTypeface (const void* data, size_t dataSize)\r
- : Typeface (String(), String())\r
+ : Typeface (String(), String()),\r
+ fontH (0), previousFontH (0),\r
+ dc (CreateCompatibleDC (0)), memoryFont (0),\r
+ ascent (1.0f), heightToPointsFactor (1.0f),\r
+ defaultGlyph (-1)\r
{\r
DWORD numInstalled = 0;\r
memoryFont = AddFontMemResourceEx (const_cast<void*> (data), (DWORD) dataSize,\r
\r
float getStringWidth (const String& text)\r
{\r
- auto utf16 = text.toUTF16();\r
- auto numChars = utf16.length();\r
+ const CharPointer_UTF16 utf16 (text.toUTF16());\r
+ const size_t numChars = utf16.length();\r
HeapBlock<uint16> results (numChars);\r
float x = 0;\r
\r
return x;\r
}\r
\r
- void getGlyphPositions (const String& text, Array<int>& resultGlyphs, Array<float>& xOffsets)\r
+ void getGlyphPositions (const String& text, Array <int>& resultGlyphs, Array <float>& xOffsets)\r
{\r
- auto utf16 = text.toUTF16();\r
- auto numChars = utf16.length();\r
+ const CharPointer_UTF16 utf16 (text.toUTF16());\r
+ const size_t numChars = utf16.length();\r
HeapBlock<uint16> results (numChars);\r
float x = 0;\r
\r
\r
GLYPHMETRICS gm;\r
// (although GetGlyphOutline returns a DWORD, it may be -1 on failure, so treat it as signed int..)\r
- auto bufSize = (int) GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX,\r
- &gm, 0, 0, &identityMatrix);\r
+ const int bufSize = (int) GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX,\r
+ &gm, 0, 0, &identityMatrix);\r
\r
if (bufSize > 0)\r
{\r
GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX, &gm,\r
bufSize, data, &identityMatrix);\r
\r
- auto pheader = reinterpret_cast<const TTPOLYGONHEADER*> (data.getData());\r
+ const TTPOLYGONHEADER* pheader = reinterpret_cast<TTPOLYGONHEADER*> (data.getData());\r
\r
- auto scaleX = 1.0f / tm.tmHeight;\r
- auto scaleY = -scaleX;\r
+ const float scaleX = 1.0f / tm.tmHeight;\r
+ const float scaleY = -scaleX;\r
\r
while ((char*) pheader < data + bufSize)\r
{\r
glyphPath.startNewSubPath (scaleX * pheader->pfxStart.x.value,\r
scaleY * pheader->pfxStart.y.value);\r
\r
- auto curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER));\r
- auto curveEnd = ((const char*) pheader) + pheader->cb;\r
+ const TTPOLYCURVE* curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER));\r
+ const char* const curveEnd = ((const char*) pheader) + pheader->cb;\r
\r
while ((const char*) curve < curveEnd)\r
{\r
{\r
for (int i = 0; i < curve->cpfx - 1; ++i)\r
{\r
- auto x2 = scaleX * curve->apfx[i].x.value;\r
- auto y2 = scaleY * curve->apfx[i].y.value;\r
- auto x3 = scaleX * curve->apfx[i + 1].x.value;\r
- auto y3 = scaleY * curve->apfx[i + 1].y.value;\r
+ const float x2 = scaleX * curve->apfx[i].x.value;\r
+ const float y2 = scaleY * curve->apfx[i].y.value;\r
+ float x3 = scaleX * curve->apfx[i + 1].x.value;\r
+ float y3 = scaleY * curve->apfx[i + 1].y.value;\r
\r
if (i < curve->cpfx - 2)\r
{\r
\r
private:\r
static const MAT2 identityMatrix;\r
- HFONT fontH = {};\r
- HGDIOBJ previousFontH = {};\r
- HDC dc { CreateCompatibleDC (0) };\r
+ HFONT fontH;\r
+ HGDIOBJ previousFontH;\r
+ HDC dc;\r
TEXTMETRIC tm;\r
- HANDLE memoryFont = {};\r
- float ascent = 1.0f, heightToPointsFactor = 1.0f;\r
- int defaultGlyph = -1, heightInPoints = 0;\r
- std::unordered_map<uint64, float> kerningPairs;\r
+ HANDLE memoryFont;\r
+ float ascent, heightToPointsFactor;\r
+ int defaultGlyph, heightInPoints;\r
\r
- static uint64 kerningPairIndex (int glyph1, int glyph2)\r
+ struct KerningPair\r
{\r
- return (((uint64) (uint32) glyph1) << 32) | (uint64) (uint32) glyph2;\r
- }\r
+ int glyph1, glyph2;\r
+ float kerning;\r
+\r
+ bool operator== (const KerningPair& other) const noexcept\r
+ {\r
+ return glyph1 == other.glyph1 && glyph2 == other.glyph2;\r
+ }\r
+\r
+ bool operator< (const KerningPair& other) const noexcept\r
+ {\r
+ return glyph1 < other.glyph1\r
+ || (glyph1 == other.glyph1 && glyph2 < other.glyph2);\r
+ }\r
+ };\r
+\r
+ SortedSet<KerningPair> kerningPairs;\r
\r
void loadFont()\r
{\r
lf.lfHeight = -256;\r
name.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName));\r
\r
- auto standardSizedFont = CreateFontIndirect (&lf);\r
+ HFONT standardSizedFont = CreateFontIndirect (&lf);\r
\r
if (standardSizedFont != 0)\r
{\r
if ((previousFontH = SelectObject (dc, standardSizedFont)) != 0)\r
{\r
fontH = standardSizedFont;\r
- OUTLINETEXTMETRIC otm;\r
\r
+ OUTLINETEXTMETRIC otm;\r
if (GetOutlineTextMetrics (dc, sizeof (otm), &otm) != 0)\r
{\r
heightInPoints = otm.otmEMSquare;\r
\r
if (GetTextMetrics (dc, &tm))\r
{\r
- auto dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0f;\r
+ float dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0f;\r
heightToPointsFactor = (dpi / GetDeviceCaps (dc, LOGPIXELSY)) * heightInPoints / (float) tm.tmHeight;\r
ascent = tm.tmAscent / (float) tm.tmHeight;\r
- std::unordered_map<int, int> glyphsForChars;\r
- defaultGlyph = getGlyphForChar (dc, glyphsForChars, tm.tmDefaultChar);\r
- createKerningPairs (dc, glyphsForChars, (float) tm.tmHeight);\r
+ defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar);\r
+ createKerningPairs (dc, (float) tm.tmHeight);\r
}\r
}\r
\r
- void createKerningPairs (HDC hdc, std::unordered_map<int, int>& glyphsForChars, float height)\r
+ void createKerningPairs (HDC hdc, const float height)\r
{\r
HeapBlock<KERNINGPAIR> rawKerning;\r
- auto numKPs = GetKerningPairs (hdc, 0, 0);\r
+ const DWORD numKPs = GetKerningPairs (hdc, 0, 0);\r
rawKerning.calloc (numKPs);\r
GetKerningPairs (hdc, numKPs, rawKerning);\r
\r
- std::unordered_map<int, int> widthsForGlyphs;\r
+ kerningPairs.ensureStorageAllocated ((int) numKPs);\r
\r
for (DWORD i = 0; i < numKPs; ++i)\r
{\r
- auto glyph1 = getGlyphForChar (hdc, glyphsForChars, rawKerning[i].wFirst);\r
- auto glyph2 = getGlyphForChar (hdc, glyphsForChars, rawKerning[i].wSecond);\r
- auto standardWidth = getGlyphWidth (hdc, widthsForGlyphs, glyph1);\r
+ KerningPair kp;\r
+ kp.glyph1 = getGlyphForChar (hdc, rawKerning[i].wFirst);\r
+ kp.glyph2 = getGlyphForChar (hdc, rawKerning[i].wSecond);\r
\r
- kerningPairs[kerningPairIndex (glyph1, glyph2)] = (standardWidth + rawKerning[i].iKernAmount) / height;\r
- kerningPairs[kerningPairIndex (glyph1, -1)] = standardWidth / height;\r
+ const int standardWidth = getGlyphWidth (hdc, kp.glyph1);\r
+ kp.kerning = (standardWidth + rawKerning[i].iKernAmount) / height;\r
+ kerningPairs.add (kp);\r
+\r
+ kp.glyph2 = -1; // add another entry for the standard width version..\r
+ kp.kerning = standardWidth / height;\r
+ kerningPairs.add (kp);\r
}\r
}\r
\r
- static int getGlyphForChar (HDC dc, std::unordered_map<int, int>& cache, juce_wchar character)\r
+ static int getGlyphForChar (HDC dc, juce_wchar character)\r
{\r
- auto existing = cache.find ((int) character);\r
-\r
- if (existing != cache.end())\r
- return existing->second;\r
-\r
const WCHAR charToTest[] = { (WCHAR) character, 0 };\r
WORD index = 0;\r
\r
|| index == 0xffff)\r
return -1;\r
\r
- cache[(int) character] = index;\r
return index;\r
}\r
\r
- static int getGlyphWidth (HDC dc, std::unordered_map<int, int>& cache, int glyphNumber)\r
- {\r
- auto existing = cache.find (glyphNumber);\r
-\r
- if (existing != cache.end())\r
- return existing->second;\r
-\r
- auto width = getGlyphWidth (dc, glyphNumber);\r
- cache[glyphNumber] = width;\r
- return width;\r
- }\r
-\r
static int getGlyphWidth (HDC dc, int glyphNumber)\r
{\r
GLYPHMETRICS gm;\r
return gm.gmCellIncX;\r
}\r
\r
- float getKerning (HDC hdc, int glyph1, int glyph2)\r
+ float getKerning (HDC hdc, const int glyph1, const int glyph2)\r
{\r
- auto pair = kerningPairs.find (kerningPairIndex (glyph1, glyph2));\r
-\r
- if (pair != kerningPairs.end())\r
- return pair->second;\r
+ KerningPair kp;\r
+ kp.glyph1 = glyph1;\r
+ kp.glyph2 = glyph2;\r
+ int index = kerningPairs.indexOf (kp);\r
\r
- auto single = kerningPairs.find (kerningPairIndex (glyph1, -1));\r
+ if (index < 0)\r
+ {\r
+ kp.glyph2 = -1;\r
+ index = kerningPairs.indexOf (kp);\r
\r
- if (single != kerningPairs.end())\r
- return single->second;\r
+ if (index < 0)\r
+ {\r
+ kp.glyph2 = -1;\r
+ kp.kerning = getGlyphWidth (hdc, kp.glyph1) / (float) tm.tmHeight;\r
+ kerningPairs.add (kp);\r
+ return kp.kerning;\r
+ }\r
+ }\r
\r
- auto width = getGlyphWidth (hdc, glyph1) / (float) tm.tmHeight;\r
- kerningPairs[kerningPairIndex (glyph1, -1)] = width;\r
- return width;\r
+ return kerningPairs.getReference (index).kerning;\r
}\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsTypeface)\r
Justification (int justificationFlags) noexcept : flags (justificationFlags) {}\r
\r
/** Creates a copy of another Justification object. */\r
- Justification (const Justification&) = default;\r
+ Justification (const Justification& other) noexcept : flags (other.flags) {}\r
\r
/** Copies another Justification object. */\r
- Justification& operator= (const Justification&) = default;\r
+ Justification& operator= (const Justification& other) noexcept\r
+ {\r
+ flags = other.flags;\r
+ return *this;\r
+ }\r
\r
bool operator== (const Justification& other) const noexcept { return flags == other.flags; }\r
bool operator!= (const Justification& other) const noexcept { return flags != other.flags; }\r
namespace juce\r
{\r
\r
+RectanglePlacement::RectanglePlacement (const RectanglePlacement& other) noexcept\r
+ : flags (other.flags)\r
+{\r
+}\r
+\r
+RectanglePlacement& RectanglePlacement::operator= (const RectanglePlacement& other) noexcept\r
+{\r
+ flags = other.flags;\r
+ return *this;\r
+}\r
+\r
bool RectanglePlacement::operator== (const RectanglePlacement& other) const noexcept\r
{\r
return flags == other.flags;\r
inline RectanglePlacement (int placementFlags) noexcept : flags (placementFlags) {}\r
\r
/** Creates a default RectanglePlacement object, which is equivalent to using the 'centred' flag. */\r
- inline RectanglePlacement() = default;\r
+ inline RectanglePlacement() noexcept : flags (centred) {}\r
\r
/** Creates a copy of another RectanglePlacement object. */\r
- RectanglePlacement (const RectanglePlacement&) = default;\r
+ RectanglePlacement (const RectanglePlacement&) noexcept;\r
\r
/** Copies another RectanglePlacement object. */\r
- RectanglePlacement& operator= (const RectanglePlacement&) = default;\r
+ RectanglePlacement& operator= (const RectanglePlacement&) noexcept;\r
\r
bool operator== (const RectanglePlacement&) const noexcept;\r
bool operator!= (const RectanglePlacement&) const noexcept;\r
\r
private:\r
//==============================================================================\r
- int flags { centred };\r
+ int flags;\r
};\r
\r
} // namespace juce\r
\r
ArrowButton::~ArrowButton() {}\r
\r
-void ArrowButton::paintButton (Graphics& g, bool /*shouldDrawButtonAsHighlighted*/, bool shouldDrawButtonAsDown)\r
+void ArrowButton::paintButton (Graphics& g, bool /*isMouseOverButton*/, bool isButtonDown)\r
{\r
Path p (path);\r
\r
- const float offset = shouldDrawButtonAsDown ? 1.0f : 0.0f;\r
+ const float offset = isButtonDown ? 1.0f : 0.0f;\r
p.applyTransform (path.getTransformToScaleToFit (offset, offset, getWidth() - 3.0f, getHeight() - 3.0f, false));\r
\r
- DropShadow (Colours::black.withAlpha (0.3f), shouldDrawButtonAsDown ? 2 : 4, Point<int>()).drawForPath (g, p);\r
+ DropShadow (Colours::black.withAlpha (0.3f), isButtonDown ? 2 : 4, Point<int>()).drawForPath (g, p);\r
\r
g.setColour (colour);\r
g.fillPath (p);\r
~ArrowButton();\r
\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
\r
private:\r
Colour colour;\r
virtual ~LookAndFeelMethods() {}\r
\r
virtual void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+ bool isMouseOverButton, bool isButtonDown) = 0;\r
\r
virtual Font getTextButtonFont (TextButton&, int buttonHeight) = 0;\r
virtual int getTextButtonWidthToFitText (TextButton&, int buttonHeight) = 0;\r
\r
/** Draws the text for a TextButton. */\r
- virtual void drawButtonText (Graphics&, TextButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+ virtual void drawButtonText (Graphics&, TextButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
\r
/** Draws the contents of a standard ToggleButton. */\r
- virtual void drawToggleButton (Graphics&, ToggleButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+ virtual void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
\r
virtual void changeToggleButtonWidthToFitText (ToggleButton&) = 0;\r
\r
virtual void drawTickBox (Graphics&, Component&, float x, float y, float w, float h,\r
- bool ticked, bool isEnabled,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+ bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) = 0;\r
\r
- virtual void drawDrawableButton (Graphics&, DrawableButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) = 0;\r
+ virtual void drawDrawableButton (Graphics&, DrawableButton&, bool isMouseOverButton, bool isButtonDown) = 0;\r
\r
private:\r
#if JUCE_CATCH_DEPRECATED_CODE_MISUSE\r
It's better to use this than the paint method, because it gives you information\r
about the over/down state of the button.\r
\r
- @param g the graphics context to use\r
- @param shouldDrawButtonAsHighlighted true if the button is either in the 'over' or 'down' state\r
- @param shouldDrawButtonAsDown true if the button should be drawn in the 'down' position\r
+ @param g the graphics context to use\r
+ @param isMouseOverButton true if the button is either in the 'over' or\r
+ 'down' state\r
+ @param isButtonDown true if the button should be drawn in the 'down' position\r
*/\r
virtual void paintButton (Graphics& g,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown) = 0;\r
+ bool isMouseOverButton,\r
+ bool isButtonDown) = 0;\r
\r
/** Called when the button's up/down/over state changes.\r
\r
ListenerList<Listener> buttonListeners;\r
\r
struct CallbackHelper;\r
+ friend struct CallbackHelper;\r
+ friend struct ContainerDeletePolicy<CallbackHelper>;\r
std::unique_ptr<CallbackHelper> callbackHelper;\r
uint32 buttonPressTime = 0, lastRepeatTime = 0;\r
ApplicationCommandManager* commandManagerToUse = nullptr;\r
}\r
\r
void DrawableButton::paintButton (Graphics& g,\r
- const bool shouldDrawButtonAsHighlighted,\r
- const bool shouldDrawButtonAsDown)\r
+ const bool isMouseOverButton,\r
+ const bool isButtonDown)\r
{\r
auto& lf = getLookAndFeel();\r
\r
lf.drawButtonBackground (g, *this,\r
findColour (getToggleState() ? TextButton::buttonOnColourId\r
: TextButton::buttonColourId),\r
- shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ isMouseOverButton, isButtonDown);\r
else\r
- lf.drawDrawableButton (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ lf.drawDrawableButton (g, *this, isMouseOverButton, isButtonDown);\r
}\r
\r
//==============================================================================\r
\r
//==============================================================================\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
/** @internal */\r
void buttonStateChanged() override;\r
/** @internal */\r
}\r
\r
void HyperlinkButton::paintButton (Graphics& g,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton,\r
+ bool isButtonDown)\r
{\r
const Colour textColour (findColour (textColourId));\r
\r
if (isEnabled())\r
- g.setColour ((shouldDrawButtonAsHighlighted) ? textColour.darker ((shouldDrawButtonAsDown) ? 1.3f : 0.4f)\r
+ g.setColour ((isMouseOverButton) ? textColour.darker ((isButtonDown) ? 1.3f : 0.4f)\r
: textColour);\r
else\r
g.setColour (textColour.withMultipliedAlpha (0.4f));\r
\r
@param linkText the text that will be displayed in the button - this is\r
also set as the Component's name, but the text can be\r
- changed later with the Button::setButtonText() method\r
+ changed later with the Button::getButtonText() method\r
@param linkURL the URL to launch when the user clicks the button\r
*/\r
HyperlinkButton (const String& linkText,\r
/** @internal */\r
void colourChanged() override;\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override;\r
\r
private:\r
//==============================================================================\r
}\r
\r
void ImageButton::paintButton (Graphics& g,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton,\r
+ bool isButtonDown)\r
{\r
if (! isEnabled())\r
{\r
- shouldDrawButtonAsHighlighted = false;\r
- shouldDrawButtonAsDown = false;\r
+ isMouseOverButton = false;\r
+ isButtonDown = false;\r
}\r
\r
Image im (getCurrentImage());\r
\r
imageBounds.setBounds (x, y, w, h);\r
\r
- const bool useDownImage = shouldDrawButtonAsDown || getToggleState();\r
+ const bool useDownImage = isButtonDown || getToggleState();\r
\r
getLookAndFeel().drawImageButton (g, &im, x, y, w, h,\r
useDownImage ? downOverlay\r
- : (shouldDrawButtonAsHighlighted ? overOverlay\r
+ : (isMouseOverButton ? overOverlay\r
: normalOverlay),\r
useDownImage ? downOpacity\r
- : (shouldDrawButtonAsHighlighted ? overOpacity\r
+ : (isMouseOverButton ? overOpacity\r
: normalOpacity),\r
*this);\r
}\r
/** @internal */\r
bool hitTest (int x, int y) override;\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override;\r
\r
private:\r
//==============================================================================\r
\r
if (resizeNowToFitThisShape)\r
{\r
- auto newBounds = shape.getBounds();\r
+ Rectangle<float> newBounds (shape.getBounds());\r
\r
if (hasShadow)\r
newBounds = newBounds.expanded (4.0f);\r
repaint();\r
}\r
\r
-void ShapeButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void ShapeButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
{\r
if (! isEnabled())\r
{\r
- shouldDrawButtonAsHighlighted = false;\r
- shouldDrawButtonAsDown = false;\r
+ isMouseOverButton = false;\r
+ isButtonDown = false;\r
}\r
\r
- auto r = border.subtractedFrom (getLocalBounds())\r
- .toFloat()\r
- .reduced (outlineWidth * 0.5f);\r
+ Rectangle<float> r (border.subtractedFrom (getLocalBounds()).toFloat().reduced (outlineWidth * 0.5f));\r
\r
if (getComponentEffect() != nullptr)\r
r = r.reduced (2.0f);\r
\r
- if (shouldDrawButtonAsDown)\r
+ if (isButtonDown)\r
{\r
const float sizeReductionWhenPressed = 0.04f;\r
\r
sizeReductionWhenPressed * r.getHeight());\r
}\r
\r
- auto trans = shape.getTransformToScaleToFit (r, maintainShapeProportions);\r
+ const AffineTransform trans (shape.getTransformToScaleToFit (r, maintainShapeProportions));\r
\r
- if (shouldDrawButtonAsDown) g.setColour (getToggleState() && useOnColours ? downColourOn : downColour);\r
- else if (shouldDrawButtonAsHighlighted) g.setColour (getToggleState() && useOnColours ? overColourOn : overColour);\r
- else g.setColour (getToggleState() && useOnColours ? normalColourOn : normalColour);\r
+ if (isButtonDown) g.setColour (getToggleState() && useOnColours ? downColourOn : downColour);\r
+ else if (isMouseOverButton) g.setColour (getToggleState() && useOnColours ? overColourOn : overColour);\r
+ else g.setColour (getToggleState() && useOnColours ? normalColourOn : normalColour);\r
\r
g.fillPath (shape, trans);\r
\r
void setBorderSize (BorderSize<int> border);\r
\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
\r
private:\r
//==============================================================================\r
{\r
}\r
\r
-void TextButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void TextButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
{\r
- auto& lf = getLookAndFeel();\r
+ LookAndFeel& lf = getLookAndFeel();\r
\r
lf.drawButtonBackground (g, *this,\r
findColour (getToggleState() ? buttonOnColourId : buttonColourId),\r
- shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ isMouseOverButton, isButtonDown);\r
\r
- lf.drawButtonText (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ lf.drawButtonText (g, *this, isMouseOverButton, isButtonDown);\r
}\r
\r
void TextButton::colourChanged()\r
\r
//==============================================================================\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
/** @internal */\r
void colourChanged() override;\r
\r
{\r
}\r
\r
-void ToggleButton::paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void ToggleButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown)\r
{\r
- getLookAndFeel().drawToggleButton (g, *this, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ getLookAndFeel().drawToggleButton (g, *this, isMouseOverButton, isButtonDown);\r
}\r
\r
void ToggleButton::changeWidthToFitText()\r
{\r
textColourId = 0x1006501, /**< The colour to use for the button's text. */\r
tickColourId = 0x1006502, /**< The colour to use for the tick mark. */\r
- tickDisabledColourId = 0x1006503 /**< The colour to use for the disabled tick mark and/or outline. */\r
+ tickDisabledColourId = 0x1006503 /**< The colour to use for the disabled tick mark. */\r
};\r
\r
protected:\r
//==============================================================================\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
/** @internal */\r
void colourChanged() override;\r
\r
{\r
// This call isn't thread-safe for use from a non-UI thread without locking the message\r
// manager first..\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
bool ok = false;\r
ApplicationCommandInfo commandInfo (0);\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
if (componentName != name)\r
{\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
const WeakReference<Component> safePointer (this);\r
flags.visibleFlag = shouldBeVisible;\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
if (isOpaque())\r
styleWanted &= ~ComponentPeer::windowIsSemiTransparent;\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
if (flags.hasHeavyweightPeerFlag)\r
{\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
if (flags.hasHeavyweightPeerFlag)\r
{\r
\r
Rectangle<int> Component::getParentMonitorArea() const\r
{\r
- return Desktop::getInstance().getDisplays().findDisplayForRect (getScreenBounds()).userArea;\r
+ return Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre()).userArea;\r
}\r
\r
int Component::getScreenX() const { return getScreenPosition().x; }\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
if (w < 0) w = 0;\r
if (h < 0) h = 0;\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
-\r
- jassert (this != &child); // adding a component to itself!?\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
if (child.parentComponent != this)\r
{\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN\r
\r
auto* child = childComponentList [index];\r
\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
if (! isCurrentlyModal (false))\r
{\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
if (flags.visibleFlag)\r
{\r
LookAndFeel& Component::getLookAndFeel() const noexcept\r
{\r
for (auto* c = this; c != nullptr; c = c->parentComponent)\r
- if (auto lf = c->lookAndFeel.get())\r
- return *lf;\r
+ if (c->lookAndFeel != nullptr)\r
+ return *(c->lookAndFeel);\r
\r
return LookAndFeel::getDefaultLookAndFeel();\r
}\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS\r
+ #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS\r
if (getParentComponent() != nullptr)\r
- {\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- }\r
- #endif\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED;\r
+ #endif\r
\r
componentListeners.add (newListener);\r
}\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
// If you register a component as a mouselistener for itself, it'll receive all the events\r
// twice - once via the direct callback that all components get anyway, and then again as a listener!\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
if (mouseListeners != nullptr)\r
mouseListeners->removeListener (listenerToRemove);\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
grabFocusInternal (focusChangedDirectly, true);\r
\r
{\r
// if component methods are being called from threads other than the message\r
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
\r
if (parentComponent != nullptr)\r
{\r
and you can test whether it's null before using it to see if something has deleted\r
it.\r
\r
- The ComponentType template parameter must be Component, or some subclass of Component.\r
+ The ComponentType typedef must be Component, or some subclass of Component.\r
\r
You may also want to use a WeakReference<Component> object for the same purpose.\r
*/\r
std::unique_ptr<CachedComponentImage> cachedImage;\r
\r
class MouseListenerList;\r
+ friend class MouseListenerList;\r
+ friend struct ContainerDeletePolicy<MouseListenerList>;\r
std::unique_ptr<MouseListenerList> mouseListeners;\r
std::unique_ptr<Array<KeyListener*>> keyListeners;\r
ListenerList<ComponentListener> componentListeners;\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2017 - ROLI Ltd.\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+ 27th April 2017).\r
+\r
+ End User License Agreement: www.juce.com/juce-5-licence\r
+ Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+Desktop::Desktop()\r
+ : mouseSources (new MouseInputSource::SourceList()),\r
+ masterScaleFactor ((float) getDefaultMasterScale())\r
+{\r
+ displays.reset (new Displays (*this));\r
+}\r
+\r
+Desktop::~Desktop()\r
+{\r
+ setScreenSaverEnabled (true);\r
+ animator.cancelAllAnimations (false);\r
+\r
+ jassert (instance == this);\r
+ instance = nullptr;\r
+\r
+ // doh! If you don't delete all your windows before exiting, you're going to\r
+ // be leaking memory!\r
+ jassert (desktopComponents.size() == 0);\r
+}\r
+\r
+Desktop& JUCE_CALLTYPE Desktop::getInstance()\r
+{\r
+ if (instance == nullptr)\r
+ instance = new Desktop();\r
+\r
+ return *instance;\r
+}\r
+\r
+Desktop* Desktop::instance = nullptr;\r
+\r
+//==============================================================================\r
+int Desktop::getNumComponents() const noexcept\r
+{\r
+ return desktopComponents.size();\r
+}\r
+\r
+Component* Desktop::getComponent (int index) const noexcept\r
+{\r
+ return desktopComponents [index];\r
+}\r
+\r
+Component* Desktop::findComponentAt (Point<int> screenPosition) const\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+ for (int i = desktopComponents.size(); --i >= 0;)\r
+ {\r
+ auto* c = desktopComponents.getUnchecked(i);\r
+\r
+ if (c->isVisible())\r
+ {\r
+ auto relative = c->getLocalPoint (nullptr, screenPosition);\r
+\r
+ if (c->contains (relative))\r
+ return c->getComponentAt (relative);\r
+ }\r
+ }\r
+\r
+ return nullptr;\r
+}\r
+\r
+//==============================================================================\r
+LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept\r
+{\r
+ if (currentLookAndFeel == nullptr)\r
+ {\r
+ if (defaultLookAndFeel == nullptr)\r
+ defaultLookAndFeel.reset (new LookAndFeel_V4());\r
+\r
+ currentLookAndFeel = defaultLookAndFeel.get();\r
+ }\r
+\r
+ return *currentLookAndFeel;\r
+}\r
+\r
+void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ currentLookAndFeel = newDefaultLookAndFeel;\r
+\r
+ for (int i = getNumComponents(); --i >= 0;)\r
+ if (auto* c = getComponent (i))\r
+ c->sendLookAndFeelChange();\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::addDesktopComponent (Component* c)\r
+{\r
+ jassert (c != nullptr);\r
+ jassert (! desktopComponents.contains (c));\r
+ desktopComponents.addIfNotAlreadyThere (c);\r
+}\r
+\r
+void Desktop::removeDesktopComponent (Component* c)\r
+{\r
+ desktopComponents.removeFirstMatchingValue (c);\r
+}\r
+\r
+void Desktop::componentBroughtToFront (Component* c)\r
+{\r
+ auto index = desktopComponents.indexOf (c);\r
+ jassert (index >= 0);\r
+\r
+ if (index >= 0)\r
+ {\r
+ int newIndex = -1;\r
+\r
+ if (! c->isAlwaysOnTop())\r
+ {\r
+ newIndex = desktopComponents.size();\r
+\r
+ while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())\r
+ --newIndex;\r
+\r
+ --newIndex;\r
+ }\r
+\r
+ desktopComponents.move (index, newIndex);\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+Point<int> Desktop::getMousePosition()\r
+{\r
+ return getMousePositionFloat().roundToInt();\r
+}\r
+\r
+Point<float> Desktop::getMousePositionFloat()\r
+{\r
+ return getInstance().getMainMouseSource().getScreenPosition();\r
+}\r
+\r
+void Desktop::setMousePosition (Point<int> newPosition)\r
+{\r
+ getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());\r
+}\r
+\r
+Point<int> Desktop::getLastMouseDownPosition()\r
+{\r
+ return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();\r
+}\r
+\r
+int Desktop::getMouseButtonClickCounter() const noexcept { return mouseClickCounter; }\r
+int Desktop::getMouseWheelMoveCounter() const noexcept { return mouseWheelCounter; }\r
+\r
+void Desktop::incrementMouseClickCounter() noexcept { ++mouseClickCounter; }\r
+void Desktop::incrementMouseWheelCounter() noexcept { ++mouseWheelCounter; }\r
+\r
+const Array<MouseInputSource>& Desktop::getMouseSources() const noexcept { return mouseSources->sourceArray; }\r
+int Desktop::getNumMouseSources() const noexcept { return mouseSources->sources.size(); }\r
+int Desktop::getNumDraggingMouseSources() const noexcept { return mouseSources->getNumDraggingMouseSources(); }\r
+MouseInputSource* Desktop::getMouseSource (int index) const noexcept { return mouseSources->getMouseSource (index); }\r
+MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept { return mouseSources->getDraggingMouseSource (index); }\r
+MouseInputSource Desktop::getMainMouseSource() const noexcept { return MouseInputSource (mouseSources->sources.getUnchecked(0)); }\r
+void Desktop::beginDragAutoRepeat (int interval) { mouseSources->beginDragAutoRepeat (interval); }\r
+\r
+//==============================================================================\r
+void Desktop::addFocusChangeListener (FocusChangeListener* l) { focusListeners.add (l); }\r
+void Desktop::removeFocusChangeListener (FocusChangeListener* l) { focusListeners.remove (l); }\r
+void Desktop::triggerFocusCallback() { triggerAsyncUpdate(); }\r
+\r
+void Desktop::handleAsyncUpdate()\r
+{\r
+ // The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
+ // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).\r
+ WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent());\r
+ focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus); });\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::resetTimer()\r
+{\r
+ if (mouseListeners.size() == 0)\r
+ stopTimer();\r
+ else\r
+ startTimer (100);\r
+\r
+ lastFakeMouseMove = getMousePositionFloat();\r
+}\r
+\r
+ListenerList<MouseListener>& Desktop::getMouseListeners()\r
+{\r
+ resetTimer();\r
+ return mouseListeners;\r
+}\r
+\r
+void Desktop::addGlobalMouseListener (MouseListener* listener)\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ mouseListeners.add (listener);\r
+ resetTimer();\r
+}\r
+\r
+void Desktop::removeGlobalMouseListener (MouseListener* listener)\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ mouseListeners.remove (listener);\r
+ resetTimer();\r
+}\r
+\r
+void Desktop::timerCallback()\r
+{\r
+ if (lastFakeMouseMove != getMousePositionFloat())\r
+ sendMouseMove();\r
+}\r
+\r
+void Desktop::sendMouseMove()\r
+{\r
+ if (! mouseListeners.isEmpty())\r
+ {\r
+ startTimer (20);\r
+\r
+ lastFakeMouseMove = getMousePositionFloat();\r
+\r
+ if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))\r
+ {\r
+ Component::BailOutChecker checker (target);\r
+ auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);\r
+ auto now = Time::getCurrentTime();\r
+\r
+ const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
+ MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
+ MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
+ target, target, now, pos, now, 0, false);\r
+\r
+ if (me.mods.isAnyMouseButtonDown())\r
+ mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });\r
+ else\r
+ mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });\r
+ }\r
+ }\r
+}\r
+\r
+\r
+//==============================================================================\r
+Desktop::Displays::Displays (Desktop& desktop) { init (desktop); }\r
+Desktop::Displays::~Displays() {}\r
+\r
+const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (displays.getReference(0).isMain);\r
+ return displays.getReference(0);\r
+}\r
+\r
+const Desktop::Displays::Display& Desktop::Displays::getDisplayContaining (Point<int> position) const noexcept\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ auto* best = &displays.getReference(0);\r
+ double bestDistance = 1.0e10;\r
+\r
+ for (auto& d : displays)\r
+ {\r
+ if (d.totalArea.contains (position))\r
+ {\r
+ best = &d;\r
+ break;\r
+ }\r
+\r
+ auto distance = d.totalArea.getCentre().getDistanceFrom (position);\r
+\r
+ if (distance < bestDistance)\r
+ {\r
+ bestDistance = distance;\r
+ best = &d;\r
+ }\r
+ }\r
+\r
+ return *best;\r
+}\r
+\r
+RectangleList<int> Desktop::Displays::getRectangleList (bool userAreasOnly) const\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ RectangleList<int> rl;\r
+\r
+ for (auto& d : displays)\r
+ rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea);\r
+\r
+ return rl;\r
+}\r
+\r
+Rectangle<int> Desktop::Displays::getTotalBounds (bool userAreasOnly) const\r
+{\r
+ return getRectangleList (userAreasOnly).getBounds();\r
+}\r
+\r
+bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;\r
+bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept\r
+{\r
+ return d1.userArea == d2.userArea\r
+ && d1.totalArea == d2.totalArea\r
+ && d1.scale == d2.scale\r
+ && d1.isMain == d2.isMain;\r
+}\r
+\r
+bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;\r
+bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept\r
+{\r
+ return ! (d1 == d2);\r
+}\r
+\r
+void Desktop::Displays::init (Desktop& desktop)\r
+{\r
+ findDisplays (desktop.getGlobalScaleFactor());\r
+}\r
+\r
+void Desktop::Displays::refresh()\r
+{\r
+ Array<Display> oldDisplays;\r
+ oldDisplays.swapWith (displays);\r
+\r
+ init (Desktop::getInstance());\r
+\r
+ if (oldDisplays != displays)\r
+ {\r
+ for (int i = ComponentPeer::getNumPeers(); --i >= 0;)\r
+ if (auto* peer = ComponentPeer::getPeer (i))\r
+ peer->handleScreenSizeChange();\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)\r
+{\r
+ if (kioskModeReentrant)\r
+ return;\r
+\r
+ const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);\r
+\r
+ if (kioskModeComponent != componentToUse)\r
+ {\r
+ // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!\r
+ jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
+\r
+ if (auto* oldKioskComp = kioskModeComponent)\r
+ {\r
+ kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)\r
+ setKioskComponent (oldKioskComp, false, allowMenusAndBars);\r
+ oldKioskComp->setBounds (kioskComponentOriginalBounds);\r
+ }\r
+\r
+ kioskModeComponent = componentToUse;\r
+\r
+ if (kioskModeComponent != nullptr)\r
+ {\r
+ // Only components that are already on the desktop can be put into kiosk mode!\r
+ jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
+\r
+ kioskComponentOriginalBounds = kioskModeComponent->getBounds();\r
+ setKioskComponent (kioskModeComponent, true, allowMenusAndBars);\r
+ }\r
+ }\r
+}\r
+\r
+//==============================================================================\r
+void Desktop::setOrientationsEnabled (int newOrientations)\r
+{\r
+ if (allowedOrientations != newOrientations)\r
+ {\r
+ // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.\r
+ jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);\r
+\r
+ allowedOrientations = newOrientations;\r
+ allowedOrientationsChanged();\r
+ }\r
+}\r
+\r
+int Desktop::getOrientationsEnabled() const noexcept\r
+{\r
+ return allowedOrientations;\r
+}\r
+\r
+bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept\r
+{\r
+ // Make sure you only pass one valid flag in here...\r
+ jassert (orientation == upright || orientation == upsideDown\r
+ || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);\r
+\r
+ return (allowedOrientations & orientation) != 0;\r
+}\r
+\r
+void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept\r
+{\r
+ ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+\r
+ if (masterScaleFactor != newScaleFactor)\r
+ {\r
+ masterScaleFactor = newScaleFactor;\r
+ displays->refresh();\r
+ }\r
+}\r
+\r
+} // namespace juce\r
--- /dev/null
+/*\r
+ ==============================================================================\r
+\r
+ This file is part of the JUCE library.\r
+ Copyright (c) 2017 - ROLI Ltd.\r
+\r
+ JUCE is an open source library subject to commercial or open-source\r
+ licensing.\r
+\r
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+ 27th April 2017).\r
+\r
+ End User License Agreement: www.juce.com/juce-5-licence\r
+ Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+ Or: You may also use this code under the terms of the GPL v3 (see\r
+ www.gnu.org/licenses).\r
+\r
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+ DISCLAIMED.\r
+\r
+ ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+//==============================================================================\r
+/**\r
+ Classes can implement this interface and register themselves with the Desktop class\r
+ to receive callbacks when the currently focused component changes.\r
+\r
+ @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener\r
+\r
+ @tags{GUI}\r
+*/\r
+class JUCE_API FocusChangeListener\r
+{\r
+public:\r
+ /** Destructor. */\r
+ virtual ~FocusChangeListener() {}\r
+\r
+ /** Callback to indicate that the currently focused component has changed. */\r
+ virtual void globalFocusChanged (Component* focusedComponent) = 0;\r
+};\r
+\r
+\r
+//==============================================================================\r
+/**\r
+ Describes and controls aspects of the computer's desktop.\r
+\r
+\r
+ @tags{GUI}\r
+*/\r
+class JUCE_API Desktop : private DeletedAtShutdown,\r
+ private Timer,\r
+ private AsyncUpdater\r
+{\r
+public:\r
+ //==============================================================================\r
+ /** There's only one desktop object, and this method will return it. */\r
+ static Desktop& JUCE_CALLTYPE getInstance();\r
+\r
+ //==============================================================================\r
+ /** Returns the mouse position.\r
+\r
+ The coordinates are relative to the top-left of the main monitor.\r
+\r
+ Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and\r
+ you should only resort to grabbing the global mouse position if there's really no\r
+ way to get the coordinates via a mouse event callback instead.\r
+ */\r
+ static Point<int> getMousePosition();\r
+\r
+ /** Makes the mouse pointer jump to a given location.\r
+ The coordinates are relative to the top-left of the main monitor.\r
+ Note that this is a pretty old method, kept around mainly for backwards-compatibility,\r
+ and you should use the MouseInputSource class directly in new code.\r
+ */\r
+ static void setMousePosition (Point<int> newPosition);\r
+\r
+ /** Returns the last position at which a mouse button was pressed.\r
+\r
+ Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(),\r
+ and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to\r
+ get this information via other means, such as MouseEvent::getMouseDownScreenPosition()\r
+ if possible, and only ever call this as a last resort.\r
+ */\r
+ static Point<int> getLastMouseDownPosition();\r
+\r
+ /** Returns the number of times the mouse button has been clicked since the app started.\r
+ Each mouse-down event increments this number by 1.\r
+ @see getMouseWheelMoveCounter\r
+ */\r
+ int getMouseButtonClickCounter() const noexcept;\r
+\r
+ /** Returns the number of times the mouse wheel has been moved since the app started.\r
+ Each mouse-wheel event increments this number by 1.\r
+ @see getMouseButtonClickCounter\r
+ */\r
+ int getMouseWheelMoveCounter() const noexcept;\r
+\r
+ //==============================================================================\r
+ /** This lets you prevent the screensaver from becoming active.\r
+\r
+ Handy if you're running some sort of presentation app where having a screensaver\r
+ appear would be annoying.\r
+\r
+ Pass false to disable the screensaver, and true to re-enable it. (Note that this\r
+ won't enable a screensaver unless the user has actually set one up).\r
+\r
+ The disablement will only happen while the JUCE application is the foreground\r
+ process - if another task is running in front of it, then the screensaver will\r
+ be unaffected.\r
+\r
+ @see isScreenSaverEnabled\r
+ */\r
+ static void setScreenSaverEnabled (bool isEnabled);\r
+\r
+ /** Returns true if the screensaver has not been turned off.\r
+\r
+ This will return the last value passed into setScreenSaverEnabled(). Note that\r
+ it won't tell you whether the user is actually using a screen saver, just\r
+ whether this app is deliberately preventing one from running.\r
+\r
+ @see setScreenSaverEnabled\r
+ */\r
+ static bool isScreenSaverEnabled();\r
+\r
+ //==============================================================================\r
+ /** Registers a MouseListener that will receive all mouse events that occur on\r
+ any component.\r
+\r
+ @see removeGlobalMouseListener\r
+ */\r
+ void addGlobalMouseListener (MouseListener* listener);\r
+\r
+ /** Unregisters a MouseListener that was added with the addGlobalMouseListener()\r
+ method.\r
+\r
+ @see addGlobalMouseListener\r
+ */\r
+ void removeGlobalMouseListener (MouseListener* listener);\r
+\r
+ //==============================================================================\r
+ /** Registers a MouseListener that will receive a callback whenever the focused\r
+ component changes.\r
+ */\r
+ void addFocusChangeListener (FocusChangeListener* listener);\r
+\r
+ /** Unregisters a listener that was added with addFocusChangeListener(). */\r
+ void removeFocusChangeListener (FocusChangeListener* listener);\r
+\r
+ //==============================================================================\r
+ /** Takes a component and makes it full-screen, removing the taskbar, dock, etc.\r
+\r
+ The component must already be on the desktop for this method to work. It will\r
+ be resized to completely fill the screen and any extraneous taskbars, menu bars,\r
+ etc will be hidden.\r
+\r
+ To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called,\r
+ the component that's currently being used will be resized back to the size\r
+ and position it was in before being put into this mode.\r
+\r
+ If allowMenusAndBars is true, things like the menu and dock (on mac) are still\r
+ allowed to pop up when the mouse moves onto them. If this is false, it'll try\r
+ to hide as much on-screen paraphernalia as possible.\r
+ */\r
+ void setKioskModeComponent (Component* componentToUse,\r
+ bool allowMenusAndBars = true);\r
+\r
+ /** Returns the component that is currently being used in kiosk-mode.\r
+\r
+ This is the component that was last set by setKioskModeComponent(). If none\r
+ has been set, this returns nullptr.\r
+ */\r
+ Component* getKioskModeComponent() const noexcept { return kioskModeComponent; }\r
+\r
+ //==============================================================================\r
+ /** Returns the number of components that are currently active as top-level\r
+ desktop windows.\r
+\r
+ @see getComponent, Component::addToDesktop\r
+ */\r
+ int getNumComponents() const noexcept;\r
+\r
+ /** Returns one of the top-level desktop window components.\r
+\r
+ The index is from 0 to getNumComponents() - 1. This could return 0 if the\r
+ index is out-of-range.\r
+\r
+ @see getNumComponents, Component::addToDesktop\r
+ */\r
+ Component* getComponent (int index) const noexcept;\r
+\r
+ /** Finds the component at a given screen location.\r
+\r
+ This will drill down into top-level windows to find the child component at\r
+ the given position.\r
+\r
+ Returns nullptr if the coordinates are inside a non-JUCE window.\r
+ */\r
+ Component* findComponentAt (Point<int> screenPosition) const;\r
+\r
+ /** The Desktop object has a ComponentAnimator instance which can be used for performing\r
+ your animations.\r
+\r
+ Having a single shared ComponentAnimator object makes it more efficient when multiple\r
+ components are being moved around simultaneously. It's also more convenient than having\r
+ to manage your own instance of one.\r
+\r
+ @see ComponentAnimator\r
+ */\r
+ ComponentAnimator& getAnimator() noexcept { return animator; }\r
+\r
+ //==============================================================================\r
+ /** Returns the current default look-and-feel for components which don't have one\r
+ explicitly set.\r
+ @see setDefaultLookAndFeel\r
+ */\r
+ LookAndFeel& getDefaultLookAndFeel() noexcept;\r
+\r
+ /** Changes the default look-and-feel.\r
+ @param newDefaultLookAndFeel the new look-and-feel object to use - if this is\r
+ set to nullptr, it will revert to using the system's\r
+ default one. The object passed-in must be deleted by the\r
+ caller when it's no longer needed.\r
+ @see getDefaultLookAndFeel\r
+ */\r
+ void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel);\r
+\r
+ //==============================================================================\r
+ /** Provides access to the array of mouse sources, for iteration.\r
+ In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
+ multi-touch system, there could be one input source per potential finger. The number\r
+ of mouse sources returned here may increase dynamically as the program runs.\r
+ To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
+ */\r
+ const Array<MouseInputSource>& getMouseSources() const noexcept;\r
+\r
+ /** Returns the number of MouseInputSource objects the system has at its disposal.\r
+ In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
+ multi-touch system, there could be one input source per potential finger. The number\r
+ of mouse sources returned here may increase dynamically as the program runs.\r
+ To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
+ @see getMouseSource\r
+ */\r
+ int getNumMouseSources() const noexcept;\r
+\r
+ /** Returns one of the system's MouseInputSource objects.\r
+ The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return\r
+ a null pointer.\r
+ In a traditional single-mouse system, there might be only one object. On a multi-touch\r
+ system, there could be one input source per potential finger.\r
+ */\r
+ MouseInputSource* getMouseSource (int index) const noexcept;\r
+\r
+ /** Returns the main mouse input device that the system is using.\r
+ @see getNumMouseSources()\r
+ */\r
+ MouseInputSource getMainMouseSource() const noexcept;\r
+\r
+ /** Returns the number of mouse-sources that are currently being dragged.\r
+ In a traditional single-mouse system, this will be 0 or 1, depending on whether a\r
+ JUCE component has the button down on it. In a multi-touch system, this could\r
+ be any number from 0 to the number of simultaneous touches that can be detected.\r
+ */\r
+ int getNumDraggingMouseSources() const noexcept;\r
+\r
+ /** Returns one of the mouse sources that's currently being dragged.\r
+ The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is\r
+ out of range, or if no mice or fingers are down, this will return a null pointer.\r
+ */\r
+ MouseInputSource* getDraggingMouseSource (int index) const noexcept;\r
+\r
+ /** Ensures that a non-stop stream of mouse-drag events will be sent during the\r
+ current mouse-drag operation.\r
+\r
+ This allows you to make sure that mouseDrag() events are sent continuously, even\r
+ when the mouse isn't moving. This can be useful for things like auto-scrolling\r
+ components when the mouse is near an edge.\r
+\r
+ Call this method during a mouseDown() or mouseDrag() callback, specifying the\r
+ minimum interval between consecutive mouse drag callbacks. The callbacks\r
+ will continue until the mouse is released, and then the interval will be reset,\r
+ so you need to make sure it's called every time you begin a drag event.\r
+ Passing an interval of 0 or less will cancel the auto-repeat.\r
+\r
+ @see mouseDrag\r
+ */\r
+ void beginDragAutoRepeat (int millisecondsBetweenCallbacks);\r
+\r
+ //==============================================================================\r
+ /** In a tablet/mobile device which can be turned around, this is used to indicate the orientation. */\r
+ enum DisplayOrientation\r
+ {\r
+ upright = 1, /**< Indicates that the device is the normal way up. */\r
+ upsideDown = 2, /**< Indicates that the device is upside-down. */\r
+ rotatedClockwise = 4, /**< Indicates that the device is turned 90 degrees clockwise from its upright position. */\r
+ rotatedAntiClockwise = 8, /**< Indicates that the device is turned 90 degrees anti-clockwise from its upright position. */\r
+\r
+ allOrientations = 1 + 2 + 4 + 8 /**< A combination of all the orientation values */\r
+ };\r
+\r
+ /** In a tablet device which can be turned around, this returns the current orientation. */\r
+ DisplayOrientation getCurrentOrientation() const;\r
+\r
+ /** Sets which orientations the display is allowed to auto-rotate to.\r
+\r
+ For devices that support rotating desktops, this lets you specify which of the orientations your app can use.\r
+\r
+ The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one\r
+ set bit.\r
+ */\r
+ void setOrientationsEnabled (int allowedOrientations);\r
+\r
+ /** Returns the set of orientations the display is allowed to rotate to.\r
+ @see setOrientationsEnabled\r
+ */\r
+ int getOrientationsEnabled() const noexcept;\r
+\r
+ /** Returns whether the display is allowed to auto-rotate to the given orientation.\r
+ Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed.\r
+ */\r
+ bool isOrientationEnabled (DisplayOrientation orientation) const noexcept;\r
+\r
+ //==============================================================================\r
+ /** Manages details about connected display devices */\r
+ class JUCE_API Displays\r
+ {\r
+ public:\r
+ /** Contains details about a display device. */\r
+ struct Display\r
+ {\r
+ /** This is the bounds of the area of this display which isn't covered by\r
+ OS-dependent objects like the taskbar, menu bar, etc. */\r
+ Rectangle<int> userArea;\r
+\r
+ /** This is the total physical area of this display, including any taskbars, etc */\r
+ Rectangle<int> totalArea;\r
+\r
+ /** This is the scale-factor of this display.\r
+ If you create a component with size 1x1, this scale factor indicates the actual\r
+ size of the component in terms of physical pixels.\r
+ For higher-resolution displays, it may be a value greater than 1.0\r
+ */\r
+ double scale;\r
+\r
+ /** The DPI of the display.\r
+ This is the number of physical pixels per inch. To get the number of logical\r
+ pixels per inch, divide this by the Display::scale value.\r
+ */\r
+ double dpi;\r
+\r
+ /** This will be true if this is the user's main screen. */\r
+ bool isMain;\r
+ };\r
+\r
+ /** Returns the display which acts as user's main screen. */\r
+ const Display& getMainDisplay() const noexcept;\r
+\r
+ /** Returns the display which contains a particular point.\r
+ If the point lies outside all the displays, the nearest one will be returned.\r
+ */\r
+ const Display& getDisplayContaining (Point<int> position) const noexcept;\r
+\r
+ /** Returns a RectangleList made up of all the displays. */\r
+ RectangleList<int> getRectangleList (bool userAreasOnly) const;\r
+\r
+ /** Returns the smallest bounding box which contains all the displays. */\r
+ Rectangle<int> getTotalBounds (bool userAreasOnly) const;\r
+\r
+ /** The list of displays. */\r
+ Array<Display> displays;\r
+\r
+ #ifndef DOXYGEN\r
+ /** @internal */\r
+ void refresh();\r
+ /** @internal */\r
+ ~Displays();\r
+ #endif\r
+\r
+ private:\r
+ friend class Desktop;\r
+ Displays (Desktop&);\r
+\r
+ void init (Desktop&);\r
+ void findDisplays (float masterScale);\r
+ };\r
+\r
+ const Displays& getDisplays() const noexcept { return *displays; }\r
+\r
+ //==============================================================================\r
+ /** Sets a global scale factor to be used for all desktop windows.\r
+ Setting this will also scale the monitor sizes that are returned by getDisplays().\r
+ */\r
+ void setGlobalScaleFactor (float newScaleFactor) noexcept;\r
+\r
+ /** Returns the current global scale factor, as set by setGlobalScaleFactor().\r
+ @see setGlobalScaleFactor\r
+ */\r
+ float getGlobalScaleFactor() const noexcept { return masterScaleFactor; }\r
+\r
+ //==============================================================================\r
+ /** True if the OS supports semitransparent windows */\r
+ static bool canUseSemiTransparentWindows() noexcept;\r
+\r
+ #if JUCE_MAC\r
+ /** OSX-specific function to check for the "dark" title-bar and menu mode. */\r
+ static bool isOSXDarkModeActive();\r
+ #endif\r
+\r
+private:\r
+ //==============================================================================\r
+ static Desktop* instance;\r
+\r
+ friend class Component;\r
+ friend class ComponentPeer;\r
+ friend class MouseInputSourceInternal;\r
+ friend class DeletedAtShutdown;\r
+ friend class TopLevelWindowManager;\r
+\r
+ std::unique_ptr<MouseInputSource::SourceList> mouseSources;\r
+\r
+ ListenerList<MouseListener> mouseListeners;\r
+ ListenerList<FocusChangeListener> focusListeners;\r
+\r
+ Array<Component*> desktopComponents;\r
+ Array<ComponentPeer*> peers;\r
+\r
+ std::unique_ptr<Displays> displays;\r
+\r
+ Point<float> lastFakeMouseMove;\r
+ void sendMouseMove();\r
+\r
+ int mouseClickCounter = 0, mouseWheelCounter = 0;\r
+ void incrementMouseClickCounter() noexcept;\r
+ void incrementMouseWheelCounter() noexcept;\r
+\r
+ std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
+ WeakReference<LookAndFeel> currentLookAndFeel;\r
+\r
+ Component* kioskModeComponent = nullptr;\r
+ Rectangle<int> kioskComponentOriginalBounds;\r
+ bool kioskModeReentrant = false;\r
+\r
+ int allowedOrientations = allOrientations;\r
+ void allowedOrientationsChanged();\r
+\r
+ float masterScaleFactor;\r
+\r
+ ComponentAnimator animator;\r
+\r
+ void timerCallback() override;\r
+ void resetTimer();\r
+ ListenerList<MouseListener>& getMouseListeners();\r
+\r
+ void addDesktopComponent (Component*);\r
+ void removeDesktopComponent (Component*);\r
+ void componentBroughtToFront (Component*);\r
+\r
+ void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
+\r
+ void triggerFocusCallback();\r
+ void handleAsyncUpdate() override;\r
+\r
+ static Point<float> getMousePositionFloat();\r
+\r
+ static double getDefaultMasterScale();\r
+\r
+ Desktop();\r
+ ~Desktop();\r
+\r
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)\r
+};\r
+\r
+} // namespace juce\r
int ModalComponentManager::runEventLoopForCurrentComponent()\r
{\r
// This can only be run from the message thread!\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
int returnValue = 0;\r
\r
\r
private:\r
//==============================================================================\r
- friend class Component;\r
-\r
struct ModalItem;\r
+\r
+ friend class Component;\r
+ friend struct ContainerDeletePolicy<ModalItem>;\r
OwnedArray<ModalItem> stack;\r
\r
void startModal (Component*, bool autoDelete);\r
\r
@tags{GUI}\r
*/\r
-class JUCE_API ModalCallbackFunction\r
+class ModalCallbackFunction\r
{\r
public:\r
/** This is a utility function to create a ModalComponentManager::Callback that will\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-Desktop::Desktop()\r
- : mouseSources (new MouseInputSource::SourceList()),\r
- masterScaleFactor ((float) getDefaultMasterScale())\r
-{\r
- displays.reset (new Displays (*this));\r
-}\r
-\r
-Desktop::~Desktop()\r
-{\r
- setScreenSaverEnabled (true);\r
- animator.cancelAllAnimations (false);\r
-\r
- jassert (instance == this);\r
- instance = nullptr;\r
-\r
- // doh! If you don't delete all your windows before exiting, you're going to\r
- // be leaking memory!\r
- jassert (desktopComponents.size() == 0);\r
-}\r
-\r
-Desktop& JUCE_CALLTYPE Desktop::getInstance()\r
-{\r
- if (instance == nullptr)\r
- instance = new Desktop();\r
-\r
- return *instance;\r
-}\r
-\r
-Desktop* Desktop::instance = nullptr;\r
-\r
-//==============================================================================\r
-int Desktop::getNumComponents() const noexcept\r
-{\r
- return desktopComponents.size();\r
-}\r
-\r
-Component* Desktop::getComponent (int index) const noexcept\r
-{\r
- return desktopComponents [index];\r
-}\r
-\r
-Component* Desktop::findComponentAt (Point<int> screenPosition) const\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
- for (int i = desktopComponents.size(); --i >= 0;)\r
- {\r
- auto* c = desktopComponents.getUnchecked(i);\r
-\r
- if (c->isVisible())\r
- {\r
- auto relative = c->getLocalPoint (nullptr, screenPosition);\r
-\r
- if (c->contains (relative))\r
- return c->getComponentAt (relative);\r
- }\r
- }\r
-\r
- return nullptr;\r
-}\r
-\r
-//==============================================================================\r
-LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept\r
-{\r
- if (auto lf = currentLookAndFeel.get())\r
- return *lf;\r
-\r
- if (defaultLookAndFeel == nullptr)\r
- defaultLookAndFeel.reset (new LookAndFeel_V4());\r
-\r
- auto lf = defaultLookAndFeel.get();\r
- jassert (lf != nullptr);\r
- currentLookAndFeel = lf;\r
- return *lf;\r
-}\r
-\r
-void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- currentLookAndFeel = newDefaultLookAndFeel;\r
-\r
- for (int i = getNumComponents(); --i >= 0;)\r
- if (auto* c = getComponent (i))\r
- c->sendLookAndFeelChange();\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::addDesktopComponent (Component* c)\r
-{\r
- jassert (c != nullptr);\r
- jassert (! desktopComponents.contains (c));\r
- desktopComponents.addIfNotAlreadyThere (c);\r
-}\r
-\r
-void Desktop::removeDesktopComponent (Component* c)\r
-{\r
- desktopComponents.removeFirstMatchingValue (c);\r
-}\r
-\r
-void Desktop::componentBroughtToFront (Component* c)\r
-{\r
- auto index = desktopComponents.indexOf (c);\r
- jassert (index >= 0);\r
-\r
- if (index >= 0)\r
- {\r
- int newIndex = -1;\r
-\r
- if (! c->isAlwaysOnTop())\r
- {\r
- newIndex = desktopComponents.size();\r
-\r
- while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())\r
- --newIndex;\r
-\r
- --newIndex;\r
- }\r
-\r
- desktopComponents.move (index, newIndex);\r
- }\r
-}\r
-\r
-//==============================================================================\r
-Point<int> Desktop::getMousePosition()\r
-{\r
- return getMousePositionFloat().roundToInt();\r
-}\r
-\r
-Point<float> Desktop::getMousePositionFloat()\r
-{\r
- return getInstance().getMainMouseSource().getScreenPosition();\r
-}\r
-\r
-void Desktop::setMousePosition (Point<int> newPosition)\r
-{\r
- getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());\r
-}\r
-\r
-Point<int> Desktop::getLastMouseDownPosition()\r
-{\r
- return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();\r
-}\r
-\r
-int Desktop::getMouseButtonClickCounter() const noexcept { return mouseClickCounter; }\r
-int Desktop::getMouseWheelMoveCounter() const noexcept { return mouseWheelCounter; }\r
-\r
-void Desktop::incrementMouseClickCounter() noexcept { ++mouseClickCounter; }\r
-void Desktop::incrementMouseWheelCounter() noexcept { ++mouseWheelCounter; }\r
-\r
-const Array<MouseInputSource>& Desktop::getMouseSources() const noexcept { return mouseSources->sourceArray; }\r
-int Desktop::getNumMouseSources() const noexcept { return mouseSources->sources.size(); }\r
-int Desktop::getNumDraggingMouseSources() const noexcept { return mouseSources->getNumDraggingMouseSources(); }\r
-MouseInputSource* Desktop::getMouseSource (int index) const noexcept { return mouseSources->getMouseSource (index); }\r
-MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept { return mouseSources->getDraggingMouseSource (index); }\r
-MouseInputSource Desktop::getMainMouseSource() const noexcept { return MouseInputSource (mouseSources->sources.getUnchecked(0)); }\r
-void Desktop::beginDragAutoRepeat (int interval) { mouseSources->beginDragAutoRepeat (interval); }\r
-\r
-//==============================================================================\r
-void Desktop::addFocusChangeListener (FocusChangeListener* l) { focusListeners.add (l); }\r
-void Desktop::removeFocusChangeListener (FocusChangeListener* l) { focusListeners.remove (l); }\r
-void Desktop::triggerFocusCallback() { triggerAsyncUpdate(); }\r
-\r
-void Desktop::handleAsyncUpdate()\r
-{\r
- // The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
- // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).\r
- WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent());\r
- focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus.get()); });\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::resetTimer()\r
-{\r
- if (mouseListeners.size() == 0)\r
- stopTimer();\r
- else\r
- startTimer (100);\r
-\r
- lastFakeMouseMove = getMousePositionFloat();\r
-}\r
-\r
-ListenerList<MouseListener>& Desktop::getMouseListeners()\r
-{\r
- resetTimer();\r
- return mouseListeners;\r
-}\r
-\r
-void Desktop::addGlobalMouseListener (MouseListener* listener)\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- mouseListeners.add (listener);\r
- resetTimer();\r
-}\r
-\r
-void Desktop::removeGlobalMouseListener (MouseListener* listener)\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- mouseListeners.remove (listener);\r
- resetTimer();\r
-}\r
-\r
-void Desktop::timerCallback()\r
-{\r
- if (lastFakeMouseMove != getMousePositionFloat())\r
- sendMouseMove();\r
-}\r
-\r
-void Desktop::sendMouseMove()\r
-{\r
- if (! mouseListeners.isEmpty())\r
- {\r
- startTimer (20);\r
-\r
- lastFakeMouseMove = getMousePositionFloat();\r
-\r
- if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))\r
- {\r
- Component::BailOutChecker checker (target);\r
- auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);\r
- auto now = Time::getCurrentTime();\r
-\r
- const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,\r
- MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,\r
- MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,\r
- target, target, now, pos, now, 0, false);\r
-\r
- if (me.mods.isAnyMouseButtonDown())\r
- mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });\r
- else\r
- mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });\r
- }\r
- }\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)\r
-{\r
- if (kioskModeReentrant)\r
- return;\r
-\r
- const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);\r
-\r
- if (kioskModeComponent != componentToUse)\r
- {\r
- // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!\r
- jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
-\r
- if (auto* oldKioskComp = kioskModeComponent)\r
- {\r
- kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)\r
- setKioskComponent (oldKioskComp, false, allowMenusAndBars);\r
- oldKioskComp->setBounds (kioskComponentOriginalBounds);\r
- }\r
-\r
- kioskModeComponent = componentToUse;\r
-\r
- if (kioskModeComponent != nullptr)\r
- {\r
- // Only components that are already on the desktop can be put into kiosk mode!\r
- jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);\r
-\r
- kioskComponentOriginalBounds = kioskModeComponent->getBounds();\r
- setKioskComponent (kioskModeComponent, true, allowMenusAndBars);\r
- }\r
- }\r
-}\r
-\r
-//==============================================================================\r
-void Desktop::setOrientationsEnabled (int newOrientations)\r
-{\r
- if (allowedOrientations != newOrientations)\r
- {\r
- // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.\r
- jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);\r
-\r
- allowedOrientations = newOrientations;\r
- allowedOrientationsChanged();\r
- }\r
-}\r
-\r
-int Desktop::getOrientationsEnabled() const noexcept\r
-{\r
- return allowedOrientations;\r
-}\r
-\r
-bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept\r
-{\r
- // Make sure you only pass one valid flag in here...\r
- jassert (orientation == upright || orientation == upsideDown\r
- || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);\r
-\r
- return (allowedOrientations & orientation) != 0;\r
-}\r
-\r
-void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
- if (masterScaleFactor != newScaleFactor)\r
- {\r
- masterScaleFactor = newScaleFactor;\r
- displays->refresh();\r
- }\r
-}\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- Classes can implement this interface and register themselves with the Desktop class\r
- to receive callbacks when the currently focused component changes.\r
-\r
- @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener\r
-\r
- @tags{GUI}\r
-*/\r
-class JUCE_API FocusChangeListener\r
-{\r
-public:\r
- /** Destructor. */\r
- virtual ~FocusChangeListener() {}\r
-\r
- /** Callback to indicate that the currently focused component has changed. */\r
- virtual void globalFocusChanged (Component* focusedComponent) = 0;\r
-};\r
-\r
-\r
-//==============================================================================\r
-/**\r
- Describes and controls aspects of the computer's desktop.\r
-\r
- @tags{GUI}\r
-*/\r
-class JUCE_API Desktop : private DeletedAtShutdown,\r
- private Timer,\r
- private AsyncUpdater\r
-{\r
-public:\r
- //==============================================================================\r
- /** There's only one desktop object, and this method will return it. */\r
- static Desktop& JUCE_CALLTYPE getInstance();\r
-\r
- //==============================================================================\r
- /** Returns the mouse position.\r
-\r
- The coordinates are relative to the top-left of the main monitor.\r
-\r
- Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and\r
- you should only resort to grabbing the global mouse position if there's really no\r
- way to get the coordinates via a mouse event callback instead.\r
- */\r
- static Point<int> getMousePosition();\r
-\r
- /** Makes the mouse pointer jump to a given location.\r
- The coordinates are relative to the top-left of the main monitor.\r
- Note that this is a pretty old method, kept around mainly for backwards-compatibility,\r
- and you should use the MouseInputSource class directly in new code.\r
- */\r
- static void setMousePosition (Point<int> newPosition);\r
-\r
- /** Returns the last position at which a mouse button was pressed.\r
-\r
- Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(),\r
- and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to\r
- get this information via other means, such as MouseEvent::getMouseDownScreenPosition()\r
- if possible, and only ever call this as a last resort.\r
- */\r
- static Point<int> getLastMouseDownPosition();\r
-\r
- /** Returns the number of times the mouse button has been clicked since the app started.\r
- Each mouse-down event increments this number by 1.\r
- @see getMouseWheelMoveCounter\r
- */\r
- int getMouseButtonClickCounter() const noexcept;\r
-\r
- /** Returns the number of times the mouse wheel has been moved since the app started.\r
- Each mouse-wheel event increments this number by 1.\r
- @see getMouseButtonClickCounter\r
- */\r
- int getMouseWheelMoveCounter() const noexcept;\r
-\r
- //==============================================================================\r
- /** This lets you prevent the screensaver from becoming active.\r
-\r
- Handy if you're running some sort of presentation app where having a screensaver\r
- appear would be annoying.\r
-\r
- Pass false to disable the screensaver, and true to re-enable it. (Note that this\r
- won't enable a screensaver unless the user has actually set one up).\r
-\r
- The disablement will only happen while the JUCE application is the foreground\r
- process - if another task is running in front of it, then the screensaver will\r
- be unaffected.\r
-\r
- @see isScreenSaverEnabled\r
- */\r
- static void setScreenSaverEnabled (bool isEnabled);\r
-\r
- /** Returns true if the screensaver has not been turned off.\r
-\r
- This will return the last value passed into setScreenSaverEnabled(). Note that\r
- it won't tell you whether the user is actually using a screen saver, just\r
- whether this app is deliberately preventing one from running.\r
-\r
- @see setScreenSaverEnabled\r
- */\r
- static bool isScreenSaverEnabled();\r
-\r
- //==============================================================================\r
- /** Registers a MouseListener that will receive all mouse events that occur on\r
- any component.\r
-\r
- @see removeGlobalMouseListener\r
- */\r
- void addGlobalMouseListener (MouseListener* listener);\r
-\r
- /** Unregisters a MouseListener that was added with the addGlobalMouseListener()\r
- method.\r
-\r
- @see addGlobalMouseListener\r
- */\r
- void removeGlobalMouseListener (MouseListener* listener);\r
-\r
- //==============================================================================\r
- /** Registers a MouseListener that will receive a callback whenever the focused\r
- component changes.\r
- */\r
- void addFocusChangeListener (FocusChangeListener* listener);\r
-\r
- /** Unregisters a listener that was added with addFocusChangeListener(). */\r
- void removeFocusChangeListener (FocusChangeListener* listener);\r
-\r
- //==============================================================================\r
- /** Takes a component and makes it full-screen, removing the taskbar, dock, etc.\r
-\r
- The component must already be on the desktop for this method to work. It will\r
- be resized to completely fill the screen and any extraneous taskbars, menu bars,\r
- etc will be hidden.\r
-\r
- To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called,\r
- the component that's currently being used will be resized back to the size\r
- and position it was in before being put into this mode.\r
-\r
- If allowMenusAndBars is true, things like the menu and dock (on mac) are still\r
- allowed to pop up when the mouse moves onto them. If this is false, it'll try\r
- to hide as much on-screen paraphernalia as possible.\r
- */\r
- void setKioskModeComponent (Component* componentToUse,\r
- bool allowMenusAndBars = true);\r
-\r
- /** Returns the component that is currently being used in kiosk-mode.\r
-\r
- This is the component that was last set by setKioskModeComponent(). If none\r
- has been set, this returns nullptr.\r
- */\r
- Component* getKioskModeComponent() const noexcept { return kioskModeComponent; }\r
-\r
- //==============================================================================\r
- /** Returns the number of components that are currently active as top-level\r
- desktop windows.\r
-\r
- @see getComponent, Component::addToDesktop\r
- */\r
- int getNumComponents() const noexcept;\r
-\r
- /** Returns one of the top-level desktop window components.\r
-\r
- The index is from 0 to getNumComponents() - 1. This could return 0 if the\r
- index is out-of-range.\r
-\r
- @see getNumComponents, Component::addToDesktop\r
- */\r
- Component* getComponent (int index) const noexcept;\r
-\r
- /** Finds the component at a given screen location.\r
-\r
- This will drill down into top-level windows to find the child component at\r
- the given position.\r
-\r
- Returns nullptr if the coordinates are inside a non-JUCE window.\r
- */\r
- Component* findComponentAt (Point<int> screenPosition) const;\r
-\r
- /** The Desktop object has a ComponentAnimator instance which can be used for performing\r
- your animations.\r
-\r
- Having a single shared ComponentAnimator object makes it more efficient when multiple\r
- components are being moved around simultaneously. It's also more convenient than having\r
- to manage your own instance of one.\r
-\r
- @see ComponentAnimator\r
- */\r
- ComponentAnimator& getAnimator() noexcept { return animator; }\r
-\r
- //==============================================================================\r
- /** Returns the current default look-and-feel for components which don't have one\r
- explicitly set.\r
- @see setDefaultLookAndFeel\r
- */\r
- LookAndFeel& getDefaultLookAndFeel() noexcept;\r
-\r
- /** Changes the default look-and-feel.\r
- @param newDefaultLookAndFeel the new look-and-feel object to use - if this is\r
- set to nullptr, it will revert to using the system's\r
- default one. The object passed-in must be deleted by the\r
- caller when it's no longer needed.\r
- @see getDefaultLookAndFeel\r
- */\r
- void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel);\r
-\r
- //==============================================================================\r
- /** Provides access to the array of mouse sources, for iteration.\r
- In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
- multi-touch system, there could be one input source per potential finger. The number\r
- of mouse sources returned here may increase dynamically as the program runs.\r
- To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
- */\r
- const Array<MouseInputSource>& getMouseSources() const noexcept;\r
-\r
- /** Returns the number of MouseInputSource objects the system has at its disposal.\r
- In a traditional single-mouse system, there might be only one MouseInputSource. On a\r
- multi-touch system, there could be one input source per potential finger. The number\r
- of mouse sources returned here may increase dynamically as the program runs.\r
- To find out how many mouse events are currently happening, use getNumDraggingMouseSources().\r
- @see getMouseSource\r
- */\r
- int getNumMouseSources() const noexcept;\r
-\r
- /** Returns one of the system's MouseInputSource objects.\r
- The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return\r
- a null pointer.\r
- In a traditional single-mouse system, there might be only one object. On a multi-touch\r
- system, there could be one input source per potential finger.\r
- */\r
- MouseInputSource* getMouseSource (int index) const noexcept;\r
-\r
- /** Returns the main mouse input device that the system is using.\r
- @see getNumMouseSources()\r
- */\r
- MouseInputSource getMainMouseSource() const noexcept;\r
-\r
- /** Returns the number of mouse-sources that are currently being dragged.\r
- In a traditional single-mouse system, this will be 0 or 1, depending on whether a\r
- JUCE component has the button down on it. In a multi-touch system, this could\r
- be any number from 0 to the number of simultaneous touches that can be detected.\r
- */\r
- int getNumDraggingMouseSources() const noexcept;\r
-\r
- /** Returns one of the mouse sources that's currently being dragged.\r
- The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is\r
- out of range, or if no mice or fingers are down, this will return a null pointer.\r
- */\r
- MouseInputSource* getDraggingMouseSource (int index) const noexcept;\r
-\r
- /** Ensures that a non-stop stream of mouse-drag events will be sent during the\r
- current mouse-drag operation.\r
-\r
- This allows you to make sure that mouseDrag() events are sent continuously, even\r
- when the mouse isn't moving. This can be useful for things like auto-scrolling\r
- components when the mouse is near an edge.\r
-\r
- Call this method during a mouseDown() or mouseDrag() callback, specifying the\r
- minimum interval between consecutive mouse drag callbacks. The callbacks\r
- will continue until the mouse is released, and then the interval will be reset,\r
- so you need to make sure it's called every time you begin a drag event.\r
- Passing an interval of 0 or less will cancel the auto-repeat.\r
-\r
- @see mouseDrag\r
- */\r
- void beginDragAutoRepeat (int millisecondsBetweenCallbacks);\r
-\r
- //==============================================================================\r
- /** In a tablet/mobile device which can be turned around, this is used to indicate the orientation. */\r
- enum DisplayOrientation\r
- {\r
- upright = 1, /**< Indicates that the device is the normal way up. */\r
- upsideDown = 2, /**< Indicates that the device is upside-down. */\r
- rotatedClockwise = 4, /**< Indicates that the device is turned 90 degrees clockwise from its upright position. */\r
- rotatedAntiClockwise = 8, /**< Indicates that the device is turned 90 degrees anti-clockwise from its upright position. */\r
-\r
- allOrientations = 1 + 2 + 4 + 8 /**< A combination of all the orientation values */\r
- };\r
-\r
- /** In a tablet device which can be turned around, this returns the current orientation. */\r
- DisplayOrientation getCurrentOrientation() const;\r
-\r
- /** Sets which orientations the display is allowed to auto-rotate to.\r
-\r
- For devices that support rotating desktops, this lets you specify which of the orientations your app can use.\r
-\r
- The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one\r
- set bit.\r
- */\r
- void setOrientationsEnabled (int allowedOrientations);\r
-\r
- /** Returns the set of orientations the display is allowed to rotate to.\r
- @see setOrientationsEnabled\r
- */\r
- int getOrientationsEnabled() const noexcept;\r
-\r
- /** Returns whether the display is allowed to auto-rotate to the given orientation.\r
- Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed.\r
- */\r
- bool isOrientationEnabled (DisplayOrientation orientation) const noexcept;\r
-\r
- //==============================================================================\r
- const Displays& getDisplays() const noexcept { return *displays; }\r
-\r
- //==============================================================================\r
- /** Sets a global scale factor to be used for all desktop windows.\r
- Setting this will also scale the monitor sizes that are returned by getDisplays().\r
- */\r
- void setGlobalScaleFactor (float newScaleFactor) noexcept;\r
-\r
- /** Returns the current global scale factor, as set by setGlobalScaleFactor().\r
- @see setGlobalScaleFactor\r
- */\r
- float getGlobalScaleFactor() const noexcept { return masterScaleFactor; }\r
-\r
- //==============================================================================\r
- /** True if the OS supports semitransparent windows */\r
- static bool canUseSemiTransparentWindows() noexcept;\r
-\r
- #if JUCE_MAC\r
- /** OSX-specific function to check for the "dark" title-bar and menu mode. */\r
- static bool isOSXDarkModeActive();\r
- #endif\r
-\r
-private:\r
- //==============================================================================\r
- static Desktop* instance;\r
-\r
- friend class Component;\r
- friend class ComponentPeer;\r
- friend class MouseInputSourceInternal;\r
- friend class DeletedAtShutdown;\r
- friend class TopLevelWindowManager;\r
- friend class Displays;\r
-\r
- std::unique_ptr<MouseInputSource::SourceList> mouseSources;\r
-\r
- ListenerList<MouseListener> mouseListeners;\r
- ListenerList<FocusChangeListener> focusListeners;\r
-\r
- Array<Component*> desktopComponents;\r
- Array<ComponentPeer*> peers;\r
-\r
- std::unique_ptr<Displays> displays;\r
-\r
- Point<float> lastFakeMouseMove;\r
- void sendMouseMove();\r
-\r
- int mouseClickCounter = 0, mouseWheelCounter = 0;\r
- void incrementMouseClickCounter() noexcept;\r
- void incrementMouseWheelCounter() noexcept;\r
-\r
- std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
- WeakReference<LookAndFeel> currentLookAndFeel;\r
-\r
- Component* kioskModeComponent = nullptr;\r
- Rectangle<int> kioskComponentOriginalBounds;\r
- bool kioskModeReentrant = false;\r
-\r
- int allowedOrientations = allOrientations;\r
- void allowedOrientationsChanged();\r
-\r
- float masterScaleFactor;\r
-\r
- ComponentAnimator animator;\r
-\r
- void timerCallback() override;\r
- void resetTimer();\r
- ListenerList<MouseListener>& getMouseListeners();\r
-\r
- void addDesktopComponent (Component*);\r
- void removeDesktopComponent (Component*);\r
- void componentBroughtToFront (Component*);\r
-\r
- void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
-\r
- void triggerFocusCallback();\r
- void handleAsyncUpdate() override;\r
-\r
- static Point<float> getMousePositionFloat();\r
-\r
- static double getDefaultMasterScale();\r
-\r
- Desktop();\r
- ~Desktop();\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)\r
-};\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-Displays::Displays (Desktop& desktop)\r
-{\r
- init (desktop);\r
-}\r
-\r
-void Displays::init (Desktop& desktop)\r
-{\r
- findDisplays (desktop.getGlobalScaleFactor());\r
-}\r
-\r
-const Displays::Display& Displays::findDisplayForRect (Rectangle<int> rect, bool isPhysical) const noexcept\r
-{\r
- int maxArea = -1;\r
- Display* retVal = nullptr;\r
-\r
- for (auto& display : displays)\r
- {\r
- auto displayArea = display.totalArea;\r
-\r
- if (isPhysical)\r
- displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;\r
-\r
- displayArea = displayArea.getIntersection (rect);\r
- auto area = displayArea.getWidth() * displayArea.getHeight();\r
-\r
- if (area >= maxArea)\r
- {\r
- maxArea = area;\r
- retVal = &display;\r
- }\r
- }\r
-\r
- return *retVal;\r
-}\r
-\r
-const Displays::Display& Displays::findDisplayForPoint (Point<int> point, bool isPhysical) const noexcept\r
-{\r
- auto minDistance = std::numeric_limits<int>::max();\r
- Display* retVal = nullptr;\r
-\r
- for (auto& display : displays)\r
- {\r
- auto displayArea = display.totalArea;\r
-\r
- if (isPhysical)\r
- displayArea = (displayArea.withZeroOrigin() * display.scale) + display.topLeftPhysical;\r
-\r
- if (displayArea.contains (point))\r
- return display;\r
-\r
- auto distance = displayArea.getCentre().getDistanceFrom (point);\r
- if (distance <= minDistance)\r
- {\r
- minDistance = distance;\r
- retVal = &display;\r
- }\r
- }\r
-\r
- return *retVal;\r
-}\r
-\r
-Rectangle<int> Displays::physicalToLogical (Rectangle<int> rect, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
- auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
- : findDisplayForRect (rect, true);\r
-\r
- auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
- return ((rect.toFloat() - display.topLeftPhysical.toFloat()) / (display.scale / globalScale)).toNearestInt() + (display.totalArea.getTopLeft() * globalScale);\r
-}\r
-\r
-Rectangle<int> Displays::logicalToPhysical (Rectangle<int> rect, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
- auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
- : findDisplayForRect (rect, false);\r
-\r
- auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
- return ((rect.toFloat() - (display.totalArea.getTopLeft().toFloat() * globalScale)) * (display.scale / globalScale)).toNearestInt() + display.topLeftPhysical;\r
-}\r
-\r
-template <typename ValueType>\r
-Point<ValueType> Displays::physicalToLogical (Point<ValueType> point, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
- auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
- : findDisplayForPoint (point.roundToInt(), true);\r
-\r
- auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
- Point<ValueType> logicalTopLeft (display.totalArea.getX(), display.totalArea.getY());\r
- Point<ValueType> physicalTopLeft (display.topLeftPhysical.getX(), display.topLeftPhysical.getY());\r
-\r
- return ((point - physicalTopLeft) / (display.scale / globalScale)) + (logicalTopLeft * globalScale);\r
-}\r
-\r
-template <typename ValueType>\r
-Point<ValueType> Displays::logicalToPhysical (Point<ValueType> point, const Display* useScaleFactorOfDisplay) const noexcept\r
-{\r
- auto& display = useScaleFactorOfDisplay != nullptr ? *useScaleFactorOfDisplay\r
- : findDisplayForPoint (point.roundToInt(), false);\r
-\r
- auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
- Point<ValueType> logicalTopLeft (display.totalArea.getX(), display.totalArea.getY());\r
- Point<ValueType> physicalTopLeft (display.topLeftPhysical.getX(), display.topLeftPhysical.getY());\r
-\r
- return ((point - (logicalTopLeft * globalScale)) * (display.scale / globalScale)) + physicalTopLeft;\r
-}\r
-\r
-const Displays::Display& Displays::getMainDisplay() const noexcept\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
-\r
- for (auto& d : displays)\r
- if (d.isMain)\r
- return d;\r
-\r
- // no main display!\r
- jassertfalse;\r
- return displays.getReference (0);\r
-}\r
-\r
-RectangleList<int> Displays::getRectangleList (bool userAreasOnly) const\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- RectangleList<int> rl;\r
-\r
- for (auto& d : displays)\r
- rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea);\r
-\r
- return rl;\r
-}\r
-\r
-Rectangle<int> Displays::getTotalBounds (bool userAreasOnly) const\r
-{\r
- return getRectangleList (userAreasOnly).getBounds();\r
-}\r
-\r
-void Displays::refresh()\r
-{\r
- Array<Display> oldDisplays;\r
- oldDisplays.swapWith (displays);\r
-\r
- init (Desktop::getInstance());\r
-\r
- if (oldDisplays != displays)\r
- {\r
- for (auto i = ComponentPeer::getNumPeers(); --i >= 0;)\r
- if (auto* peer = ComponentPeer::getPeer (i))\r
- peer->handleScreenSizeChange();\r
- }\r
-}\r
-\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator== (const Displays::Display& d1, const Displays::Display& d2) noexcept\r
-{\r
- return d1.isMain == d2.isMain\r
- && d1.totalArea == d2.totalArea\r
- && d1.userArea == d2.userArea\r
- && d1.topLeftPhysical == d2.topLeftPhysical\r
- && d1.scale == d2.scale\r
- && d1.dpi == d2.dpi;\r
-}\r
-\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept;\r
-bool operator!= (const Displays::Display& d1, const Displays::Display& d2) noexcept { return ! (d1 == d2); }\r
-\r
-// Deprecated method\r
-const Displays::Display& Displays::getDisplayContaining (Point<int> position) const noexcept\r
-{\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
- auto* best = &displays.getReference (0);\r
- auto bestDistance = std::numeric_limits<int>::max();\r
-\r
- for (auto& d : displays)\r
- {\r
- if (d.totalArea.contains (position))\r
- {\r
- best = &d;\r
- break;\r
- }\r
-\r
- auto distance = d.totalArea.getCentre().getDistanceFrom (position);\r
-\r
- if (distance < bestDistance)\r
- {\r
- bestDistance = distance;\r
- best = &d;\r
- }\r
- }\r
-\r
- return *best;\r
-}\r
-\r
-//==============================================================================\r
-// These methods are used for converting the totalArea and userArea Rectangles in Display from physical to logical\r
-// pixels. We do this by constructing a graph of connected displays where the root node has position (0, 0); this can be\r
-// safely converted to logical pixels using its scale factor and we can then traverse the graph and work out the logical pixels\r
-// for all the other connected displays. We need to do this as the logical bounds of a display depend not only on its scale\r
-// factor but also the scale factor of the displays connected to it.\r
-\r
-/**\r
- Represents a node in our graph of displays.\r
-*/\r
-struct DisplayNode\r
-{\r
- /** The Display object that this represents. */\r
- Displays::Display* display;\r
-\r
- /** True if this represents the 'root' display with position (0, 0). */\r
- bool isRoot = false;\r
-\r
- /** The parent node of this node in our display graph. This will have a correct logicalArea. */\r
- DisplayNode* parent = nullptr;\r
-\r
- /** The logical area to be calculated. This will be valid after processDisplay() has\r
- been called on this node.\r
- */\r
- Rectangle<double> logicalArea;\r
-};\r
-\r
-/** Recursive - will calculate and set the logicalArea member of current. */\r
-static void processDisplay (DisplayNode* currentNode, const Array<DisplayNode>& allNodes)\r
-{\r
- const auto physicalArea = currentNode->display->totalArea.toDouble();\r
- const auto scale = currentNode->display->scale;\r
-\r
- if (! currentNode->isRoot)\r
- {\r
- const auto logicalWidth = physicalArea.getWidth() / scale;\r
- const auto logicalHeight = physicalArea.getHeight() / scale;\r
-\r
- const auto physicalParentArea = currentNode->parent->display->totalArea.toDouble();\r
- const auto logicalParentArea = currentNode->parent->logicalArea; // logical area of parent has already been calculated\r
- const auto parentScale = currentNode->parent->display->scale;\r
-\r
- Rectangle<double> logicalArea (0.0, 0.0, logicalWidth, logicalHeight);\r
-\r
- if (physicalArea.getRight() == physicalParentArea.getX()) logicalArea.setPosition ({ logicalParentArea.getX() - logicalWidth, physicalArea.getY() / parentScale }); // on left\r
- else if (physicalArea.getX() == physicalParentArea.getRight()) logicalArea.setPosition ({ logicalParentArea.getRight(), physicalArea.getY() / parentScale }); // on right\r
- else if (physicalArea.getBottom() == physicalParentArea.getY()) logicalArea.setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getY() - logicalHeight }); // on top\r
- else if (physicalArea.getY() == physicalParentArea.getBottom()) logicalArea.setPosition ({ physicalArea.getX() / parentScale, logicalParentArea.getBottom() }); // on bottom\r
- else jassertfalse;\r
-\r
- currentNode->logicalArea = logicalArea;\r
- }\r
- else\r
- {\r
- // If currentNode is the root (position (0, 0)) then we can just scale the physical area\r
- currentNode->logicalArea = physicalArea / scale;\r
- currentNode->parent = currentNode;\r
- }\r
-\r
- // Find child nodes\r
- Array<DisplayNode*> children;\r
- for (auto& node : allNodes)\r
- {\r
- // Already calculated\r
- if (node.parent != nullptr)\r
- continue;\r
-\r
- const auto otherPhysicalArea = node.display->totalArea.toDouble();\r
-\r
- // If the displays are touching on any side\r
- if (otherPhysicalArea.getX() == physicalArea.getRight() || otherPhysicalArea.getRight() == physicalArea.getX()\r
- || otherPhysicalArea.getY() == physicalArea.getBottom() || otherPhysicalArea.getBottom() == physicalArea.getY())\r
- {\r
- node.parent = currentNode;\r
- children.add (&node);\r
- }\r
- }\r
-\r
- // Recursively process all child nodes\r
- for (auto child : children)\r
- processDisplay (child, allNodes);\r
-}\r
-\r
-/** This is called when the displays Array has been filled out with the info for all connected displays and the\r
- totalArea and userArea Rectangles need to be converted from physical to logical coordinates.\r
-*/\r
-void Displays::updateToLogical()\r
-{\r
- if (displays.size() == 1)\r
- {\r
- auto& display = displays.getReference (0);\r
-\r
- display.totalArea = (display.totalArea.toDouble() / display.scale).toNearestInt();\r
- display.userArea = (display.userArea.toDouble() / display.scale).toNearestInt();\r
-\r
- return;\r
- }\r
-\r
- Array<DisplayNode> displayNodes;\r
-\r
- for (auto& d : displays)\r
- {\r
- DisplayNode node;\r
-\r
- node.display = &d;\r
- displayNodes.add (node);\r
- }\r
-\r
- DisplayNode* root = nullptr;\r
- for (auto& node : displayNodes)\r
- {\r
- if (node.display->totalArea.getTopLeft() == Point<int>())\r
- {\r
- root = &node;\r
- root->isRoot = true;\r
- break;\r
- }\r
- }\r
-\r
- // Must have a root node!\r
- jassert (root != nullptr);\r
-\r
- // Recursively traverse the display graph from the root and work out logical bounds\r
- processDisplay (root, displayNodes);\r
-\r
- for (auto& node : displayNodes)\r
- {\r
- // All of the nodes should have a parent\r
- jassert (node.parent != nullptr);\r
-\r
- auto relativeUserArea = (node.display->userArea.toDouble() - node.display->totalArea.toDouble().getTopLeft()) / node.display->scale;\r
-\r
- // Now set Display::totalArea and ::userArea using the logical area that we have calculated\r
- node.display->topLeftPhysical = node.display->totalArea.getTopLeft();\r
- node.display->totalArea = node.logicalArea.toNearestInt();\r
- node.display->userArea = (relativeUserArea + node.logicalArea.getTopLeft()).toNearestInt();\r
- }\r
-}\r
-\r
-} // namespace juce\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-//==============================================================================\r
-/**\r
- Manages details about connected display devices.\r
-\r
- @tags{GUI}\r
-*/\r
-class JUCE_API Displays\r
-{\r
-private:\r
- Displays (Desktop&);\r
-\r
-public:\r
- /** Represents a connected display device. */\r
- struct Display\r
- {\r
- /** This will be true if this is the user's main display device. */\r
- bool isMain;\r
-\r
- /** The total area of this display in logical pixels including any OS-dependent objects\r
- like the taskbar, menu bar, etc. */\r
- Rectangle<int> totalArea;\r
-\r
- /** The total area of this display in logical pixels which isn't covered by OS-dependent\r
- objects like the taskbar, menu bar, etc.\r
- */\r
- Rectangle<int> userArea;\r
-\r
- /** The top-left of this display in physical coordinates. */\r
- Point<int> topLeftPhysical;\r
-\r
- /** The scale factor of this display.\r
-\r
- For higher-resolution displays, or displays with a user-defined scale factor set,\r
- this may be a value other than 1.0.\r
-\r
- This value is used to convert between physical and logical pixels. For example, a Component\r
- with size 10x10 will use 20x20 physical pixels on a display with a scale factor of 2.0.\r
- */\r
- double scale;\r
-\r
- /** The DPI of the display.\r
-\r
- This is the number of physical pixels per inch. To get the number of logical\r
- pixels per inch, divide this by the Display::scale value.\r
- */\r
- double dpi;\r
- };\r
-\r
- /** Converts a Rectangle from physical to logical pixels.\r
-\r
- If useScaleFactorOfDisplay is not null then its scale factor will be used for the conversion\r
- regardless of the display that the Rectangle to be converted is on.\r
- */\r
- Rectangle<int> physicalToLogical (Rectangle<int>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
- /** Converts a Rectangle from logical to physical pixels.\r
-\r
- If useScaleFactorOfDisplay is not null then its scale factor will be used for the conversion\r
- regardless of the display that the Rectangle to be converted is on.\r
- */\r
- Rectangle<int> logicalToPhysical (Rectangle<int>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
- /** Converts a Point from physical to logical pixels. */\r
- template <typename ValueType>\r
- Point<ValueType> physicalToLogical (Point<ValueType>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
- /** Converts a Point from logical to physical pixels. */\r
- template <typename ValueType>\r
- Point<ValueType> logicalToPhysical (Point<ValueType>, const Display* useScaleFactorOfDisplay = nullptr) const noexcept;\r
-\r
- /** Returns the Display object representing the display containing a given Rectangle (either\r
- in logical or physical pixels).\r
-\r
- If the Rectangle lies outside all the displays then the nearest one will be returned.\r
- */\r
- const Display& findDisplayForRect (Rectangle<int>, bool isPhysical = false) const noexcept;\r
-\r
- /** Returns the Display object representing the display containing a given Point (either\r
- in logical or physical pixels).\r
-\r
- If the Point lies outside all the displays then the nearest one will be returned.\r
- */\r
- const Display& findDisplayForPoint (Point<int>, bool isPhysical = false) const noexcept;\r
-\r
- /** Returns the Display object representing the display acting as the user's main screen. */\r
- const Display& getMainDisplay() const noexcept;\r
-\r
- /** Returns a RectangleList made up of all the displays in LOGICAL pixels. */\r
- RectangleList<int> getRectangleList (bool userAreasOnly) const;\r
-\r
- /** Returns the smallest bounding box which contains all the displays in LOGICAL pixels. */\r
- Rectangle<int> getTotalBounds (bool userAreasOnly) const;\r
-\r
- /** An Array containing the Display objects for all of the connected displays. */\r
- Array<Display> displays;\r
-\r
- #ifndef DOXYGEN\r
- /** @internal */\r
- void refresh();\r
- /** @internal */\r
- ~Displays() {}\r
- // This method has been deprecated - use the findDisplayForPoint() or findDisplayForRect() methods instead\r
- // as they can deal with converting between logical and physical pixels\r
- JUCE_DEPRECATED (const Display& getDisplayContaining (Point<int> position) const noexcept);\r
- #endif\r
-\r
-private:\r
- friend class Desktop;\r
-\r
- void init (Desktop&);\r
- void findDisplays (float masterScale);\r
-\r
- void updateToLogical();\r
-};\r
-\r
-} // namespace juce\r
\r
//==============================================================================\r
/** @internal */\r
- Drawable* createCopy() const override;\r
+ Drawable* createCopy() const;\r
\r
private:\r
//==============================================================================\r
\r
//==============================================================================\r
/** @internal */\r
- Drawable* createCopy() const override;\r
+ Drawable* createCopy() const;\r
\r
private:\r
Parallelogram<float> bounds;\r
\r
FillType type (gradient);\r
\r
- auto gradientTransform = parseTransform (fillXml->getStringAttribute ("gradientTransform"));\r
+ auto gradientTransform = parseTransform (fillXml->getStringAttribute ("gradientTransform"))\r
+ .followedBy (transform);\r
\r
if (gradient.isRadial)\r
{\r
auto* di = new DrawableImage();\r
\r
setCommonAttributes (*di, xml);\r
-\r
- Rectangle<float> imageBounds ((float) xml->getDoubleAttribute ("x", 0.0), (float) xml->getDoubleAttribute ("y", 0.0),\r
- (float) xml->getDoubleAttribute ("width", image.getWidth()), (float) xml->getDoubleAttribute ("height", image.getHeight()));\r
-\r
- di->setImage (image.rescaled ((int) imageBounds.getWidth(), (int) imageBounds.getHeight()));\r
-\r
- di->setTransformToFit (imageBounds, RectanglePlacement (parsePlacementFlags (xml->getStringAttribute ("preserveAspectRatio").trim())));\r
+ di->setImage (image);\r
\r
if (additionalTransform != nullptr)\r
- di->setTransform (di->getTransform().followedBy (transform).followedBy (*additionalTransform));\r
+ di->setTransform (transform.followedBy (*additionalTransform));\r
else\r
- di->setTransform (di->getTransform().followedBy (transform));\r
+ di->setTransform (transform);\r
\r
return di;\r
}\r
\r
if (tempFile.create().wasOk())\r
{\r
- if (auto outputStream = std::unique_ptr<FileOutputStream> (tempFile.createOutputStream()))\r
+ std::unique_ptr<FileOutputStream> outputStream (tempFile.createOutputStream());\r
+\r
+ if (outputStream != nullptr)\r
{\r
size_t pos = 0;\r
size_t totalSize = data.getSize();\r
\r
DirectoryContentsList::DirectoryContentsList (const FileFilter* f, TimeSliceThread& t)\r
: fileFilter (f), thread (t),\r
- fileTypeFlags (File::ignoreHiddenFiles | File::findFiles)\r
+ fileTypeFlags (File::ignoreHiddenFiles | File::findFiles),\r
+ shouldStop (true)\r
{\r
}\r
\r
\r
void DirectoryContentsList::refresh()\r
{\r
- stopSearching();\r
- files.clear();\r
+ clear();\r
\r
if (root.isDirectory())\r
{\r
OwnedArray<FileInfo> files;\r
\r
std::unique_ptr<DirectoryIterator> fileFindHandle;\r
- std::atomic<bool> shouldStop { true };\r
+ bool volatile shouldStop;\r
\r
int useTimeSlice() override;\r
void stopSearching();\r
\r
filter (selectsFiles ? owner.filters : String(), selectsDirectories ? "*" : String(), {}),\r
browserComponent (flags, owner.startingFile, &filter, preview),\r
- dialogBox (owner.title, {}, browserComponent, warnAboutOverwrite,\r
- browserComponent.findColour (AlertWindow::backgroundColourId), owner.parent)\r
+ dialogBox (owner.title, {}, browserComponent, warnAboutOverwrite, browserComponent.findColour (AlertWindow::backgroundColourId))\r
{}\r
\r
~NonNative()\r
const File& currentFileOrDirectory,\r
const String& fileFilters,\r
const bool useNativeBox,\r
- const bool treatFilePackagesAsDirectories,\r
- Component* parentComponentToUse)\r
+ const bool treatFilePackagesAsDirectories)\r
: title (chooserBoxTitle),\r
filters (fileFilters),\r
startingFile (currentFileOrDirectory),\r
- parent (parentComponentToUse),\r
useNativeDialogBox (useNativeBox && isPlatformDialogAvailable()),\r
treatFilePackagesAsDirs (treatFilePackagesAsDirectories)\r
{\r
initialFileOrDirectory will be used as the initial\r
directory of the native file chooser.\r
\r
- Note: On iOS when saving a file, a user will not\r
+ Note: on iOS when saving a file, a user will not\r
be able to change a file name, so it may be a good\r
idea to include at least a valid file name in\r
initialFileOrDirectory. When no filename is found,\r
selection of files inside packages when\r
invoked on OS X and when using native dialog\r
boxes.\r
- @param parentComponent An optional component which should be the parent\r
- for the file chooser. If this is a nullptr then the\r
- FileChooser will be a top-level window. AUv3s on iOS\r
- must specify this parameter as opening a top-level window\r
- in an AUv3 is forbidden due to sandbox restrictions.\r
\r
@see browseForFileToOpen, browseForFileToSave, browseForDirectory\r
*/\r
const File& initialFileOrDirectory = File(),\r
const String& filePatternsAllowed = String(),\r
bool useOSNativeDialogBox = true,\r
- bool treatFilePackagesAsDirectories = false,\r
- Component* parentComponent = nullptr);\r
+ bool treatFilePackagesAsDirectories = false);\r
\r
/** Destructor. */\r
~FileChooser();\r
may return a URL to a remote document. If a local file is chosen then you can\r
convert this file to a JUCE File class via the URL::getLocalFile method.\r
\r
- Note: On iOS you must use the returned URL object directly (you are also\r
+ Note: on iOS you must use the returned URL object directly (you are also\r
allowed to copy- or move-construct another URL from the returned URL), rather\r
than just storing the path as a String and then creating a new URL from that\r
String. This is because the returned URL contains internally a security\r
This array may be empty if no files were chosen, or can contain multiple entries\r
if multiple files were chosen.\r
\r
- Note: On iOS you must use the returned URL object directly (you are also\r
+ Note: on iOS you must use the returned URL object directly (you are also\r
allowed to copy- or move-construct another URL from the returned URL), rather\r
than just storing the path as a String and then creating a new URL from that\r
String. This is because the returned URL contains internally a security\r
//==============================================================================\r
String title, filters;\r
File startingFile;\r
- Component* parent;\r
Array<URL> results;\r
const bool useNativeDialogBox;\r
const bool treatFilePackagesAsDirs;\r
const String& instructions,\r
FileBrowserComponent& chooserComponent,\r
bool shouldWarn,\r
- Colour backgroundColour,\r
- Component* parentComponent)\r
- : ResizableWindow (name, backgroundColour, parentComponent == nullptr),\r
+ Colour backgroundColour)\r
+ : ResizableWindow (name, backgroundColour, true),\r
warnAboutOverwritingExistingFiles (shouldWarn)\r
{\r
content = new ContentComponent (name, instructions, chooserComponent);\r
content->chooserComponent.addListener (this);\r
\r
FileChooserDialogBox::selectionChanged();\r
-\r
- if (parentComponent != nullptr)\r
- parentComponent->addAndMakeVisible (this);\r
}\r
\r
FileChooserDialogBox::~FileChooserDialogBox()\r
if they try to select a file that already exists. (This\r
flag is only used when saving files)\r
@param backgroundColour the background colour for the top level window\r
- @param parentComponent an optional component which should be the parent\r
- for the file chooser. If this is a nullptr then the\r
- dialog box will be a top-level window. AUv3s on iOS\r
- must specify this parameter as opening a top-level window\r
- in an AUv3 is forbidden due to sandbox restrictions.\r
\r
@see FileBrowserComponent, FilePreviewComponent\r
*/\r
const String& instructions,\r
FileBrowserComponent& browserComponent,\r
bool warnAboutOverwritingExistingFiles,\r
- Colour backgroundColour,\r
- Component* parentComponent = nullptr);\r
+ Colour backgroundColour);\r
\r
/** Destructor. */\r
~FileChooserDialogBox();\r
//==============================================================================\r
void ImagePreviewComponent::getThumbSize (int& w, int& h) const\r
{\r
- auto availableW = proportionOfWidth (0.97f);\r
- auto availableH = getHeight() - 13 * 4;\r
+ const int availableW = proportionOfWidth (0.97f);\r
+ const int availableH = getHeight() - 13 * 4;\r
\r
- auto scale = jmin (1.0,\r
- availableW / (double) w,\r
- availableH / (double) h);\r
+ const double scale = jmin (1.0,\r
+ availableW / (double) w,\r
+ availableH / (double) h);\r
\r
w = roundToInt (scale * w);\r
h = roundToInt (scale * h);\r
currentDetails.clear();\r
repaint();\r
\r
- FileInputStream in (fileToLoad);\r
+ std::unique_ptr<FileInputStream> in (fileToLoad.createInputStream());\r
\r
- if (in.openedOk() && fileToLoad.existsAsFile())\r
+ if (in != nullptr && in->getFile().existsAsFile())\r
{\r
- if (auto format = ImageFileFormat::findImageFormatForStream (in))\r
+ if (ImageFileFormat* const format = ImageFileFormat::findImageFormatForStream (*in))\r
{\r
- currentThumbnail = format->decodeImage (in);\r
+ currentThumbnail = format->decodeImage (*in);\r
\r
if (currentThumbnail.isValid())\r
{\r
- auto w = currentThumbnail.getWidth();\r
- auto h = currentThumbnail.getHeight();\r
+ int w = currentThumbnail.getWidth();\r
+ int h = currentThumbnail.getHeight();\r
\r
currentDetails\r
<< fileToLoad.getFileName() << "\n"\r
{\r
g.setFont (13.0f);\r
\r
- auto w = currentThumbnail.getWidth();\r
- auto h = currentThumbnail.getHeight();\r
+ int w = currentThumbnail.getWidth();\r
+ int h = currentThumbnail.getHeight();\r
getThumbSize (w, h);\r
\r
const int numLines = 4;\r
- auto totalH = 13 * numLines + h + 4;\r
- auto y = (getHeight() - totalH) / 2;\r
+ const int totalH = 13 * numLines + h + 4;\r
+ const int y = (getHeight() - totalH) / 2;\r
\r
g.drawImageWithin (currentThumbnail,\r
(getWidth() - w) / 2, y, w, h,\r
#include <set>\r
\r
//==============================================================================\r
-#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
- jassert ((MessageManager::getInstanceWithoutCreating() != nullptr \\r
- && MessageManager::getInstanceWithoutCreating()->currentThreadHasLockedMessageManager()) \\r
- || getPeer() == nullptr);\r
+#define ASSERT_MESSAGE_MANAGER_IS_LOCKED \\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
+\r
+#define ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager() || getPeer() == nullptr);\r
\r
namespace juce\r
{\r
#include "components/juce_Component.cpp"\r
#include "components/juce_ComponentListener.cpp"\r
#include "mouse/juce_MouseInputSource.cpp"\r
-#include "desktop/juce_Displays.cpp"\r
-#include "desktop/juce_Desktop.cpp"\r
+#include "components/juce_Desktop.cpp"\r
#include "components/juce_ModalComponentManager.cpp"\r
#include "mouse/juce_ComponentDragger.cpp"\r
#include "mouse/juce_DragAndDropContainer.cpp"\r
\r
ID: juce_gui_basics\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE GUI core classes\r
description: Basic user-interface components and related classes.\r
website: http://www.juce.com/juce\r
#define JUCE_USE_XCURSOR 1\r
#endif\r
\r
-/** Config: JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- Enables per-monitor DPI awareness on Windows 8.1 and above.\r
-*/\r
-#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- #define JUCE_WIN_PER_MONITOR_DPI_AWARE 1\r
-#endif\r
-\r
//==============================================================================\r
namespace juce\r
{\r
class KeyPressMappingSet;\r
class ApplicationCommandManagerListener;\r
class DrawableButton;\r
- class Displays;\r
\r
class FlexBox;\r
#if JUCE_HAS_CONSTEXPR\r
#include "components/juce_CachedComponentImage.h"\r
#include "components/juce_Component.h"\r
#include "layout/juce_ComponentAnimator.h"\r
-#include "desktop/juce_Desktop.h"\r
-#include "desktop/juce_Displays.h"\r
+#include "components/juce_Desktop.h"\r
#include "layout/juce_ComponentBoundsConstrainer.h"\r
#include "mouse/juce_ComponentDragger.h"\r
#include "mouse/juce_DragAndDropTarget.h"\r
namespace juce\r
{\r
\r
+KeyPress::KeyPress() noexcept\r
+{\r
+}\r
+\r
KeyPress::KeyPress (int code, ModifierKeys m, juce_wchar textChar) noexcept\r
: keyCode (code), mods (m), textCharacter (textChar)\r
{\r
{\r
}\r
\r
+KeyPress::KeyPress (const KeyPress& other) noexcept\r
+ : keyCode (other.keyCode), mods (other.mods), textCharacter (other.textCharacter)\r
+{\r
+}\r
+\r
+KeyPress& KeyPress::operator= (const KeyPress& other) noexcept\r
+{\r
+ keyCode = other.keyCode;\r
+ mods = other.mods;\r
+ textCharacter = other.textCharacter;\r
+ return *this;\r
+}\r
+\r
bool KeyPress::operator== (int otherKeyCode) const noexcept\r
{\r
return keyCode == otherKeyCode && ! mods.isAnyModifierKeyDown();\r
\r
@see isValid\r
*/\r
- KeyPress() = default;\r
-\r
- /** Destructor. */\r
- ~KeyPress() = default;\r
+ KeyPress() noexcept;\r
\r
/** Creates a KeyPress for a key and some modifiers.\r
\r
explicit KeyPress (int keyCode) noexcept;\r
\r
/** Creates a copy of another KeyPress. */\r
- KeyPress (const KeyPress&) = default;\r
+ KeyPress (const KeyPress& other) noexcept;\r
\r
/** Copies this KeyPress from another one. */\r
- KeyPress& operator= (const KeyPress&) = default;\r
+ KeyPress& operator= (const KeyPress& other) noexcept;\r
\r
/** Compares two KeyPress objects. */\r
bool operator== (const KeyPress& other) const noexcept;\r
\r
ModifierKeys ModifierKeys::currentModifiers;\r
\r
+ModifierKeys::ModifierKeys() noexcept : flags (0) {}\r
ModifierKeys::ModifierKeys (int rawFlags) noexcept : flags (rawFlags) {}\r
+ModifierKeys::ModifierKeys (const ModifierKeys& other) noexcept : flags (other.flags) {}\r
+\r
+ModifierKeys& ModifierKeys::operator= (const ModifierKeys other) noexcept\r
+{\r
+ flags = other.flags;\r
+ return *this;\r
+}\r
\r
int ModifierKeys::getNumMouseButtonsDown() const noexcept\r
{\r
public:\r
//==============================================================================\r
/** Creates a ModifierKeys object with no flags set. */\r
- ModifierKeys() = default;\r
+ ModifierKeys() noexcept;\r
\r
/** Creates a ModifierKeys object from a raw set of flags.\r
\r
ModifierKeys (int flags) noexcept;\r
\r
/** Creates a copy of another object. */\r
- ModifierKeys (const ModifierKeys&) = default;\r
+ ModifierKeys (const ModifierKeys& other) noexcept;\r
\r
/** Copies this object from another one. */\r
- ModifierKeys& operator= (const ModifierKeys&) = default;\r
+ ModifierKeys& operator= (const ModifierKeys other) noexcept;\r
\r
//==============================================================================\r
/** Checks whether the 'command' key flag is set (or 'ctrl' on Windows/Linux).\r
static ModifierKeys getCurrentModifiersRealtime() noexcept;\r
\r
private:\r
- int flags = 0;\r
+ int flags;\r
};\r
\r
} // namespace juce\r
else\r
jassertfalse; // seem to be trying to animate a component that's not visible..\r
\r
- auto scale = (float) Desktop::getInstance().getDisplays().findDisplayForRect (getScreenBounds()).scale;\r
+ auto scale = (float) Desktop::getInstance().getDisplays()\r
+ .getDisplayContaining (getScreenBounds().getCentre()).scale;\r
\r
image = c.createComponentSnapshot (c.getLocalBounds(), false, scale);\r
\r
component, or if there's a chance the parent might decide to delete its children.\r
@param startSpeed a value to indicate the relative start speed of the animation. If this is 0,\r
the component will start by accelerating from rest; higher values mean that it\r
- will have an initial speed greater than zero. If the value is greater than 1, it\r
+ will have an initial speed greater than zero. If the value if greater than 1, it\r
will decelerate towards the middle of its journey. To move the component at a\r
constant rate for its entire animation, set both the start and end speeds to 1.0\r
@param endSpeed a relative speed at which the component should be moving when the animation finishes.\r
if (auto* peer = component->getPeer())\r
border = peer->getFrameSize();\r
\r
- auto screenBounds = Desktop::getInstance().getDisplays().findDisplayForPoint (targetBounds.getCentre()).userArea;\r
+ auto screenBounds = Desktop::getInstance().getDisplays().getDisplayContaining (targetBounds.getCentre()).userArea;\r
\r
limits = component->getLocalArea (nullptr, screenBounds) + component->getPosition();\r
}\r
public:\r
//==============================================================================\r
/** Creates a ComponentMovementWatcher to watch a given target component. */\r
- ComponentMovementWatcher (Component* componentToWatch);\r
+ ComponentMovementWatcher (Component* component);\r
\r
/** Destructor. */\r
~ComponentMovementWatcher();\r
virtual void componentVisibilityChanged() = 0;\r
\r
/** Returns the component that's being watched. */\r
- Component* getComponent() const noexcept { return component.get(); }\r
+ Component* getComponent() const noexcept { return component; }\r
\r
//==============================================================================\r
/** @internal */\r
\r
class PanelHolder;\r
struct PanelSizes;\r
+ friend class PanelHolder;\r
+ friend struct PanelSizes;\r
+ friend struct ContainerDeletePolicy<PanelSizes>;\r
+ friend struct ContainerDeletePolicy<PanelHolder>;\r
+\r
std::unique_ptr<PanelSizes> currentSizes;\r
OwnedArray<PanelHolder> holders;\r
ComponentAnimator animator;\r
const std::map<juce::String, LineArea>& namedAreas)\r
{\r
if (item.area.isNotEmpty() && ! grid.templateAreas.isEmpty())\r
- {\r
- // Must be a named area!\r
- jassert (namedAreas.count (item.area) != 0);\r
-\r
return namedAreas.at (item.area);\r
- }\r
\r
return { deduceLineRange (item.column, grid.templateColumns),\r
deduceLineRange (item.row, grid.templateRows) };\r
}\r
else\r
{\r
- if (string == area.name)\r
+ if (string == emptyAreaCharacter)\r
+ {\r
+ break;\r
+ }\r
+ else if (string == area.name)\r
{\r
area.lines.row.end = stringsArrays.indexOf (stringArray) + 2;\r
area.lines.column.end = stringArray.indexOf (string) + 2;\r
{\r
struct Cell { int column, row; };\r
\r
- OccupancyPlane (int highestColumnToUse, int highestRowToUse, bool isColumnFirst)\r
- : highestCrossDimension (isColumnFirst ? highestRowToUse : highestColumnToUse),\r
- columnFirst (isColumnFirst)\r
+ OccupancyPlane (int highestColumnToUse, int highestRowToUse, bool isColoumnFirst)\r
+ : highestCrossDimension (isColoumnFirst ? highestRowToUse : highestColumnToUse),\r
+ columnFirst (isColoumnFirst)\r
{}\r
\r
Grid::PlacementHelpers::LineArea setCell (Cell cell, int columnSpan, int rowSpan)\r
namespace juce\r
{\r
\r
-struct GridTests : public UnitTest\r
+struct GridTests : public juce::UnitTest\r
{\r
- GridTests() : UnitTest ("Grid class") {}\r
+ GridTests() : juce::UnitTest ("Grid class") {}\r
\r
void runTest() override\r
{\r
- using Fr = Grid::Fr;\r
- using Tr = Grid::TrackInfo;\r
- using Rect = Rectangle<float>;\r
+ using Fr = juce::Grid::Fr;\r
+ using Tr = juce::Grid::TrackInfo;\r
+ using Rect = juce::Rectangle<float>;\r
+ using Grid = juce::Grid;\r
\r
{\r
Grid grid;\r
grid.items.addArray ({ GridItem().withArea (1, 1),\r
GridItem().withArea (2, 1) });\r
\r
- grid.performLayout (Rectangle<int> (200, 400));\r
+ grid.performLayout (juce::Rectangle<int> (200, 400));\r
\r
beginTest ("Layout calculation test: 1 column x 2 rows: no gap");\r
expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 200.f, 20.0f));\r
GridItem().withArea (3, 1),\r
GridItem().withArea (3, 2) });\r
\r
- grid.performLayout (Rectangle<int> (150, 170));\r
+ grid.performLayout (juce::Rectangle<int> (150, 170));\r
\r
beginTest ("Layout calculation test: 2 columns x 3 rows: no gap");\r
expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 100.0f, 20.0f));\r
grid.columnGap = 20_px;\r
grid.rowGap = 10_px;\r
\r
- grid.performLayout (Rectangle<int> (200, 310));\r
+ grid.performLayout (juce::Rectangle<int> (200, 310));\r
\r
beginTest ("Layout calculation test: 2 columns x 3 rows: rowGap of 10 and columnGap of 20");\r
expect (grid.items[0].currentBounds == Rect (0.0f, 0.0f, 130.0f, 20.0f));\r
namespace juce\r
{\r
\r
-ResizableBorderComponent::Zone::Zone() noexcept {}\r
-ResizableBorderComponent::Zone::Zone (int zoneFlags) noexcept : zone (zoneFlags) {}\r
+ResizableBorderComponent::Zone::Zone() noexcept : zone (0) {}\r
+\r
+ResizableBorderComponent::Zone::Zone (const int zoneFlags) noexcept : zone (zoneFlags) {}\r
+\r
ResizableBorderComponent::Zone::Zone (const ResizableBorderComponent::Zone& other) noexcept : zone (other.zone) {}\r
\r
ResizableBorderComponent::Zone& ResizableBorderComponent::Zone::operator= (const ResizableBorderComponent::Zone& other) noexcept\r
bool ResizableBorderComponent::Zone::operator== (const ResizableBorderComponent::Zone& other) const noexcept { return zone == other.zone; }\r
bool ResizableBorderComponent::Zone::operator!= (const ResizableBorderComponent::Zone& other) const noexcept { return zone != other.zone; }\r
\r
-ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBorder (Rectangle<int> totalSize,\r
- BorderSize<int> border,\r
+ResizableBorderComponent::Zone ResizableBorderComponent::Zone::fromPositionOnBorder (const Rectangle<int>& totalSize,\r
+ const BorderSize<int>& border,\r
Point<int> position)\r
{\r
int z = 0;\r
if (totalSize.contains (position)\r
&& ! border.subtractedFrom (totalSize).contains (position))\r
{\r
- auto minW = jmax (totalSize.getWidth() / 10, jmin (10, totalSize.getWidth() / 3));\r
-\r
+ const int minW = jmax (totalSize.getWidth() / 10, jmin (10, totalSize.getWidth() / 3));\r
if (position.x < jmax (border.getLeft(), minW) && border.getLeft() > 0)\r
z |= left;\r
else if (position.x >= totalSize.getWidth() - jmax (border.getRight(), minW) && border.getRight() > 0)\r
z |= right;\r
\r
- auto minH = jmax (totalSize.getHeight() / 10, jmin (10, totalSize.getHeight() / 3));\r
-\r
+ const int minH = jmax (totalSize.getHeight() / 10, jmin (10, totalSize.getHeight() / 3));\r
if (position.y < jmax (border.getTop(), minH) && border.getTop() > 0)\r
z |= top;\r
else if (position.y >= totalSize.getHeight() - jmax (border.getBottom(), minH) && border.getBottom() > 0)\r
\r
MouseCursor ResizableBorderComponent::Zone::getMouseCursor() const noexcept\r
{\r
- auto mc = MouseCursor::NormalCursor;\r
+ MouseCursor::StandardCursorType mc = MouseCursor::NormalCursor;\r
\r
switch (zone)\r
{\r
return;\r
}\r
\r
- auto newBounds = mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart());\r
+ const Rectangle<int> newBounds (mouseZone.resizeRectangleBy (originalBounds, e.getOffsetFromDragStart()));\r
\r
if (constrainer != nullptr)\r
{\r
}\r
else\r
{\r
- if (auto* p = component->getPositioner())\r
- p->applyNewBounds (newBounds);\r
+ if (Component::Positioner* const pos = component->getPositioner())\r
+ pos->applyNewBounds (newBounds);\r
else\r
component->setBounds (newBounds);\r
}\r
\r
void ResizableBorderComponent::updateMouseZone (const MouseEvent& e)\r
{\r
- auto newZone = Zone::fromPositionOnBorder (getLocalBounds(), borderSize, e.getPosition());\r
+ Zone newZone (Zone::fromPositionOnBorder (getLocalBounds(), borderSize, e.getPosition()));\r
\r
if (mouseZone != newZone)\r
{\r
/** Given a point within a rectangle with a resizable border, this returns the\r
zone that the point lies within.\r
*/\r
- static Zone fromPositionOnBorder (Rectangle<int> totalSize,\r
- BorderSize<int> border,\r
+ static Zone fromPositionOnBorder (const Rectangle<int>& totalSize,\r
+ const BorderSize<int>& border,\r
Point<int> position);\r
\r
/** Returns an appropriate mouse-cursor for this resize zone. */\r
\r
private:\r
//==============================================================================\r
- int zone = centre;\r
+ int zone;\r
};\r
\r
/** Returns the zone in which the mouse was last seen. */\r
return;\r
}\r
\r
- auto newBounds = originalBounds;\r
+ Rectangle<int> newBounds (originalBounds);\r
\r
switch (edge)\r
{\r
}\r
else\r
{\r
- if (auto* p = component->getPositioner())\r
- p->applyNewBounds (newBounds);\r
+ if (Component::Positioner* const pos = component->getPositioner())\r
+ pos->applyNewBounds (newBounds);\r
else\r
component->setBounds (newBounds);\r
}\r
\r
if (upButton != nullptr)\r
{\r
- auto r = getLocalBounds();\r
+ Rectangle<int> r (getLocalBounds());\r
\r
if (vertical)\r
{\r
int initialDelayInMillisecs = 100, repeatDelayInMillisecs = 50, minimumDelayInMillisecs = 10;\r
bool vertical, isDraggingThumb = false, autohides = true, userVisibilityFlag = false;\r
class ScrollbarButton;\r
+ friend struct ContainerDeletePolicy<ScrollbarButton>;\r
std::unique_ptr<ScrollbarButton> upButton, downButton;\r
ListenerList<Listener> listeners;\r
\r
Colour TabBarButton::getTabBackgroundColour() const { return owner.getTabBackgroundColour (getIndex()); }\r
bool TabBarButton::isFrontTab() const { return getToggleState(); }\r
\r
-void TabBarButton::paintButton (Graphics& g, const bool shouldDrawButtonAsHighlighted, const bool shouldDrawButtonAsDown)\r
+void TabBarButton::paintButton (Graphics& g, const bool isMouseOverButton, const bool isButtonDown)\r
{\r
- getLookAndFeel().drawTabButton (*this, g, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ getLookAndFeel().drawTabButton (*this, g, isMouseOverButton, isButtonDown);\r
}\r
\r
void TabBarButton::clicked (const ModifierKeys& mods)\r
\r
//==============================================================================\r
/** @internal */\r
- void paintButton (Graphics&, bool, bool) override;\r
+ void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override;\r
/** @internal */\r
void clicked (const ModifierKeys&) override;\r
/** @internal */\r
int currentTabIndex = -1;\r
\r
class BehindFrontTabComp;\r
+ friend class BehindFrontTabComp;\r
+ friend struct ContainerDeletePolicy<BehindFrontTabComp>;\r
std::unique_ptr<BehindFrontTabComp> behindFrontTab;\r
std::unique_ptr<Button> extraTabsButton;\r
\r
{\r
const Identifier deleteComponentId ("deleteByTabComp_");\r
\r
- static void deleteIfNecessary (Component* comp)\r
+ static void deleteIfNecessary (Component* const comp)\r
{\r
if (comp != nullptr && (bool) comp->getProperties() [deleteComponentId])\r
delete comp;\r
}\r
\r
static Rectangle<int> getTabArea (Rectangle<int>& content, BorderSize<int>& outline,\r
- TabbedButtonBar::Orientation orientation, int tabDepth)\r
+ const TabbedButtonBar::Orientation orientation, const int tabDepth)\r
{\r
switch (orientation)\r
{\r
owner.popupMenuClickOnTab (tabIndex, tabName);\r
}\r
\r
- Colour getTabBackgroundColour (int tabIndex)\r
+ Colour getTabBackgroundColour (const int tabIndex)\r
{\r
return owner.tabs->getTabBackgroundColour (tabIndex);\r
}\r
\r
\r
//==============================================================================\r
-TabbedComponent::TabbedComponent (TabbedButtonBar::Orientation orientation)\r
+TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation)\r
{\r
tabs.reset (new ButtonBar (*this, orientation));\r
addAndMakeVisible (tabs.get());\r
}\r
\r
//==============================================================================\r
-void TabbedComponent::setOrientation (TabbedButtonBar::Orientation orientation)\r
+void TabbedComponent::setOrientation (const TabbedButtonBar::Orientation orientation)\r
{\r
tabs->setOrientation (orientation);\r
resized();\r
return tabs->getOrientation();\r
}\r
\r
-void TabbedComponent::setTabBarDepth (int newDepth)\r
+void TabbedComponent::setTabBarDepth (const int newDepth)\r
{\r
if (tabDepth != newDepth)\r
{\r
}\r
}\r
\r
-TabBarButton* TabbedComponent::createTabButton (const String& tabName, int /*tabIndex*/)\r
+TabBarButton* TabbedComponent::createTabButton (const String& tabName, const int /*tabIndex*/)\r
{\r
return new TabBarButton (tabName, *tabs);\r
}\r
if (panelComponent != nullptr)\r
{\r
panelComponent->setVisible (false);\r
- removeChildComponent (panelComponent.get());\r
+ removeChildComponent (panelComponent);\r
panelComponent = nullptr;\r
}\r
\r
\r
void TabbedComponent::addTab (const String& tabName,\r
Colour tabBackgroundColour,\r
- Component* contentComponent,\r
- bool deleteComponentWhenNotNeeded,\r
- int insertIndex)\r
+ Component* const contentComponent,\r
+ const bool deleteComponentWhenNotNeeded,\r
+ const int insertIndex)\r
{\r
contentComponents.insert (insertIndex, WeakReference<Component> (contentComponent));\r
\r
resized();\r
}\r
\r
-void TabbedComponent::setTabName (int tabIndex, const String& newName)\r
+void TabbedComponent::setTabName (const int tabIndex, const String& newName)\r
{\r
tabs->setTabName (tabIndex, newName);\r
}\r
\r
-void TabbedComponent::removeTab (int tabIndex)\r
+void TabbedComponent::removeTab (const int tabIndex)\r
{\r
if (isPositiveAndBelow (tabIndex, contentComponents.size()))\r
{\r
- TabbedComponentHelpers::deleteIfNecessary (contentComponents.getReference (tabIndex).get());\r
+ TabbedComponentHelpers::deleteIfNecessary (contentComponents.getReference (tabIndex));\r
contentComponents.remove (tabIndex);\r
tabs->removeTab (tabIndex);\r
}\r
}\r
\r
-void TabbedComponent::moveTab (int currentIndex, int newIndex, bool animate)\r
+void TabbedComponent::moveTab (const int currentIndex, const int newIndex, const bool animate)\r
{\r
contentComponents.move (currentIndex, newIndex);\r
tabs->moveTab (currentIndex, newIndex, animate);\r
return tabs->getTabNames();\r
}\r
\r
-Component* TabbedComponent::getTabContentComponent (int tabIndex) const noexcept\r
+Component* TabbedComponent::getTabContentComponent (const int tabIndex) const noexcept\r
{\r
- return contentComponents[tabIndex].get();\r
+ return contentComponents [tabIndex];\r
}\r
\r
-Colour TabbedComponent::getTabBackgroundColour (int tabIndex) const noexcept\r
+Colour TabbedComponent::getTabBackgroundColour (const int tabIndex) const noexcept\r
{\r
return tabs->getTabBackgroundColour (tabIndex);\r
}\r
\r
-void TabbedComponent::setTabBackgroundColour (int tabIndex, Colour newColour)\r
+void TabbedComponent::setTabBackgroundColour (const int tabIndex, Colour newColour)\r
{\r
tabs->setTabBackgroundColour (tabIndex, newColour);\r
\r
repaint();\r
}\r
\r
-void TabbedComponent::setCurrentTabIndex (int newTabIndex, bool sendChangeMessage)\r
+void TabbedComponent::setCurrentTabIndex (const int newTabIndex, const bool sendChangeMessage)\r
{\r
tabs->setCurrentTabIndex (newTabIndex, sendChangeMessage);\r
}\r
return tabs->getCurrentTabName();\r
}\r
\r
-void TabbedComponent::setOutline (int thickness)\r
+void TabbedComponent::setOutline (const int thickness)\r
{\r
outlineThickness = thickness;\r
resized();\r
repaint();\r
}\r
\r
-void TabbedComponent::setIndent (int indentThickness)\r
+void TabbedComponent::setIndent (const int indentThickness)\r
{\r
edgeIndent = indentThickness;\r
resized();\r
tabs->setBounds (TabbedComponentHelpers::getTabArea (content, outline, getOrientation(), tabDepth));\r
content = BorderSize<int> (edgeIndent).subtractedFrom (outline.subtractedFrom (content));\r
\r
- for (auto& c : contentComponents)\r
- if (auto comp = c.get())\r
- comp->setBounds (content);\r
+ for (int i = contentComponents.size(); --i >= 0;)\r
+ if (Component* c = contentComponents.getReference(i))\r
+ c->setBounds (content);\r
}\r
\r
void TabbedComponent::lookAndFeelChanged()\r
{\r
- for (auto& c : contentComponents)\r
- if (auto comp = c.get())\r
- comp->lookAndFeelChanged();\r
+ for (int i = contentComponents.size(); --i >= 0;)\r
+ if (Component* c = contentComponents.getReference(i))\r
+ c->lookAndFeelChanged();\r
}\r
\r
-void TabbedComponent::changeCallback (int newCurrentTabIndex, const String& newTabName)\r
+void TabbedComponent::changeCallback (const int newCurrentTabIndex, const String& newTabName)\r
{\r
auto* newPanelComp = getTabContentComponent (getCurrentTabIndex());\r
\r
/** Returns the current component that's filling the panel.\r
This will return nullptr if there isn't one.\r
*/\r
- Component* getCurrentContentComponent() const noexcept { return panelComponent.get(); }\r
+ Component* getCurrentContentComponent() const noexcept { return panelComponent; }\r
\r
//==============================================================================\r
/** Callback method to indicate the selected tab has been changed.\r
{\r
// This sets the content comp to a null pointer before deleting the old one, in case\r
// anything tries to use the old one while it's in mid-deletion..\r
- std::unique_ptr<Component> oldCompDeleter (contentComp.get());\r
+ std::unique_ptr<Component> oldCompDeleter (contentComp);\r
contentComp = nullptr;\r
}\r
else\r
{\r
jassert (contentComp != nullptr);\r
\r
- auto contentBounds = contentHolder.getLocalArea (contentComp.get(), contentComp->getLocalBounds());\r
+ auto contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds());\r
\r
Point<int> p (jmax (jmin (0, contentHolder.getWidth() - contentBounds.getWidth()), jmin (0, -(pos.x))),\r
jmax (jmin (0, contentHolder.getHeight() - contentBounds.getHeight()), jmin (0, -(pos.y))));\r
}\r
\r
Rectangle<int> contentBounds;\r
-\r
- if (auto cc = contentComp.get())\r
- contentBounds = contentHolder.getLocalArea (cc, cc->getLocalBounds());\r
+ if (contentComp != nullptr)\r
+ contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds());\r
\r
auto visibleOrigin = -contentBounds.getPosition();\r
\r
\r
@see setViewedComponent\r
*/\r
- Component* getViewedComponent() const noexcept { return contentComp.get(); }\r
+ Component* getViewedComponent() const noexcept { return contentComp; }\r
\r
//==============================================================================\r
/** Changes the position of the viewed component.\r
bool vScrollbarRight = true, hScrollbarBottom = true;\r
\r
struct DragToScrollListener;\r
+ friend struct DragToScrollListener;\r
+ friend struct ContainerDeletePolicy<DragToScrollListener>;\r
std::unique_ptr<DragToScrollListener> dragToScrollListener;\r
\r
Point<int> viewportPosToCompPos (Point<int>) const;\r
return LookAndFeel::getDefaultLookAndFeel().getTypefaceForFont (font);\r
}\r
\r
-using GetTypefaceForFont = Typeface::Ptr (*)(const Font&);\r
+typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&);\r
extern GetTypefaceForFont juce_getTypefaceForFont;\r
\r
//==============================================================================\r
{\r
if (defaultSans != newName)\r
{\r
- defaultTypeface.reset();\r
+ defaultTypeface = {};\r
Typeface::clearTypefaceCache();\r
defaultSans = newName;\r
}\r
\r
//==============================================================================\r
void LookAndFeel_V1::drawButtonBackground (Graphics& g, Button& button, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton, bool isButtonDown)\r
{\r
const int width = button.getWidth();\r
const int height = button.getHeight();\r
\r
Colour bc (backgroundColour.withMultipliedSaturation (0.3f));\r
\r
- if (shouldDrawButtonAsHighlighted)\r
+ if (isMouseOverButton)\r
{\r
- if (shouldDrawButtonAsDown)\r
+ if (isButtonDown)\r
bc = bc.brighter();\r
else if (bc.getBrightness() > 0.5f)\r
bc = bc.darker (0.1f);\r
g.setColour (bc);\r
g.fillPath (p);\r
\r
- g.setColour (bc.contrasting().withAlpha ((shouldDrawButtonAsHighlighted) ? 0.6f : 0.4f));\r
- g.strokePath (p, PathStrokeType ((shouldDrawButtonAsHighlighted) ? 2.0f : 1.4f));\r
+ g.setColour (bc.contrasting().withAlpha ((isMouseOverButton) ? 0.6f : 0.4f));\r
+ g.strokePath (p, PathStrokeType ((isMouseOverButton) ? 2.0f : 1.4f));\r
}\r
\r
void LookAndFeel_V1::drawTickBox (Graphics& g, Component& /*component*/,\r
float x, float y, float w, float h,\r
const bool ticked,\r
const bool isEnabled,\r
- const bool /*shouldDrawButtonAsHighlighted*/,\r
- const bool shouldDrawButtonAsDown)\r
+ const bool /*isMouseOverButton*/,\r
+ const bool isButtonDown)\r
{\r
Path box;\r
box.addRoundedRectangle (0.0f, 2.0f, 6.0f, 6.0f, 1.0f);\r
\r
- g.setColour (isEnabled ? Colours::blue.withAlpha (shouldDrawButtonAsDown ? 0.3f : 0.1f)\r
+ g.setColour (isEnabled ? Colours::blue.withAlpha (isButtonDown ? 0.3f : 0.1f)\r
: Colours::lightgrey.withAlpha (0.1f));\r
\r
AffineTransform trans (AffineTransform::scale (w / 9.0f, h / 9.0f).translated (x, y));\r
}\r
}\r
\r
-void LookAndFeel_V1::drawToggleButton (Graphics& g, ToggleButton& button, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+void LookAndFeel_V1::drawToggleButton (Graphics& g, ToggleButton& button, bool isMouseOverButton, bool isButtonDown)\r
{\r
if (button.hasKeyboardFocus (true))\r
{\r
(float) tickWidth, (float) tickWidth,\r
button.getToggleState(),\r
button.isEnabled(),\r
- shouldDrawButtonAsHighlighted,\r
- shouldDrawButtonAsDown);\r
+ isMouseOverButton,\r
+ isButtonDown);\r
\r
g.setColour (button.findColour (ToggleButton::textColourId));\r
g.setFont (jmin (15.0f, button.getHeight() * 0.6f));\r
void LookAndFeel_V1::drawScrollbarButton (Graphics& g, ScrollBar& bar,\r
int width, int height, int buttonDirection,\r
bool isScrollbarVertical,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton,\r
+ bool isButtonDown)\r
{\r
if (isScrollbarVertical)\r
width -= 2;\r
width * 0.7f, height * 0.1f,\r
width * 0.7f, height * 0.9f);\r
\r
- if (shouldDrawButtonAsDown)\r
+ if (isButtonDown)\r
g.setColour (Colours::white);\r
- else if (shouldDrawButtonAsHighlighted)\r
+ else if (isMouseOverButton)\r
g.setColour (Colours::white.withAlpha (0.7f));\r
else\r
g.setColour (bar.findColour (ScrollBar::thumbColourId).withAlpha (0.5f));\r
\r
//==============================================================================\r
void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isMouseOverButton, bool isButtonDown) override;\r
\r
- void drawToggleButton (Graphics&, ToggleButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
\r
void drawTickBox (Graphics&, Component&, float x, float y, float w, float h,\r
- bool ticked, bool isEnabled,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
\r
void drawProgressBar (Graphics&, ProgressBar&, int width, int height,\r
double progress, const String& textToShow) override;\r
//==============================================================================\r
void drawScrollbarButton (Graphics&, ScrollBar&, int width, int height,\r
int buttonDirection, bool isScrollbarVertical,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isMouseOverButton, bool isButtonDown) override;\r
\r
void drawScrollbar (Graphics&, ScrollBar&, int x, int y, int width, int height,\r
bool isScrollbarVertical, int thumbStartPosition, int thumbSize,\r
{\r
static Colour createBaseColour (Colour buttonColour,\r
bool hasKeyboardFocus,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown) noexcept\r
+ bool isMouseOverButton,\r
+ bool isButtonDown) noexcept\r
{\r
const float sat = hasKeyboardFocus ? 1.3f : 0.9f;\r
const Colour baseColour (buttonColour.withMultipliedSaturation (sat));\r
\r
- if (shouldDrawButtonAsDown) return baseColour.contrasting (0.2f);\r
- if (shouldDrawButtonAsHighlighted) return baseColour.contrasting (0.1f);\r
+ if (isButtonDown) return baseColour.contrasting (0.2f);\r
+ if (isMouseOverButton) return baseColour.contrasting (0.1f);\r
\r
return baseColour;\r
}\r
void LookAndFeel_V2::drawButtonBackground (Graphics& g,\r
Button& button,\r
const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton,\r
+ bool isButtonDown)\r
{\r
const int width = button.getWidth();\r
const int height = button.getHeight();\r
\r
- const float outlineThickness = button.isEnabled() ? ((shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted) ? 1.2f : 0.7f) : 0.4f;\r
+ const float outlineThickness = button.isEnabled() ? ((isButtonDown || isMouseOverButton) ? 1.2f : 0.7f) : 0.4f;\r
const float halfThickness = outlineThickness * 0.5f;\r
\r
const float indentL = button.isConnectedOnLeft() ? 0.1f : halfThickness;\r
\r
const Colour baseColour (LookAndFeelHelpers::createBaseColour (backgroundColour,\r
button.hasKeyboardFocus (true),\r
- shouldDrawButtonAsHighlighted,\r
- shouldDrawButtonAsDown)\r
+ isMouseOverButton, isButtonDown)\r
.withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f));\r
\r
drawGlassLozenge (g,\r
return getTextButtonFont (b, buttonHeight).getStringWidth (b.getButtonText()) + buttonHeight;\r
}\r
\r
-void LookAndFeel_V2::drawButtonText (Graphics& g, TextButton& button,\r
- bool /*shouldDrawButtonAsHighlighted*/, bool /*shouldDrawButtonAsDown*/)\r
+void LookAndFeel_V2::drawButtonText (Graphics& g, TextButton& button, bool /*isMouseOverButton*/, bool /*isButtonDown*/)\r
{\r
Font font (getTextButtonFont (button, button.getHeight()));\r
g.setFont (font);\r
float x, float y, float w, float h,\r
const bool ticked,\r
const bool isEnabled,\r
- const bool shouldDrawButtonAsHighlighted,\r
- const bool shouldDrawButtonAsDown)\r
+ const bool isMouseOverButton,\r
+ const bool isButtonDown)\r
{\r
const float boxSize = w * 0.7f;\r
\r
drawGlassSphere (g, x, y + (h - boxSize) * 0.5f, boxSize,\r
LookAndFeelHelpers::createBaseColour (component.findColour (TextButton::buttonColourId)\r
.withMultipliedAlpha (isEnabled ? 1.0f : 0.5f),\r
- true, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown),\r
- isEnabled ? ((shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted) ? 1.1f : 0.5f) : 0.3f);\r
+ true, isMouseOverButton, isButtonDown),\r
+ isEnabled ? ((isButtonDown || isMouseOverButton) ? 1.1f : 0.5f) : 0.3f);\r
\r
if (ticked)\r
{\r
}\r
\r
void LookAndFeel_V2::drawToggleButton (Graphics& g, ToggleButton& button,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton, bool isButtonDown)\r
{\r
if (button.hasKeyboardFocus (true))\r
{\r
tickWidth, tickWidth,\r
button.getToggleState(),\r
button.isEnabled(),\r
- shouldDrawButtonAsHighlighted,\r
- shouldDrawButtonAsDown);\r
+ isMouseOverButton,\r
+ isButtonDown);\r
\r
g.setColour (button.findColour (ToggleButton::textColourId));\r
g.setFont (fontSize);\r
}\r
\r
void LookAndFeel_V2::drawDrawableButton (Graphics& g, DrawableButton& button,\r
- bool /*shouldDrawButtonAsHighlighted*/, bool /*shouldDrawButtonAsDown*/)\r
+ bool /*isMouseOverButton*/, bool /*isButtonDown*/)\r
{\r
bool toggleState = button.getToggleState();\r
\r
void LookAndFeel_V2::drawScrollbarButton (Graphics& g, ScrollBar& scrollbar,\r
int width, int height, int buttonDirection,\r
bool /*isScrollbarVertical*/,\r
- bool /*shouldDrawButtonAsHighlighted*/,\r
- bool shouldDrawButtonAsDown)\r
+ bool /*isMouseOverButton*/,\r
+ bool isButtonDown)\r
{\r
Path p;\r
\r
width * 0.7f, height * 0.1f,\r
width * 0.7f, height * 0.9f);\r
\r
- if (shouldDrawButtonAsDown)\r
+ if (isButtonDown)\r
g.setColour (scrollbar.findColour (ScrollBar::thumbColourId).contrasting (0.2f));\r
else\r
g.setColour (scrollbar.findColour (ScrollBar::thumbColourId));\r
}\r
\r
//==============================================================================\r
-void LookAndFeel_V2::drawComboBox (Graphics& g, int width, int height, const bool isMouseButtonDown,\r
+void LookAndFeel_V2::drawComboBox (Graphics& g, int width, int height, const bool isButtonDown,\r
int buttonX, int buttonY, int buttonW, int buttonH, ComboBox& box)\r
{\r
g.fillAll (box.findColour (ComboBox::backgroundColourId));\r
g.drawRect (0, 0, width, height);\r
}\r
\r
- auto outlineThickness = box.isEnabled() ? (isMouseButtonDown ? 1.2f : 0.5f) : 0.3f;\r
+ auto outlineThickness = box.isEnabled() ? (isButtonDown ? 1.2f : 0.5f) : 0.3f;\r
\r
auto baseColour = LookAndFeelHelpers::createBaseColour (box.findColour (ComboBox::buttonColourId),\r
box.hasKeyboardFocus (true),\r
- false, isMouseButtonDown)\r
+ false, isButtonDown)\r
.withMultipliedAlpha (box.isEnabled() ? 1.0f : 0.5f);\r
\r
drawGlassLozenge (g,\r
label.setFont (getComboBoxFont (box));\r
}\r
\r
-PopupMenu::Options LookAndFeel_V2::getOptionsForComboBoxPopupMenu (ComboBox& box, Label& label)\r
-{\r
- return PopupMenu::Options().withTargetComponent (&box)\r
- .withItemThatMustBeVisible (box.getSelectedId())\r
- .withMinimumWidth (box.getWidth())\r
- .withMaximumNumColumns (1)\r
- .withStandardItemHeight (label.getHeight());\r
-}\r
-\r
-void LookAndFeel_V2::drawComboBoxTextWhenNothingSelected (Graphics& g, ComboBox& box, Label& label)\r
-{\r
- g.setColour (findColour (ComboBox::textColourId).withMultipliedAlpha (0.5f));\r
-\r
- auto font = label.getLookAndFeel().getLabelFont (label);\r
-\r
- g.setFont (font);\r
-\r
- auto textArea = getLabelBorderSize (label).subtractedFrom (label.getLocalBounds());\r
-\r
- g.drawFittedText (box.getTextWhenNothingSelected(), textArea, label.getJustificationType(),\r
- jmax (1, (int) (textArea.getHeight() / font.getHeight())),\r
- label.getMinimumHorizontalScale());\r
-}\r
-\r
//==============================================================================\r
Font LookAndFeel_V2::getLabelFont (Label& label)\r
{\r
g.setColour (label.findColour (Label::textColourId).withMultipliedAlpha (alpha));\r
g.setFont (font);\r
\r
- auto textArea = getLabelBorderSize (label).subtractedFrom (label.getLocalBounds());\r
+ Rectangle<int> textArea (label.getBorderSize().subtractedFrom (label.getLocalBounds()));\r
\r
g.drawFittedText (label.getText(), textArea, label.getJustificationType(),\r
jmax (1, (int) (textArea.getHeight() / font.getHeight())),\r
g.drawRect (label.getLocalBounds());\r
}\r
\r
-BorderSize<int> LookAndFeel_V2::getLabelBorderSize (Label& label)\r
-{\r
- return label.getBorderSize();\r
-}\r
-\r
//==============================================================================\r
void LookAndFeel_V2::drawLinearSliderBackground (Graphics& g, int x, int y, int width, int height,\r
float /*sliderPos*/,\r
}\r
\r
//==============================================================================\r
- void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+ void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
{\r
- float alpha = shouldDrawButtonAsHighlighted ? (shouldDrawButtonAsDown ? 1.0f : 0.8f) : 0.55f;\r
+ float alpha = isMouseOverButton ? (isButtonDown ? 1.0f : 0.8f) : 0.55f;\r
\r
if (! isEnabled())\r
alpha *= 0.5f;\r
//==============================================================================\r
static Drawable* createDrawableFromSVG (const char* data)\r
{\r
- auto xml = parseXML (data);\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (data));\r
jassert (xml != nullptr);\r
return Drawable::createFromSVG (*xml);\r
}\r
\r
//==============================================================================\r
void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isMouseOverButton, bool isButtonDown) override;\r
Font getTextButtonFont (TextButton&, int buttonHeight) override;\r
\r
- void drawButtonText (Graphics&, TextButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ void drawButtonText (Graphics&, TextButton&, bool isMouseOverButton, bool isButtonDown) override;\r
int getTextButtonWidthToFitText (TextButton&, int buttonHeight) override;\r
\r
- void drawToggleButton (Graphics&, ToggleButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
\r
void changeToggleButtonWidthToFitText (ToggleButton&) override;\r
\r
void drawTickBox (Graphics&, Component&,\r
float x, float y, float w, float h,\r
- bool ticked, bool isEnabled,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
\r
- void drawDrawableButton (Graphics&, DrawableButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ void drawDrawableButton (Graphics&, DrawableButton&, bool isMouseOverButton, bool isButtonDown) override;\r
\r
//==============================================================================\r
AlertWindow* createAlertWindow (const String& title, const String& message,\r
//==============================================================================\r
bool areScrollbarButtonsVisible() override;\r
void drawScrollbarButton (Graphics&, ScrollBar&, int width, int height, int buttonDirection,\r
- bool isScrollbarVertical, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isScrollbarVertical, bool isMouseOverButton, bool isButtonDown) override;\r
\r
void drawScrollbar (Graphics&, ScrollBar&, int x, int y, int width, int height,\r
bool isScrollbarVertical, int thumbStartPosition, int thumbSize,\r
int getPopupMenuBorderSize() override;\r
\r
//==============================================================================\r
- void drawComboBox (Graphics&, int width, int height, bool isMouseButtonDown,\r
+ void drawComboBox (Graphics&, int width, int height, bool isButtonDown,\r
int buttonX, int buttonY, int buttonW, int buttonH,\r
ComboBox&) override;\r
Font getComboBoxFont (ComboBox&) override;\r
Label* createComboBoxTextBox (ComboBox&) override;\r
void positionComboBoxText (ComboBox&, Label&) override;\r
- PopupMenu::Options getOptionsForComboBoxPopupMenu (ComboBox&, Label&) override;\r
- void drawComboBoxTextWhenNothingSelected (Graphics&, ComboBox&, Label&) override;\r
\r
//==============================================================================\r
void drawLabel (Graphics&, Label&) override;\r
Font getLabelFont (Label&) override;\r
- BorderSize<int> getLabelBorderSize (Label&) override;\r
\r
//==============================================================================\r
void drawLinearSlider (Graphics&, int x, int y, int width, int height,\r
}\r
\r
void LookAndFeel_V3::drawButtonBackground (Graphics& g, Button& button, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton, bool isButtonDown)\r
{\r
Colour baseColour (backgroundColour.withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f)\r
.withMultipliedAlpha (button.isEnabled() ? 0.9f : 0.5f));\r
\r
- if (shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted)\r
- baseColour = baseColour.contrasting (shouldDrawButtonAsDown ? 0.2f : 0.1f);\r
+ if (isButtonDown || isMouseOverButton)\r
+ baseColour = baseColour.contrasting (isButtonDown ? 0.2f : 0.1f);\r
\r
const bool flatOnLeft = button.isConnectedOnLeft();\r
const bool flatOnRight = button.isConnectedOnRight();\r
\r
void LookAndFeel_V3::drawTableHeaderBackground (Graphics& g, TableHeaderComponent& header)\r
{\r
- auto r = header.getLocalBounds();\r
+ Rectangle<int> r (header.getLocalBounds());\r
auto outlineColour = header.findColour (TableHeaderComponent::outlineColourId);\r
\r
g.setColour (outlineColour);\r
return 20;\r
}\r
\r
-void LookAndFeel_V3::drawComboBox (Graphics& g, int width, int height, const bool /*isMouseButtonDown*/,\r
+void LookAndFeel_V3::drawComboBox (Graphics& g, int width, int height, const bool /*isButtonDown*/,\r
int buttonX, int buttonY, int buttonW, int buttonH, ComboBox& box)\r
{\r
g.fillAll (box.findColour (ComboBox::backgroundColourId));\r
{\r
}\r
\r
- void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+ void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
{\r
Colour background (Colours::grey);\r
\r
background = rw->getBackgroundColour();\r
\r
const float cx = getWidth() * 0.5f, cy = getHeight() * 0.5f;\r
- const float diam = jmin (cx, cy) * (shouldDrawButtonAsDown ? 0.60f : 0.65f);\r
+ const float diam = jmin (cx, cy) * (isButtonDown ? 0.60f : 0.65f);\r
\r
g.setColour (background);\r
g.fillEllipse (cx - diam, cy - diam, diam * 2.0f, diam * 2.0f);\r
\r
if (! isEnabled())\r
c = c.withAlpha (0.6f);\r
- else if (shouldDrawButtonAsHighlighted)\r
+ else if (isMouseOverButton)\r
c = c.brighter();\r
\r
g.setColour (c);\r
\r
//==============================================================================\r
void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isMouseOverButton, bool isButtonDown) override;\r
\r
void drawTableHeaderBackground (Graphics&, TableHeaderComponent&) override;\r
\r
{\r
}\r
\r
- void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+ void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) override\r
{\r
auto background = Colours::grey;\r
\r
\r
g.fillAll (background);\r
\r
- g.setColour ((! isEnabled() || shouldDrawButtonAsDown) ? colour.withAlpha (0.6f)\r
+ g.setColour ((! isEnabled() || isButtonDown) ? colour.withAlpha (0.6f)\r
: colour);\r
\r
- if (shouldDrawButtonAsHighlighted)\r
+ if (isMouseOverButton)\r
{\r
g.fillAll();\r
g.setColour (background);\r
void LookAndFeel_V4::drawButtonBackground (Graphics& g,\r
Button& button,\r
const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted,\r
- bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton,\r
+ bool isButtonDown)\r
{\r
auto cornerSize = 6.0f;\r
auto bounds = button.getLocalBounds().toFloat().reduced (0.5f, 0.5f);\r
auto baseColour = backgroundColour.withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f)\r
.withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f);\r
\r
- if (shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted)\r
- baseColour = baseColour.contrasting (shouldDrawButtonAsDown ? 0.2f : 0.05f);\r
+ if (isButtonDown || isMouseOverButton)\r
+ baseColour = baseColour.contrasting (isButtonDown ? 0.2f : 0.05f);\r
\r
g.setColour (baseColour);\r
\r
}\r
\r
void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)\r
+ bool isMouseOverButton, bool isButtonDown)\r
{\r
auto fontSize = jmin (15.0f, button.getHeight() * 0.75f);\r
auto tickWidth = fontSize * 1.1f;\r
tickWidth, tickWidth,\r
button.getToggleState(),\r
button.isEnabled(),\r
- shouldDrawButtonAsHighlighted,\r
- shouldDrawButtonAsDown);\r
+ isMouseOverButton,\r
+ isButtonDown);\r
\r
g.setColour (button.findColour (ToggleButton::textColourId));\r
g.setFont (fontSize);\r
float x, float y, float w, float h,\r
const bool ticked,\r
const bool isEnabled,\r
- const bool shouldDrawButtonAsHighlighted,\r
- const bool shouldDrawButtonAsDown)\r
+ const bool isMouseOverButton,\r
+ const bool isButtonDown)\r
{\r
- ignoreUnused (isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
+ ignoreUnused (isEnabled, isMouseOverButton, isButtonDown);\r
\r
Rectangle<float> tickBounds (x, y, w, h);\r
\r
p.addRoundedRectangle (bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(),\r
cornerSize, cornerSize, isTopPanel, isTopPanel, false, false);\r
\r
+ auto bkg = Colours::grey;\r
+\r
g.setGradientFill (ColourGradient::vertical (Colours::white.withAlpha (isMouseOver ? 0.4f : 0.2f), static_cast<float> (area.getY()),\r
Colours::darkgrey.withAlpha (0.1f), static_cast<float> (area.getBottom())));\r
g.fillPath (p);\r
Font getTextButtonFont (TextButton&, int buttonHeight) override;\r
\r
void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool isMouseOverButton, bool isButtonDown) override;\r
\r
- void drawToggleButton (Graphics&, ToggleButton&,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) override;\r
void drawTickBox (Graphics&, Component&,\r
float x, float y, float w, float h,\r
- bool ticked, bool isEnabled,\r
- bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override;\r
+ bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override;\r
\r
void changeToggleButtonWidthToFitText (ToggleButton&) override;\r
\r
if (newComponent != custom)\r
{\r
if (custom != nullptr)\r
- removeChildComponent (custom.get());\r
+ removeChildComponent (custom);\r
\r
custom = newComponent;\r
- addAndMakeVisible (*custom);\r
+ addAndMakeVisible (custom);\r
resized();\r
}\r
}\r
triggerAsyncUpdate();\r
}\r
\r
-void MenuBarModel::setApplicationCommandManagerToWatch (ApplicationCommandManager* newManager)\r
+void MenuBarModel::setApplicationCommandManagerToWatch (ApplicationCommandManager* const newManager) noexcept\r
{\r
if (manager != newManager)\r
{\r
}\r
}\r
\r
-void MenuBarModel::addListener (Listener* newListener)\r
+void MenuBarModel::addListener (Listener* const newListener) noexcept\r
{\r
listeners.add (newListener);\r
}\r
\r
-void MenuBarModel::removeListener (Listener* listenerToRemove)\r
+void MenuBarModel::removeListener (Listener* const listenerToRemove) noexcept\r
{\r
// Trying to remove a listener that isn't on the list!\r
// If this assertion happens because this object is a dangling pointer, make sure you've not\r
This will also allow it to flash a menu name when a command from that menu\r
is invoked using a keystroke.\r
*/\r
- void setApplicationCommandManagerToWatch (ApplicationCommandManager* manager);\r
+ void setApplicationCommandManagerToWatch (ApplicationCommandManager* manager) noexcept;\r
\r
//==============================================================================\r
/** A class to receive callbacks when a MenuBarModel changes.\r
\r
@see removeListener\r
*/\r
- void addListener (Listener* listenerToAdd);\r
+ void addListener (Listener* listenerToAdd) noexcept;\r
\r
/** Removes a listener.\r
@see addListener\r
*/\r
- void removeListener (Listener* listenerToRemove);\r
+ void removeListener (Listener* listenerToRemove) noexcept;\r
\r
//==============================================================================\r
/** This method must return a list of the names of the menus. */\r
{\r
\r
class MouseSourceState;\r
-struct MenuWindow;\r
+class MenuWindow;\r
\r
static bool canBeTriggered (const PopupMenu::Item& item) noexcept { return item.isEnabled && item.itemID != 0 && ! item.isSectionHeader; }\r
static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept { return item.isEnabled && item.subMenu != nullptr && item.subMenu->items.size() > 0; }\r
: item (i), customComp (i.customComponent)\r
{\r
if (item.isSectionHeader)\r
- customComp = *new HeaderItemComponent (item.text);\r
+ customComp = new HeaderItemComponent (item.text);\r
\r
- if (customComp != nullptr)\r
- addAndMakeVisible (*customComp);\r
+ addAndMakeVisible (customComp);\r
\r
parent.addAndMakeVisible (this);\r
\r
\r
~ItemComponent()\r
{\r
- removeChildComponent (customComp.get());\r
+ removeChildComponent (customComp);\r
}\r
\r
void getIdealSize (int& idealWidth, int& idealHeight, const int standardItemHeight)\r
};\r
\r
//==============================================================================\r
-struct MenuWindow : public Component\r
+class MenuWindow : public Component\r
{\r
+public:\r
MenuWindow (const PopupMenu& menu, MenuWindow* parentWindow,\r
const Options& opts, bool alignToRectangle, bool shouldDismissOnMouseUp,\r
ApplicationCommandManager** manager, float parentScaleFactor = 1.0f)\r
\r
setLookAndFeel (parent != nullptr ? &(parent->getLookAndFeel())\r
: menu.lookAndFeel.get());\r
+\r
auto& lf = getLookAndFeel();\r
\r
parentComponent = lf.getParentComponentForMenuOptions (options);\r
- const_cast<Options&>(options) = options.withParentComponent (parentComponent);\r
\r
if (parentComponent == nullptr && parentWindow == nullptr && lf.shouldPopupMenuScaleWithTargetComponent (options))\r
if (auto* targetComponent = options.getTargetComponent())\r
}\r
\r
//==============================================================================\r
- Rectangle<int> getParentArea (Point<int> targetPoint, Component* relativeTo = nullptr)\r
+ Rectangle<int> getParentArea (Point<int> targetPoint)\r
{\r
- if (relativeTo != nullptr)\r
- targetPoint = relativeTo->localPointToGlobal (targetPoint);\r
-\r
- auto parentArea = Desktop::getInstance().getDisplays().findDisplayForPoint (targetPoint)\r
+ auto parentArea = Desktop::getInstance().getDisplays().getDisplayContaining (targetPoint)\r
#if JUCE_MAC\r
.userArea;\r
#else\r
windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())),\r
currentY);\r
\r
- auto parentArea = getParentArea (windowPos.getPosition(), parentComponent) / scaleFactor;\r
+ auto parentArea = getParentArea (windowPos.getPosition()) / scaleFactor;\r
auto deltaY = wantedY - currentY;\r
\r
windowPos.setSize (jmin (windowPos.getWidth(), parentArea.getWidth()),\r
activeSubMenu.reset (new HelperClasses::MenuWindow (*(childComp->item.subMenu), this,\r
options.withTargetScreenArea (childComp->getScreenBounds())\r
.withMinimumWidth (0)\r
- .withTargetComponent (nullptr)\r
- .withParentComponent (parentComponent),\r
+ .withTargetComponent (nullptr),\r
false, dismissOnMouseUp, managerOfChosenCommand, scaleFactor));\r
\r
activeSubMenu->setVisible (true); // (must be called before enterModalState on Windows to avoid DropShadower confusion)\r
{\r
PopupMenuSettings::menuWasHiddenBecauseOfAppChange = true;\r
window.dismissMenu (nullptr);\r
- // Note: This object may have been deleted by the previous call.\r
+ // Note: this object may have been deleted by the previous call..\r
}\r
}\r
else if (wasDown && timeNow > window.windowCreationTime + 250\r
else if ((window.hasBeenOver || ! window.dismissOnMouseUp) && ! isOverAny)\r
window.dismissMenu (nullptr);\r
\r
- // Note: This object may have been deleted by the previous call.\r
+ // Note: this object may have been deleted by the previous call..\r
}\r
else\r
{\r
auto numWindows = windows.size();\r
\r
for (int i = numWindows; --i >= 0;)\r
- {\r
if (auto* pmw = windows[i])\r
- {\r
- pmw->setLookAndFeel (nullptr);\r
pmw->dismissMenu (nullptr);\r
- }\r
- }\r
\r
return numWindows > 0;\r
}\r
menus.add (currentItem->subMenu.get());\r
}\r
else\r
- {\r
index.setUnchecked (index.size() - 1, index.getLast() + 1);\r
- }\r
\r
while (index.size() > 0 && index.getLast() >= menus.getLast()->items.size())\r
{\r
if (Component* p = getParentComponent())\r
target = p->getLocalArea (componentToPointTo, componentToPointTo->getLocalBounds());\r
else\r
- target = componentToPointTo->getScreenBounds().transformedBy (getTransform().inverted());\r
+ target = componentToPointTo->getScreenBounds();\r
\r
setPosition (target, distanceFromTarget, arrowLength);\r
}\r
const int totalW = content.getWidth() + distanceFromTarget * 2;\r
const int totalH = content.getHeight() + distanceFromTarget * 2;\r
\r
- auto availableSpace = (getParentComponent() != nullptr ? getParentComponent()->getLocalBounds()\r
- : getParentMonitorArea().transformedBy (getTransform().inverted()));\r
+ const Rectangle<int> availableSpace (getParentComponent() != nullptr ? getParentComponent()->getLocalBounds()\r
+ : getParentMonitorArea());\r
\r
int spaceAbove = ((allowablePlacements & above) != 0) ? jmax (0, rectangleToPointTo.getY() - availableSpace.getY()) : -1;\r
int spaceBelow = ((allowablePlacements & below) != 0) ? jmax (0, availableSpace.getBottom() - rectangleToPointTo.getBottom()) : -1;\r
</svg>\r
)JUCESPLASHSCREEN";\r
\r
- auto svgXml = parseXML (svgData);\r
- jassert (svgXml != nullptr);\r
+ std::unique_ptr<XmlElement> svgXml (XmlDocument::parse (svgData));\r
return std::unique_ptr<Drawable> (Drawable::createFromSVG (*svgXml));\r
}\r
\r
\r
if (componentToDrag != nullptr)\r
{\r
- auto bounds = componentToDrag->getBounds();\r
+ Rectangle<int> bounds (componentToDrag->getBounds());\r
\r
// If the component is a window, multiple mouse events can get queued while it's in the same position,\r
// so their coordinates become wrong after the first one moves the window, so in that case, we'll use\r
\r
for (auto i = desktop.getNumComponents(); --i >= 0;)\r
{\r
- auto* desktopComponent = desktop.getComponent (i);\r
- auto dPoint = desktopComponent->getLocalPoint (nullptr, screenPos);\r
+ auto* c = desktop.getComponent(i);\r
\r
- if (auto* c = desktopComponent->getComponentAt (dPoint))\r
- {\r
- auto cPoint = c->getLocalPoint (desktopComponent, dPoint);\r
-\r
- if (c->hitTest (cPoint.getX(), cPoint.getY()))\r
- return c;\r
- }\r
+ if (auto* hit = c->getComponentAt (c->getLocalPoint (nullptr, screenPos)))\r
+ return hit;\r
}\r
\r
return nullptr;\r
\r
\r
//==============================================================================\r
- /** This performs an asynchronous drag-and-drop of a set of files to some external\r
+ /** This performs a synchronous drag-and-drop of a set of files to some external\r
application.\r
\r
You can call this function in response to a mouseDrag callback, and it will\r
- use a native operating system drag-and-drop operation to move or copy some\r
+ block, running its own internal message loop and tracking the mouse, while it\r
+ uses a native operating system drag-and-drop operation to move or copy some\r
files to another application.\r
\r
@param files a list of filenames to drag\r
@param canMoveFiles if true, the app that receives the files is allowed to move the files to a new location\r
(if this is appropriate). If false, the receiver is expected to make a copy of them.\r
- @param sourceComponent normally, JUCE will assume that the component under the mouse is the source component\r
+ @param sourceComponent Normally, JUCE will assume that the component under the mouse is the source component\r
of the drag, but you can use this parameter to override this.\r
- @param callback an optional completion callback that will be called when the operation has ended.\r
-\r
- @returns true if the drag operation was successfully started, or false if it failed for some reason\r
-\r
+ @returns true if the files were successfully dropped somewhere, or false if it\r
+ was interrupted\r
@see performExternalDragDropOfText\r
*/\r
static bool performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
- Component* sourceComponent = nullptr,\r
- std::function<void()> callback = nullptr);\r
+ Component* sourceComponent = nullptr);\r
\r
- /** This performs an asynchronous drag-and-drop of a block of text to some external\r
+ /** This performs a synchronous drag-and-drop of a block of text to some external\r
application.\r
\r
You can call this function in response to a mouseDrag callback, and it will\r
- use a native operating system drag-and-drop operation to move or copy some\r
+ block, running its own internal message loop and tracking the mouse, while it\r
+ uses a native operating system drag-and-drop operation to move or copy some\r
text to another application.\r
\r
@param text the text to copy\r
@param sourceComponent Normally, JUCE will assume that the component under the mouse is the source component\r
of the drag, but you can use this parameter to override this.\r
- @param callback an optional completion callback that will be called when the operation has ended.\r
-\r
- @returns true if the drag operation was successfully started, or false if it failed for some reason\r
-\r
+ @returns true if the text was successfully dropped somewhere, or false if it\r
+ was interrupted\r
@see performExternalDragDropOfFiles\r
*/\r
- static bool performExternalDragDropOfText (const String& text, Component* sourceComponent = nullptr,\r
- std::function<void()> callback = nullptr);\r
+ static bool performExternalDragDropOfText (const String& text, Component* sourceComponent = nullptr);\r
\r
protected:\r
/** Override this if you want to be able to perform an external drag of a set of files\r
private:\r
//==============================================================================\r
class DragImageComponent;\r
+ friend class DragImageComponent;\r
+ friend struct ContainerDeletePolicy<DragImageComponent>;\r
OwnedArray<DragImageComponent> dragImageComponents;\r
\r
const MouseInputSource* getMouseInputSourceForDrag (Component* sourceComponent, const MouseInputSource* inputSourceCausingDrag);\r
virtual ~DragAndDropTarget() {}\r
\r
//==============================================================================\r
- /** Contains details about the source of a drag-and-drop operation. */\r
+ /** Contains details about the source of a drag-and-drop operation.\r
+ The contents of this\r
+ */\r
class JUCE_API SourceDetails\r
{\r
public:\r
SharedCursorHandle* cursorHandle = nullptr;\r
\r
friend class MouseInputSourceInternal;\r
- void showInWindow (ComponentPeer*) const;\r
+ void showInWindow (ComponentPeer* window) const;\r
+ void showInAllWindows() const;\r
void* getHandle() const noexcept;\r
\r
- static void* createStandardMouseCursor (MouseCursor::StandardCursorType);\r
+ static void* createStandardMouseCursor (MouseCursor::StandardCursorType type);\r
static void deleteMouseCursor (void* cursorHandle, bool isStandard);\r
\r
JUCE_LEAK_DETECTOR (MouseCursor)\r
pressure (force),\r
orientation (o), rotation (r),\r
tiltX (tX), tiltY (tY),\r
- mouseDownPosition (downPos),\r
eventComponent (eventComp),\r
originalComponent (originator),\r
eventTime (time),\r
mouseDownTime (downTime),\r
source (inputSource),\r
+ mouseDownPos (downPos),\r
numberOfClicks ((uint8) numClicks),\r
wasMovedSinceMouseDown ((uint8) (mouseWasDragged ? 1 : 0))\r
{\r
return MouseEvent (source, otherComponent->getLocalPoint (eventComponent, position),\r
mods, pressure, orientation, rotation, tiltX, tiltY,\r
otherComponent, originalComponent, eventTime,\r
- otherComponent->getLocalPoint (eventComponent, mouseDownPosition),\r
+ otherComponent->getLocalPoint (eventComponent, mouseDownPos),\r
mouseDownTime, numberOfClicks, wasMovedSinceMouseDown != 0);\r
}\r
\r
MouseEvent MouseEvent::withNewPosition (Point<float> newPosition) const noexcept\r
{\r
return MouseEvent (source, newPosition, mods, pressure, orientation, rotation, tiltX, tiltY,\r
- eventComponent, originalComponent, eventTime, mouseDownPosition, mouseDownTime,\r
+ eventComponent, originalComponent, eventTime, mouseDownPos, mouseDownTime,\r
numberOfClicks, wasMovedSinceMouseDown != 0);\r
}\r
\r
MouseEvent MouseEvent::withNewPosition (Point<int> newPosition) const noexcept\r
{\r
return MouseEvent (source, newPosition.toFloat(), mods, pressure, orientation, rotation,\r
- tiltX, tiltY, eventComponent, originalComponent, eventTime, mouseDownPosition,\r
+ tiltX, tiltY, eventComponent, originalComponent, eventTime, mouseDownPos,\r
mouseDownTime, numberOfClicks, wasMovedSinceMouseDown != 0);\r
}\r
\r
Point<int> MouseEvent::getPosition() const noexcept { return Point<int> (x, y); }\r
Point<int> MouseEvent::getScreenPosition() const { return eventComponent->localPointToGlobal (getPosition()); }\r
\r
-Point<int> MouseEvent::getMouseDownPosition() const noexcept { return mouseDownPosition.roundToInt(); }\r
-Point<int> MouseEvent::getMouseDownScreenPosition() const { return eventComponent->localPointToGlobal (mouseDownPosition).roundToInt(); }\r
+Point<int> MouseEvent::getMouseDownPosition() const noexcept { return mouseDownPos.roundToInt(); }\r
+Point<int> MouseEvent::getMouseDownScreenPosition() const { return eventComponent->localPointToGlobal (mouseDownPos).roundToInt(); }\r
\r
-Point<int> MouseEvent::getOffsetFromDragStart() const noexcept { return (position - mouseDownPosition).roundToInt(); }\r
-int MouseEvent::getDistanceFromDragStart() const noexcept { return roundToInt (mouseDownPosition.getDistanceFrom (position)); }\r
+Point<int> MouseEvent::getOffsetFromDragStart() const noexcept { return (position - mouseDownPos).roundToInt(); }\r
+int MouseEvent::getDistanceFromDragStart() const noexcept { return roundToInt (mouseDownPos.getDistanceFrom (position)); }\r
\r
-int MouseEvent::getMouseDownX() const noexcept { return roundToInt (mouseDownPosition.x); }\r
-int MouseEvent::getMouseDownY() const noexcept { return roundToInt (mouseDownPosition.y); }\r
+int MouseEvent::getMouseDownX() const noexcept { return roundToInt (mouseDownPos.x); }\r
+int MouseEvent::getMouseDownY() const noexcept { return roundToInt (mouseDownPos.y); }\r
\r
int MouseEvent::getDistanceFromDragStartX() const noexcept { return getOffsetFromDragStart().x; }\r
int MouseEvent::getDistanceFromDragStartY() const noexcept { return getOffsetFromDragStart().y; }\r
*/\r
const float tiltY;\r
\r
- /** The coordinates of the last place that a mouse button was pressed.\r
- The coordinates are relative to the component specified in MouseEvent::component.\r
- @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
- */\r
- const Point<float> mouseDownPosition;\r
-\r
/** The component that this event applies to.\r
\r
This is usually the component that the mouse was over at the time, but for mouse-drag\r
\r
/** Returns the coordinates of the last place that a mouse was pressed.\r
The coordinates are relative to the component specified in MouseEvent::component.\r
- For a floating point version of this value, see mouseDownPosition.\r
- @see mouseDownPosition, getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
+ @see getDistanceFromDragStart, getDistanceFromDragStartX, mouseWasDraggedSinceMouseDown\r
*/\r
Point<int> getMouseDownPosition() const noexcept;\r
\r
\r
private:\r
//==============================================================================\r
+ const Point<float> mouseDownPos;\r
const uint8 numberOfClicks, wasMovedSinceMouseDown;\r
\r
MouseEvent& operator= (const MouseEvent&);\r
comp.internalMouseDrag (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, pressure, orientation, rotation, tiltX, tiltY);\r
}\r
\r
- void sendMouseUp (Component& comp, Point<float> screenPos, Time time, ModifierKeys oldMods)\r
+ void sendMouseUp (Component& comp, Point<float> screenPos, Time time, const ModifierKeys oldMods)\r
{\r
JUCE_MOUSE_EVENT_DBG ("up")\r
comp.internalMouseUp (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, oldMods, pressure, orientation, rotation, tiltX, tiltY);\r
comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel);\r
}\r
\r
- void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount)\r
+ void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, const float amount)\r
{\r
JUCE_MOUSE_EVENT_DBG ("magnify")\r
comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount);\r
\r
//==============================================================================\r
// (returns true if the button change caused a modal event loop)\r
- bool setButtons (Point<float> screenPos, Time time, ModifierKeys newButtonState)\r
+ bool setButtons (Point<float> screenPos, Time time, const ModifierKeys newButtonState)\r
{\r
if (buttonState == newButtonState)\r
return false;\r
return lastCounter != mouseEventCounter;\r
}\r
\r
- void setComponentUnderMouse (Component* newComponent, Point<float> screenPos, Time time)\r
+ void setComponentUnderMouse (Component* const newComponent, Point<float> screenPos, Time time)\r
{\r
auto* current = getComponentUnderMouse();\r
\r
WeakReference<Component> safeOldComp (current);\r
setButtons (screenPos, time, ModifierKeys());\r
\r
- if (auto oldComp = safeOldComp.get())\r
+ if (safeOldComp != nullptr)\r
{\r
componentUnderMouse = safeNewComp;\r
- sendMouseExit (*oldComp, screenPos, time);\r
+ sendMouseExit (*safeOldComp, screenPos, time);\r
}\r
\r
buttonState = originalButtonState;\r
}\r
\r
- componentUnderMouse = safeNewComp.get();\r
- current = safeNewComp.get();\r
+ current = componentUnderMouse = safeNewComp;\r
\r
if (current != nullptr)\r
sendMouseEnter (*current, screenPos, time);\r
}\r
}\r
\r
- void setScreenPos (Point<float> newScreenPos, Time time, bool forceUpdate)\r
+ void setScreenPos (Point<float> newScreenPos, Time time, const bool forceUpdate)\r
{\r
if (! isDragging())\r
setComponentUnderMouse (findComponentAt (newScreenPos), newScreenPos, time);\r
else\r
screenPos = peer.localToGlobal (positionWithinPeer);\r
\r
- if (auto target = lastNonInertialWheelTarget.get())\r
+ if (Component* target = lastNonInertialWheelTarget)\r
sendMouseWheel (*target, screenPos, time, wheel);\r
}\r
\r
return nullptr;\r
}\r
\r
- void beginDragAutoRepeat (int interval)\r
+ void beginDragAutoRepeat (const int interval)\r
{\r
if (interval > 0)\r
{\r
{\r
public:\r
//==============================================================================\r
- using ItemType = SelectableItemType;\r
- using ItemArray = Array<SelectableItemType>;\r
- using ParameterType = typename TypeHelpers::ParameterType<SelectableItemType>::type;\r
+ typedef SelectableItemType ItemType;\r
+ typedef Array<SelectableItemType> ItemArray;\r
+ typedef typename TypeHelpers::ParameterType<SelectableItemType>::type ParameterType;\r
\r
//==============================================================================\r
/** Creates an empty set. */\r
- SelectedItemSet() = default;\r
+ SelectedItemSet()\r
+ {\r
+ }\r
\r
/** Creates a set based on an array of items. */\r
explicit SelectedItemSet (const ItemArray& items)\r
\r
/** Creates a copy of another set. */\r
SelectedItemSet (const SelectedItemSet& other)\r
- : ChangeBroadcaster(), selectedItems (other.selectedItems)\r
+ : selectedItems (other.selectedItems)\r
{\r
}\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
FIELD (providers, "providers", "[Landroid/content/pm/ProviderInfo;")\r
\r
-DECLARE_JNI_CLASS (AndroidPackageInfo, "android/content/pm/PackageInfo")\r
+DECLARE_JNI_CLASS (AndroidPackageInfo, "android/content/pm/PackageInfo");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
FIELD (authority, "authority", "Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (AndroidProviderInfo, "android/content/pm/ProviderInfo")\r
+DECLARE_JNI_CLASS (AndroidProviderInfo, "android/content/pm/ProviderInfo");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (createInputStream, "createInputStream", "()Ljava/io/FileInputStream;") \\r
METHOD (getLength, "getLength", "()J")\r
\r
-DECLARE_JNI_CLASS (AssetFileDescriptor, "android/content/res/AssetFileDescriptor")\r
+DECLARE_JNI_CLASS (AssetFileDescriptor, "android/content/res/AssetFileDescriptor");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (close, "close", "()V")\r
\r
-DECLARE_JNI_CLASS (JavaCloseable, "java/io/Closeable")\r
+DECLARE_JNI_CLASS (JavaCloseable, "java/io/Closeable");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (startWatching, "startWatching", "()V") \\r
METHOD (stopWatching, "stopWatching", "()V")\r
\r
-DECLARE_JNI_CLASS (JuceContentProviderFileObserver, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderFileObserver")\r
+DECLARE_JNI_CLASS (JuceContentProviderFileObserver, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderFileObserver");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (addRow, "addRow", "([Ljava/lang/Object;)V") \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH ";J[Ljava/lang/String;)V")\r
\r
-DECLARE_JNI_CLASS (JuceContentProviderFileObserverCursor, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderCursor")\r
+DECLARE_JNI_CLASS (JuceContentProviderFileObserverCursor, JUCE_ANDROID_SHARING_CONTENT_PROVIDER_CLASSPATH "$ProviderCursor");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (open, "open", "(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;")\r
\r
-DECLARE_JNI_CLASS (ParcelFileDescriptor, "android/os/ParcelFileDescriptor")\r
+DECLARE_JNI_CLASS (ParcelFileDescriptor, "android/os/ParcelFileDescriptor");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
javaString ("raw").get(), javaString (packageName).get());\r
\r
// Raw resource not found. Please make sure that you include your file as a raw resource\r
- // and that you specify just the file name, without an extension.\r
+ // and that you specify just the file name, without an extention.\r
jassert (fileId != 0);\r
\r
if (fileId == 0)\r
auto inputStream = StreamCloser (LocalRef<jobject> (env->CallObjectMethod (assetFd,\r
AssetFileDescriptor.createInputStream)));\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
{\r
// Failed to open file stream for resource\r
jassertfalse;\r
+\r
+ env->ExceptionClear();\r
return {};\r
}\r
\r
JavaFileOutputStream.constructor,\r
javaString (tempFile.getFullPathName()).get())));\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
{\r
// Failed to open file stream for temporary file\r
jassertfalse;\r
+\r
+ env->ExceptionClear();\r
return {};\r
}\r
\r
auto buffer = LocalRef<jbyteArray> (env->NewByteArray (1024));\r
int bytesRead = 0;\r
\r
- for (;;)\r
+ while (true)\r
{\r
if (threadShouldExit())\r
return {};\r
\r
bytesRead = env->CallIntMethod (inputStream.stream, JavaFileInputStream.read, buffer.get());\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
{\r
// Failed to read from resource file.\r
jassertfalse;\r
+\r
+ env->ExceptionClear();\r
return {};\r
}\r
\r
\r
env->CallVoidMethod (outputStream.stream, JavaFileOutputStream.write, buffer.get(), 0, bytesRead);\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (exception != 0)\r
{\r
// Failed to write to temporary file.\r
jassertfalse;\r
+\r
+ env->ExceptionClear();\r
return {};\r
}\r
}\r
ParcelFileDescriptor.open,\r
javaFile.get(), modeReadOnly));\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
{\r
// Failed to create file descriptor. Have you provided a valid file path/resource name?\r
jassertfalse;\r
+\r
+ env->ExceptionClear();\r
return nullptr;\r
}\r
\r
jassertfalse; // you must supply an application object for an android app!\r
}\r
\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
}\r
\r
JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, suspendApp, void, (JNIEnv* env, jobject))\r
METHOD (drawBitmap, "drawBitmap", "([IIIFFIIZLandroid/graphics/Paint;)V") \\r
METHOD (getClipBounds, "getClipBounds", "()Landroid/graphics/Rect;")\r
\r
-DECLARE_JNI_CLASS (CanvasMinimal, "android/graphics/Canvas")\r
+DECLARE_JNI_CLASS (CanvasMinimal, "android/graphics/Canvas");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
METHOD (showKeyboard, "showKeyboard", "(Ljava/lang/String;)V") \\r
METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \\r
\r
-DECLARE_JNI_CLASS (ComponentPeerView, JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView")\r
+DECLARE_JNI_CLASS (ComponentPeerView, JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView");\r
#undef JNI_CLASS_MEMBERS\r
\r
\r
}\r
\r
//==============================================================================\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
{\r
Display d;\r
\r
android.screenHeight = screenHeight;\r
android.dpi = dpi;\r
\r
- const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+ const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
}\r
\r
//==============================================================================\r
\r
//==============================================================================\r
void MouseCursor::showInWindow (ComponentPeer*) const {}\r
+void MouseCursor::showInAllWindows() const {}\r
\r
//==============================================================================\r
bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& /*files*/, const bool /*canMove*/,\r
- Component* /*srcComp*/, std::function<void()> /*callback*/)\r
+ Component* /*srcComp*/)\r
{\r
- jassertfalse; // no such thing on Android!\r
return false;\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/,\r
- std::function<void()> /*callback*/)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/)\r
{\r
- jassertfalse; // no such thing on Android!\r
return false;\r
}\r
\r
{"pvu", "paleovu/x-pv"},\r
{"pwz", "application/vnd.ms-powerpoint"},\r
{"py", "text/x-script.phyton"},\r
- {"pyc", "application/x-bytecode.python"},\r
+ {"pyc", "applicaiton/x-bytecode.python"},\r
{"qcp", "audio/vnd.qcelp"},\r
{"qd3", "x-world/x-3dmf"},\r
{"qd3d", "x-world/x-3dmf"},\r
\r
void shareFiles (const Array<URL>& files) override\r
{\r
- auto urls = [NSMutableArray arrayWithCapacity: (NSUInteger) files.size()];\r
+ auto* urls = [NSMutableArray arrayWithCapacity: (NSUInteger) files.size()];\r
\r
for (const auto& f : files)\r
{\r
\r
void shareText (const String& text) override\r
{\r
- auto array = [NSArray arrayWithObject: juceStringToNS (text)];\r
+ auto* array = [NSArray arrayWithObject: juceStringToNS (text)];\r
share (array);\r
}\r
\r
\r
setOpaque (false);\r
\r
- if (SystemStats::isRunningInAppExtensionSandbox())\r
- {\r
- if (fileChooser.parent != nullptr)\r
- {\r
- [controller.get() setModalPresentationStyle:UIModalPresentationFullScreen];\r
-\r
- auto chooserBounds = fileChooser.parent->getBounds();\r
- setBounds (chooserBounds);\r
-\r
- setAlwaysOnTop (true);\r
- fileChooser.parent->addAndMakeVisible (this);\r
- }\r
- else\r
- {\r
- // Opening a native top-level window in an AUv3 is not allowed (sandboxing). You need to specify a\r
- // parent component (for example your editor) to parent the native file chooser window. To do this\r
- // specify a parent component in the FileChooser's constructor!\r
- jassert (fileChooser.parent != nullptr);\r
- }\r
- }\r
- else\r
- {\r
- auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea;\r
- setBounds (chooserBounds);\r
+ auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea;\r
+ setBounds (chooserBounds);\r
\r
- setAlwaysOnTop (true);\r
- addToDesktop (0);\r
- }\r
+ setAlwaysOnTop (true);\r
+ addToDesktop (0);\r
}\r
\r
~Native()\r
\r
NSArray<NSFileAccessIntent*>* intents = @[fileAccessIntent];\r
\r
- auto fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter: nil];\r
+ auto* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter: nil];\r
\r
[fileCoordinator coordinateAccessWithIntents: intents queue: [NSOperationQueue mainQueue] byAccessor: ^(NSError* err)\r
{\r
}\r
else\r
{\r
- auto desc = [error localizedDescription];\r
+ auto* desc = [error localizedDescription];\r
ignoreUnused (desc);\r
jassertfalse;\r
}\r
}\r
else\r
{\r
- auto desc = [err localizedDescription];\r
+ auto* desc = [err localizedDescription];\r
ignoreUnused (desc);\r
jassertfalse;\r
}\r
#if JUCE_DISABLE_NATIVE_FILECHOOSERS\r
return false;\r
#else\r
- return true;\r
+ return [[NSFileManager defaultManager] ubiquityIdentityToken] != nil;\r
#endif\r
}\r
\r
namespace juce\r
{\r
\r
-struct UIViewPeerControllerReceiver\r
-{\r
- virtual ~UIViewPeerControllerReceiver();\r
- virtual void setViewController (UIViewController*) = 0;\r
-};\r
-\r
-UIViewPeerControllerReceiver::~UIViewPeerControllerReceiver() {}\r
-\r
class UIViewComponentPeer : public ComponentPeer,\r
- public FocusChangeListener,\r
- public UIViewPeerControllerReceiver\r
+ public FocusChangeListener\r
{\r
public:\r
UIViewComponentPeer (Component&, int windowStyleFlags, UIView* viewToAttachTo);\r
void setTitle (const String& title) override;\r
void setBounds (const Rectangle<int>&, bool isNowFullScreen) override;\r
\r
- void setViewController (UIViewController* newController) override\r
- {\r
- jassert (controller == nullptr);\r
- controller = [newController retain];\r
- }\r
-\r
Rectangle<int> getBounds() const override { return getBounds (! isSharedWindow); }\r
Rectangle<int> getBounds (bool global) const;\r
Point<float> localToGlobal (Point<float> relativePosition) override;\r
//==============================================================================\r
UIWindow* window;\r
JuceUIView* view;\r
- UIViewController* controller;\r
+ JuceUIViewController* controller;\r
bool isSharedWindow, fullScreen, insideDrawRect, isAppex;\r
\r
static int64 getMouseTime (UIEvent* e) noexcept\r
const Rectangle<int> oldArea (component.getBounds());\r
const Rectangle<int> oldDesktop (desktop.getDisplays().getMainDisplay().userArea);\r
\r
- const_cast<Displays&> (desktop.getDisplays()).refresh();\r
+ const_cast<Desktop::Displays&> (desktop.getDisplays()).refresh();\r
\r
window.transform = Orientations::getCGTransformFor (desktop.getCurrentOrientation());\r
view.transform = CGAffineTransformIdentity;\r
}\r
\r
@property (strong, nonatomic) UIWindow *window;\r
-- (id) init;\r
-- (void) dealloc;\r
+- (id)init;\r
- (void) applicationDidFinishLaunching: (UIApplication*) application;\r
- (void) applicationWillTerminate: (UIApplication*) application;\r
- (void) applicationDidEnterBackground: (UIApplication*) application;\r
\r
NSObject* _pushNotificationsDelegate;\r
\r
-- (id) init\r
+- (id)init\r
{\r
self = [super init];\r
appSuspendTask = UIBackgroundTaskInvalid;\r
return self;\r
}\r
\r
-- (void) dealloc\r
-{\r
- [super dealloc];\r
-}\r
-\r
- (void) applicationDidFinishLaunching: (UIApplication*) application\r
{\r
ignoreUnused (application);\r
}\r
\r
//==============================================================================\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool, Component*, std::function<void()>)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool, Component*)\r
{\r
jassertfalse; // no such thing on iOS!\r
return false;\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String&, Component*, std::function<void()>)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String&, Component*)\r
{\r
jassertfalse; // no such thing on iOS!\r
return false;\r
return Orientations::convertToJuce (orientation);\r
}\r
\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
{\r
JUCE_AUTORELEASEPOOL\r
{\r
static const int extendedKeyModifier = 0x10000000;\r
}\r
\r
-bool KeyPress::isKeyCurrentlyDown (int keyCode)\r
+bool KeyPress::isKeyCurrentlyDown (const int keyCode)\r
{\r
ScopedXDisplay xDisplay;\r
\r
ScopedXLock xlock (display);\r
\r
const int keycode = XKeysymToKeycode (display, (KeySym) keysym);\r
+\r
const int keybyte = keycode >> 3;\r
const int keybit = (1 << (keycode & 7));\r
-\r
return (Keys::keyStates [keybyte] & keybit) != 0;\r
}\r
\r
static bool hasCompositingWindowManager (::Display* display) noexcept\r
{\r
return display != nullptr\r
- && XGetSelectionOwner (display, Atoms::getCreating (display, "_NET_WM_CM_S0")) != 0;\r
+ && XGetSelectionOwner (display, Atoms::getCreating ("_NET_WM_CM_S0")) != 0;\r
}\r
\r
static XRenderPictFormat* findPictureFormat (::Display* display)\r
ScopedXLock xlock (display);\r
XRenderPictFormat* pictFormat = nullptr;\r
\r
- if (isAvailable (display))\r
+ if (isAvailable())\r
{\r
pictFormat = xRenderFindStandardFormat (display, PictStandardARGB32);\r
\r
\r
namespace Visuals\r
{\r
- static Visual* findVisualWithDepth (::Display* display, int desiredDepth) noexcept\r
+ static Visual* findVisualWithDepth (::Display* display, const int desiredDepth) noexcept\r
{\r
ScopedXLock xlock (display);\r
\r
desiredMask |= VisualBitsPerRGBMask;\r
}\r
\r
- if (auto* xvinfos = XGetVisualInfo (display, desiredMask, &desiredVisual, &numVisuals))\r
+ if (XVisualInfo* xvinfos = XGetVisualInfo (display,\r
+ desiredMask,\r
+ &desiredVisual,\r
+ &numVisuals))\r
{\r
for (int i = 0; i < numVisuals; i++)\r
{\r
return visual;\r
}\r
\r
- static Visual* findVisualFormat (::Display* display, int desiredDepth, int& matchedDepth) noexcept\r
+ static Visual* findVisualFormat (::Display* display, const int desiredDepth, int& matchedDepth) noexcept\r
{\r
Visual* visual = nullptr;\r
\r
#if JUCE_USE_XRENDER\r
if (XRender::isAvailable (display))\r
{\r
- if (auto pictFormat = XRender::findPictureFormat (display))\r
+ if (XRenderPictFormat* pictFormat = XRender::findPictureFormat (display))\r
{\r
int numVisuals = 0;\r
XVisualInfo desiredVisual;\r
desiredVisual.depth = 32;\r
desiredVisual.bits_per_rgb = 8;\r
\r
- if (auto xvinfos = XGetVisualInfo (display,\r
- VisualScreenMask | VisualDepthMask | VisualBitsPerRGBMask,\r
- &desiredVisual, &numVisuals))\r
+ if (XVisualInfo* xvinfos = XGetVisualInfo (display,\r
+ VisualScreenMask | VisualDepthMask | VisualBitsPerRGBMask,\r
+ &desiredVisual, &numVisuals))\r
{\r
for (int i = 0; i < numVisuals; ++i)\r
{\r
- auto pictVisualFormat = XRender::xRenderFindVisualFormat (display, xvinfos[i].visual);\r
+ XRenderPictFormat* pictVisualFormat = XRender::xRenderFindVisualFormat (display, xvinfos[i].visual);\r
\r
if (pictVisualFormat != nullptr\r
&& pictVisualFormat->type == PictTypeDirect\r
if (visual == nullptr)\r
{\r
visual = findVisualWithDepth (display, 32);\r
-\r
if (visual != nullptr)\r
matchedDepth = 32;\r
}\r
if (visual == nullptr && desiredDepth >= 24)\r
{\r
visual = findVisualWithDepth (display, 24);\r
-\r
if (visual != nullptr)\r
matchedDepth = 24;\r
}\r
if (visual == nullptr && desiredDepth >= 16)\r
{\r
visual = findVisualWithDepth (display, 16);\r
-\r
if (visual != nullptr)\r
matchedDepth = 16;\r
}\r
return new LowLevelGraphicsSoftwareRenderer (Image (this));\r
}\r
\r
- void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y,\r
- Image::BitmapData::ReadWriteMode mode) override\r
+ void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
{\r
bitmap.data = imageData + x * pixelStride + y * lineStride;\r
bitmap.pixelFormat = pixelFormat;\r
\r
ImageType* createType() const override { return new NativeImageType(); }\r
\r
- void blitToWindow (Window window, int dx, int dy,\r
- unsigned int dw, unsigned int dh, int sx, int sy)\r
+ void blitToWindow (Window window, int dx, int dy, unsigned int dw, unsigned int dh, int sx, int sy)\r
{\r
ScopedXLock xlock (display);\r
\r
\r
if (imageDepth == 16)\r
{\r
- auto rMask = (uint32) xImage->red_mask;\r
- auto gMask = (uint32) xImage->green_mask;\r
- auto bMask = (uint32) xImage->blue_mask;\r
- auto rShiftL = (uint32) jmax (0, getShiftNeeded (rMask));\r
- auto rShiftR = (uint32) jmax (0, -getShiftNeeded (rMask));\r
- auto gShiftL = (uint32) jmax (0, getShiftNeeded (gMask));\r
- auto gShiftR = (uint32) jmax (0, -getShiftNeeded (gMask));\r
- auto bShiftL = (uint32) jmax (0, getShiftNeeded (bMask));\r
- auto bShiftR = (uint32) jmax (0, -getShiftNeeded (bMask));\r
+ const uint32 rMask = (uint32) xImage->red_mask;\r
+ const uint32 gMask = (uint32) xImage->green_mask;\r
+ const uint32 bMask = (uint32) xImage->blue_mask;\r
+ const uint32 rShiftL = (uint32) jmax (0, getShiftNeeded (rMask));\r
+ const uint32 rShiftR = (uint32) jmax (0, -getShiftNeeded (rMask));\r
+ const uint32 gShiftL = (uint32) jmax (0, getShiftNeeded (gMask));\r
+ const uint32 gShiftR = (uint32) jmax (0, -getShiftNeeded (gMask));\r
+ const uint32 bShiftL = (uint32) jmax (0, getShiftNeeded (bMask));\r
+ const uint32 bShiftR = (uint32) jmax (0, -getShiftNeeded (bMask));\r
\r
const Image::BitmapData srcData (Image (this), Image::BitmapData::readOnly);\r
\r
};\r
\r
//==============================================================================\r
-#if JUCE_USE_XINERAMA\r
-static Array<XineramaScreenInfo> XineramaQueryDisplays (::Display* display)\r
+\r
+#if JUCE_USE_XRANDR\r
+template <>\r
+struct ContainerDeletePolicy<XRRScreenResources>\r
{\r
- typedef Bool (*tXineramaIsActive) (::Display*);\r
- typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*);\r
+ static void destroy (XRRScreenResources* object);\r
+};\r
\r
- int major_opcode, first_event, first_error;\r
+template <>\r
+struct ContainerDeletePolicy<XRROutputInfo>\r
+{\r
+ static void destroy (XRROutputInfo* object);\r
+};\r
\r
- if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error))\r
+template <>\r
+struct ContainerDeletePolicy<XRRCrtcInfo>\r
+{\r
+ static void destroy (XRRCrtcInfo* object);\r
+};\r
+#endif\r
+\r
+//================================ X11 - DisplayGeometry =======================\r
+\r
+class DisplayGeometry\r
+{\r
+private:\r
+ //==============================================================================\r
+ DisplayGeometry (::Display* display, double masterScale)\r
{\r
- static void* libXinerama = nullptr;\r
- static tXineramaIsActive isActiveFuncPtr = nullptr;\r
- static tXineramaQueryScreens xineramaQueryScreens = nullptr;\r
+ jassert (instance == nullptr);\r
+ instance = this;\r
\r
- if (libXinerama == nullptr)\r
- {\r
- libXinerama = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW);\r
+ queryDisplayInfos (display, masterScale);\r
+ updatePositions();\r
+ }\r
\r
- if (libXinerama == nullptr)\r
- libXinerama = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW);\r
+public:\r
+ //==============================================================================\r
+ struct ExtendedInfo\r
+ {\r
+ // Unlike Desktop::Displays::Display, the following is in\r
+ // physical pixels, i.e. the area is not scaled\r
+ Rectangle<int> totalBounds;\r
+ // Usable bounds is the usable area in local coordinates\r
+ // with respect to the above totalBounds\r
+ Rectangle<int> usableBounds;\r
+ // top-left point of display in scaled coordinates. This\r
+ // is different from totalBounds.getTopLeft() / scale,\r
+ // because the neighbouring display may have a different\r
+ // scale factor\r
+ Point<int> topLeftScaled;\r
+ double dpi, scale;\r
+ bool isMain;\r
+ };\r
\r
- if (libXinerama != nullptr)\r
- {\r
- isActiveFuncPtr = (tXineramaIsActive) dlsym (libXinerama, "XineramaIsActive");\r
- xineramaQueryScreens = (tXineramaQueryScreens) dlsym (libXinerama, "XineramaQueryScreens");\r
- }\r
- }\r
+ Array<ExtendedInfo> infos;\r
\r
- if (isActiveFuncPtr != nullptr && xineramaQueryScreens != nullptr && isActiveFuncPtr (display) != 0)\r
+ //==============================================================================\r
+ ExtendedInfo& findDisplayForRect (Rectangle<int> bounds, bool isScaledBounds)\r
+ {\r
+ int maxArea = -1;\r
+ ExtendedInfo* retval = nullptr;\r
+\r
+ for (int i = 0; i < infos.size(); ++i)\r
{\r
- int numScreens;\r
+ auto& dpy = infos.getReference (i);\r
\r
- if (auto* xinfo = xineramaQueryScreens (display, &numScreens))\r
- {\r
- Array<XineramaScreenInfo> infos (xinfo, numScreens);\r
- XFree (xinfo);\r
+ auto displayBounds = dpy.totalBounds;\r
+\r
+ if (isScaledBounds)\r
+ displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled;\r
\r
- return infos;\r
+ displayBounds = displayBounds.getIntersection (bounds);\r
+ int area = displayBounds.getWidth() * displayBounds.getHeight();\r
+\r
+ if (area >= maxArea)\r
+ {\r
+ maxArea = area;\r
+ retval = &dpy;\r
}\r
}\r
- }\r
\r
- return {};\r
-}\r
-#endif\r
+ return *retval;\r
+ }\r
\r
-//==============================================================================\r
-#if JUCE_USE_XRANDR\r
-class XRandrWrapper\r
-{\r
-private:\r
- XRandrWrapper()\r
+ ExtendedInfo& findDisplayForPoint (Point<int> pt, bool isScaledPoint)\r
{\r
- if (libXrandr == nullptr)\r
+ int minDistance = (int) ((((unsigned int)(-1)) >> 1) - 1);\r
+ ExtendedInfo* retval = nullptr;\r
+\r
+ for (int i = 0; i < infos.size(); ++i)\r
{\r
- libXrandr = dlopen ("libXrandr.so", RTLD_GLOBAL | RTLD_NOW);\r
+ auto& dpy = infos.getReference (i);\r
\r
- if (libXrandr == nullptr)\r
- libXrandr = dlopen ("libXrandr.so.2", RTLD_GLOBAL | RTLD_NOW);\r
+ auto displayBounds = dpy.totalBounds;\r
\r
- if (libXrandr != nullptr)\r
+ if (isScaledPoint)\r
+ displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled;\r
+\r
+ if (displayBounds.contains (pt))\r
+ return dpy;\r
+\r
+ int distance = displayBounds.getCentre().getDistanceFrom (pt);\r
+ if (distance <= minDistance)\r
{\r
- getScreenResourcesPtr = (tXRRGetScreenResources) dlsym (libXrandr, "XRRGetScreenResources");\r
- freeScreenResourcesPtr = (tXRRFreeScreenResources) dlsym (libXrandr, "XRRFreeScreenResources");\r
- getOutputInfoPtr = (tXRRGetOutputInfo) dlsym (libXrandr, "XRRGetOutputInfo");\r
- freeOutputInfoPtr = (tXRRFreeOutputInfo) dlsym (libXrandr, "XRRFreeOutputInfo");\r
- getCrtcInfoPtr = (tXRRGetCrtcInfo) dlsym (libXrandr, "XRRGetCrtcInfo");\r
- freeCrtcInfoPtr = (tXRRFreeCrtcInfo) dlsym (libXrandr, "XRRFreeCrtcInfo");\r
- getOutputPrimaryPtr = (tXRRGetOutputPrimary) dlsym (libXrandr, "XRRGetOutputPrimary");\r
+ minDistance = distance;\r
+ retval = &dpy;\r
}\r
}\r
- }\r
\r
-public:\r
- //==============================================================================\r
- static XRandrWrapper& getInstance()\r
- {\r
- static XRandrWrapper xrandr;\r
- return xrandr;\r
+ return *retval;\r
}\r
\r
//==============================================================================\r
- XRRScreenResources* getScreenResources (::Display* display, ::Window window)\r
+ static Rectangle<int> physicalToScaled (Rectangle<int> physicalBounds)\r
{\r
- if (getScreenResourcesPtr != nullptr)\r
- return getScreenResourcesPtr (display, window);\r
+ // first find with which display physicalBounds has the most overlap\r
+ auto& dpy = getInstance().findDisplayForRect (physicalBounds, false);\r
\r
- return nullptr;\r
+ // convert to local screen bounds\r
+ physicalBounds -= dpy.totalBounds.getTopLeft();\r
+\r
+ // now we can safely scale the coordinates and convert to global again\r
+ return (physicalBounds / dpy.scale) + dpy.topLeftScaled;\r
}\r
\r
- XRROutputInfo* getOutputInfo (::Display* display, XRRScreenResources* resources, RROutput output)\r
+ static Rectangle<int> scaledToPhysical (Rectangle<int> scaledBounds)\r
{\r
- if (getOutputInfoPtr != nullptr)\r
- return getOutputInfoPtr (display, resources, output);\r
+ // first find with which display physicalBounds has the most overlap\r
+ auto& dpy = getInstance().findDisplayForRect (scaledBounds, true);\r
\r
- return nullptr;\r
+ // convert to local screen bounds\r
+ scaledBounds -= dpy.topLeftScaled;\r
+\r
+ // now we can safely scale the coordinates and convert to global again\r
+ return (scaledBounds * dpy.scale) + dpy.totalBounds.getTopLeft();\r
}\r
\r
- XRRCrtcInfo* getCrtcInfo (::Display* display, XRRScreenResources* resources, RRCrtc crtc)\r
+ //==============================================================================\r
+ template <typename ValueType>\r
+ static Point<ValueType> physicalToScaled (Point<ValueType> physicalPoint)\r
{\r
- if (getCrtcInfoPtr != nullptr)\r
- return getCrtcInfoPtr (display, resources, crtc);\r
+ auto& dpy = getInstance().findDisplayForPoint (physicalPoint.roundToInt(), false);\r
\r
- return nullptr;\r
+ Point<ValueType> scaledTopLeft (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY());\r
+ Point<ValueType> physicalTopLeft (dpy.totalBounds.getX(), dpy.totalBounds.getY());\r
+\r
+ return ((physicalPoint - physicalTopLeft) / dpy.scale) + scaledTopLeft;\r
}\r
\r
- RROutput getOutputPrimary (::Display* display, ::Window window)\r
+ template <typename ValueType>\r
+ static Point<ValueType> scaledToPhysical (const Point<ValueType>& scaledPoint)\r
{\r
- if (getOutputPrimaryPtr != nullptr)\r
- return getOutputPrimaryPtr (display, window);\r
+ auto& dpy = getInstance().findDisplayForPoint (scaledPoint.roundToInt(), true);\r
\r
- return 0;\r
+ Point<ValueType> scaledTopLeft (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY());\r
+ Point<ValueType> physicalTopLeft (dpy.totalBounds.getX(), dpy.totalBounds.getY());\r
+\r
+ return ((scaledPoint - scaledTopLeft) * dpy.scale) + physicalTopLeft;\r
}\r
\r
//==============================================================================\r
- void freeScreenResources (XRRScreenResources* ptr)\r
+ static DisplayGeometry& getInstance()\r
{\r
- if (freeScreenResourcesPtr != nullptr)\r
- freeScreenResourcesPtr (ptr);\r
+ jassert (instance != nullptr);\r
+ return *instance;\r
}\r
\r
- void freeOutputInfo (XRROutputInfo* ptr)\r
+ static DisplayGeometry& getOrCreateInstance (::Display* display, double masterScale)\r
{\r
- if (freeOutputInfoPtr != nullptr)\r
- freeOutputInfoPtr (ptr);\r
+ if (instance == nullptr)\r
+ new DisplayGeometry (display, masterScale);\r
+\r
+ return getInstance();\r
}\r
\r
- void freeCrtcInfo (XRRCrtcInfo* ptr)\r
+private:\r
+ //==============================================================================\r
+ static DisplayGeometry* instance;\r
+\r
+ //==============================================================================\r
+ #if JUCE_USE_XINERAMA\r
+ static Array<XineramaScreenInfo> XineramaQueryDisplays (::Display* display)\r
{\r
- if (freeCrtcInfoPtr != nullptr)\r
- freeCrtcInfoPtr (ptr);\r
+ typedef Bool (*tXineramaIsActive) (::Display*);\r
+ typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*);\r
+\r
+ int major_opcode, first_event, first_error;\r
+\r
+ if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error))\r
+ {\r
+ static void* libXinerama = nullptr;\r
+ static tXineramaIsActive isActiveFuncPtr = nullptr;\r
+ static tXineramaQueryScreens xineramaQueryScreens = nullptr;\r
+\r
+ if (libXinerama == nullptr)\r
+ {\r
+ libXinerama = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW);\r
+\r
+ if (libXinerama == nullptr)\r
+ libXinerama = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW);\r
+\r
+ if (libXinerama != nullptr)\r
+ {\r
+ isActiveFuncPtr = (tXineramaIsActive) dlsym (libXinerama, "XineramaIsActive");\r
+ xineramaQueryScreens = (tXineramaQueryScreens) dlsym (libXinerama, "XineramaQueryScreens");\r
+ }\r
+ }\r
+\r
+ if (isActiveFuncPtr != nullptr && xineramaQueryScreens != nullptr && isActiveFuncPtr (display) != 0)\r
+ {\r
+ int numScreens;\r
+\r
+ if (auto* xinfo = xineramaQueryScreens (display, &numScreens))\r
+ {\r
+ Array<XineramaScreenInfo> infos (xinfo, numScreens);\r
+ XFree (xinfo);\r
+\r
+ return infos;\r
+ }\r
+ }\r
+ }\r
+\r
+ return {};\r
}\r
+ #endif\r
\r
-private:\r
- using tXRRGetScreenResources = XRRScreenResources* (*) (::Display*, ::Window);\r
- using tXRRFreeScreenResources = void (*) (XRRScreenResources*);\r
- using tXRRGetOutputInfo = XRROutputInfo* (*) (::Display*, XRRScreenResources*, RROutput);\r
- using tXRRFreeOutputInfo = void (*) (XRROutputInfo*);\r
- using tXRRGetCrtcInfo = XRRCrtcInfo* (*) (::Display*, XRRScreenResources*, RRCrtc);\r
- using tXRRFreeCrtcInfo = void (*) (XRRCrtcInfo*);\r
- using tXRRGetOutputPrimary = RROutput (*) (::Display*, ::Window);\r
-\r
- void* libXrandr = nullptr;\r
- tXRRGetScreenResources getScreenResourcesPtr = nullptr;\r
- tXRRFreeScreenResources freeScreenResourcesPtr = nullptr;\r
- tXRRGetOutputInfo getOutputInfoPtr = nullptr;\r
- tXRRFreeOutputInfo freeOutputInfoPtr = nullptr;\r
- tXRRGetCrtcInfo getCrtcInfoPtr = nullptr;\r
- tXRRFreeCrtcInfo freeCrtcInfoPtr = nullptr;\r
- tXRRGetOutputPrimary getOutputPrimaryPtr = nullptr;\r
-};\r
-#endif\r
+ //==============================================================================\r
+ #if JUCE_USE_XRANDR\r
+ friend struct ContainerDeletePolicy<XRRScreenResources>;\r
+ friend struct ContainerDeletePolicy<XRROutputInfo>;\r
+ friend struct ContainerDeletePolicy<XRRCrtcInfo>;\r
\r
+ class XRandrWrapper\r
+ {\r
+ private:\r
+ XRandrWrapper()\r
+ {\r
+ if (libXrandr == nullptr)\r
+ {\r
+ libXrandr = dlopen ("libXrandr.so", RTLD_GLOBAL | RTLD_NOW);\r
\r
-static double getDisplayDPI (::Display* display, int index)\r
-{\r
- double dpiX = (DisplayWidth (display, index) * 25.4) / DisplayWidthMM (display, index);\r
- double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index);\r
- return (dpiX + dpiY) / 2.0;\r
-}\r
+ if (libXrandr == nullptr)\r
+ libXrandr = dlopen ("libXrandr.so.2", RTLD_GLOBAL | RTLD_NOW);\r
\r
-static double getScaleForDisplay (const String& name, double dpi)\r
-{\r
- if (name.isNotEmpty())\r
+ if (libXrandr != nullptr)\r
+ {\r
+ getScreenResourcesPtr = (tXRRGetScreenResources) dlsym (libXrandr, "XRRGetScreenResources");\r
+ freeScreenResourcesPtr = (tXRRFreeScreenResources) dlsym (libXrandr, "XRRFreeScreenResources");\r
+ getOutputInfoPtr = (tXRRGetOutputInfo) dlsym (libXrandr, "XRRGetOutputInfo");\r
+ freeOutputInfoPtr = (tXRRFreeOutputInfo) dlsym (libXrandr, "XRRFreeOutputInfo");\r
+ getCrtcInfoPtr = (tXRRGetCrtcInfo) dlsym (libXrandr, "XRRGetCrtcInfo");\r
+ freeCrtcInfoPtr = (tXRRFreeCrtcInfo) dlsym (libXrandr, "XRRFreeCrtcInfo");\r
+ getOutputPrimaryPtr = (tXRRGetOutputPrimary) dlsym (libXrandr, "XRRGetOutputPrimary");\r
+ }\r
+ }\r
+\r
+ instance = this;\r
+ }\r
+\r
+ public:\r
+ //==============================================================================\r
+ static XRandrWrapper& getInstance()\r
+ {\r
+ if (instance == nullptr)\r
+ instance = new XRandrWrapper();\r
+\r
+ return *instance;\r
+ }\r
+\r
+ //==============================================================================\r
+ XRRScreenResources* getScreenResources (::Display* display, ::Window window)\r
+ {\r
+ if (getScreenResourcesPtr != nullptr)\r
+ return getScreenResourcesPtr (display, window);\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ XRROutputInfo* getOutputInfo (::Display* display, XRRScreenResources* resources, RROutput output)\r
+ {\r
+ if (getOutputInfoPtr != nullptr)\r
+ return getOutputInfoPtr (display, resources, output);\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ XRRCrtcInfo* getCrtcInfo (::Display* display, XRRScreenResources* resources, RRCrtc crtc)\r
+ {\r
+ if (getCrtcInfoPtr != nullptr)\r
+ return getCrtcInfoPtr (display, resources, crtc);\r
+\r
+ return nullptr;\r
+ }\r
+\r
+ RROutput getOutputPrimary (::Display* display, ::Window window)\r
+ {\r
+ if (getOutputPrimaryPtr != nullptr)\r
+ return getOutputPrimaryPtr (display, window);\r
+\r
+ return 0;\r
+ }\r
+\r
+ private:\r
+ //==============================================================================\r
+ friend struct ContainerDeletePolicy<XRRScreenResources>;\r
+ friend struct ContainerDeletePolicy<XRROutputInfo>;\r
+ friend struct ContainerDeletePolicy<XRRCrtcInfo>;\r
+\r
+ void freeScreenResources (XRRScreenResources* ptr)\r
+ {\r
+ if (freeScreenResourcesPtr != nullptr)\r
+ freeScreenResourcesPtr (ptr);\r
+ }\r
+\r
+ void freeOutputInfo (XRROutputInfo* ptr)\r
+ {\r
+ if (freeOutputInfoPtr != nullptr)\r
+ freeOutputInfoPtr (ptr);\r
+ }\r
+\r
+ void freeCrtcInfo (XRRCrtcInfo* ptr)\r
+ {\r
+ if (freeCrtcInfoPtr != nullptr)\r
+ freeCrtcInfoPtr (ptr);\r
+ }\r
+ private:\r
+ static XRandrWrapper* instance;\r
+\r
+ typedef XRRScreenResources* (*tXRRGetScreenResources) (::Display*, ::Window);\r
+ typedef void (*tXRRFreeScreenResources) (XRRScreenResources*);\r
+ typedef XRROutputInfo* (*tXRRGetOutputInfo) (::Display*, XRRScreenResources*, RROutput);\r
+ typedef void (*tXRRFreeOutputInfo) (XRROutputInfo*);\r
+ typedef XRRCrtcInfo* (*tXRRGetCrtcInfo) (::Display*, XRRScreenResources*, RRCrtc);\r
+ typedef void (*tXRRFreeCrtcInfo) (XRRCrtcInfo*);\r
+ typedef RROutput (*tXRRGetOutputPrimary) (::Display*, ::Window);\r
+\r
+ void* libXrandr = nullptr;\r
+ tXRRGetScreenResources getScreenResourcesPtr = nullptr;\r
+ tXRRFreeScreenResources freeScreenResourcesPtr = nullptr;\r
+ tXRRGetOutputInfo getOutputInfoPtr = nullptr;\r
+ tXRRFreeOutputInfo freeOutputInfoPtr = nullptr;\r
+ tXRRGetCrtcInfo getCrtcInfoPtr = nullptr;\r
+ tXRRFreeCrtcInfo freeCrtcInfoPtr = nullptr;\r
+ tXRRGetOutputPrimary getOutputPrimaryPtr = nullptr;\r
+ };\r
+ #endif\r
+\r
+\r
+ static double getDisplayDPI (::Display* display, int index)\r
{\r
- // Ubuntu and derived distributions now save a per-display scale factor as a configuration\r
- // variable. This can be changed in the Monitor system settings panel.\r
- ChildProcess dconf;\r
+ double dpiX = (DisplayWidth (display, index) * 25.4) / DisplayWidthMM (display, index);\r
+ double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index);\r
+ return (dpiX + dpiY) / 2.0;\r
+ }\r
\r
- if (File ("/usr/bin/dconf").existsAsFile()\r
- && dconf.start ("/usr/bin/dconf read /com/ubuntu/user-interface/scale-factor", ChildProcess::wantStdOut))\r
+ static double getScaleForDisplay (const String& name, const ExtendedInfo& info)\r
+ {\r
+ if (! name.isEmpty())\r
{\r
- if (dconf.waitForProcessToFinish (200))\r
+ // Ubuntu and derived distributions now save a per-display scale factor as a configuration\r
+ // variable. This can be changed in the Monitor system settings panel.\r
+ ChildProcess dconf;\r
+ if (File ("/usr/bin/dconf").existsAsFile() &&\r
+ dconf.start ("/usr/bin/dconf read /com/ubuntu/user-interface/scale-factor", ChildProcess::wantStdOut))\r
{\r
- auto jsonOutput = dconf.readAllProcessOutput().replaceCharacter ('\'', '"');\r
+ if (dconf.waitForProcessToFinish (200))\r
+ {\r
+ String jsonOutput = dconf.readAllProcessOutput().replaceCharacter ('\'', '"');\r
\r
- if (dconf.getExitCode() == 0 && jsonOutput.isNotEmpty())\r
+ if (dconf.getExitCode() == 0 && jsonOutput.isNotEmpty())\r
+ {\r
+ var jsonVar = JSON::parse (jsonOutput);\r
+\r
+ if (DynamicObject* object = jsonVar.getDynamicObject())\r
+ {\r
+ var scaleFactorVar = object->getProperty (name);\r
+ if (! scaleFactorVar.isVoid())\r
+ {\r
+ double scaleFactor = ((double) scaleFactorVar) / 8.0;\r
+\r
+ if (scaleFactor > 0.0)\r
+ return scaleFactor;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ {\r
+ // Other gnome based distros now use gsettings for a global scale factor\r
+ ChildProcess gsettings;\r
+\r
+ if (File ("/usr/bin/gsettings").existsAsFile()\r
+ && gsettings.start ("/usr/bin/gsettings get org.gnome.desktop.interface scaling-factor", ChildProcess::wantStdOut))\r
+ {\r
+ if (gsettings.waitForProcessToFinish (200))\r
{\r
- auto jsonVar = JSON::parse (jsonOutput);\r
+ auto gsettingsOutput = StringArray::fromTokens (gsettings.readAllProcessOutput(), true);\r
\r
- if (auto* object = jsonVar.getDynamicObject())\r
+ if (gsettingsOutput.size() >= 2 && gsettingsOutput[1].length() > 0)\r
{\r
- auto scaleFactorVar = object->getProperty (name);\r
+ auto scaleFactor = gsettingsOutput[1].getDoubleValue();\r
+\r
+ if (scaleFactor > 0.0)\r
+ return scaleFactor;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // If no scale factor is set by GNOME or Ubuntu then calculate from monitor dpi\r
+ // We use the same approach as chromium which simply divides the dpi by 96\r
+ // and then rounds the result\r
+ return round (info.dpi / 150.0);\r
+ }\r
+\r
+ //==============================================================================\r
+ void queryDisplayInfos (::Display* display, double masterScale) noexcept\r
+ {\r
+ ScopedXLock xlock (display);\r
\r
- if (! scaleFactorVar.isVoid())\r
+ #if JUCE_USE_XRANDR\r
+ {\r
+ int major_opcode, first_event, first_error;\r
+\r
+ if (XQueryExtension (display, "RANDR", &major_opcode, &first_event, &first_error))\r
+ {\r
+ XRandrWrapper& xrandr = XRandrWrapper::getInstance();\r
+\r
+ std::unique_ptr<XRRScreenResources> screens;\r
+\r
+ const int numMonitors = ScreenCount (display);\r
+ RROutput mainDisplay = xrandr.getOutputPrimary (display, RootWindow (display, 0));\r
+\r
+ for (int i = 0; i < numMonitors; ++i)\r
+ {\r
+ screens.reset (xrandr.getScreenResources (display, RootWindow (display, i)));\r
+\r
+ if (screens != nullptr)\r
+ {\r
+ for (int j = 0; j < screens->noutput; ++j)\r
{\r
- auto scaleFactor = ((double) scaleFactorVar) / 8.0;\r
+ if (! screens->outputs[j])\r
+ continue;\r
+\r
+ // Xrandr on the raspberry pi fails to determine the main display (mainDisplay == 0)!\r
+ // Detect this edge case and make the first found display the main display\r
+ if (! mainDisplay)\r
+ mainDisplay = screens->outputs[j];\r
+\r
+ std::unique_ptr<XRROutputInfo> output (xrandr.getOutputInfo (display, screens.get(), screens->outputs[j]));\r
\r
- if (scaleFactor > 0.0)\r
- return scaleFactor;\r
+ if (output != nullptr)\r
+ {\r
+ if (! output->crtc)\r
+ continue;\r
+\r
+ std::unique_ptr<XRRCrtcInfo> crtc (xrandr.getCrtcInfo (display, screens.get(), output->crtc));\r
+\r
+ if (crtc != nullptr)\r
+ {\r
+ ExtendedInfo e;\r
+ e.totalBounds = Rectangle<int> (crtc->x, crtc->y,\r
+ (int) crtc->width, (int) crtc->height);\r
+ e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+ e.topLeftScaled = e.totalBounds.getTopLeft();\r
+ e.isMain = (mainDisplay == screens->outputs[j]) && (i == 0);\r
+ e.dpi = getDisplayDPI (display, 0);\r
+\r
+ // The raspberry pi returns a zero sized display, so we need to guard for divide-by-zero\r
+ if (output->mm_width > 0 && output->mm_height > 0)\r
+ e.dpi = ((static_cast<double> (crtc->width) * 25.4 * 0.5) / static_cast<double> (output->mm_width))\r
+ + ((static_cast<double> (crtc->height) * 25.4 * 0.5) / static_cast<double> (output->mm_height));\r
+\r
+ double scale = getScaleForDisplay (output->name, e);\r
+ scale = (scale <= 0.1 ? 1.0 : scale);\r
+\r
+ e.scale = masterScale * scale;\r
+\r
+ infos.add (e);\r
+ }\r
+ }\r
}\r
}\r
}\r
}\r
}\r
+ if (infos.size() == 0)\r
+ #endif\r
+ #if JUCE_USE_XINERAMA\r
+ {\r
+ Array<XineramaScreenInfo> screens = XineramaQueryDisplays (display);\r
+ int numMonitors = screens.size();\r
+\r
+ for (int index = 0; index < numMonitors; ++index)\r
+ {\r
+ for (int j = numMonitors; --j >= 0;)\r
+ {\r
+ if (screens[j].screen_number == index)\r
+ {\r
+ ExtendedInfo e;\r
+ e.totalBounds = Rectangle<int> (screens[j].x_org,\r
+ screens[j].y_org,\r
+ screens[j].width,\r
+ screens[j].height);\r
+ e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+ e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+ e.isMain = (index == 0);\r
+ e.scale = masterScale;\r
+ e.dpi = getDisplayDPI (display, 0); // (all screens share the same DPI)\r
+\r
+ infos.add (e);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (infos.size() == 0)\r
+ #endif\r
+ {\r
+ Atom hints = Atoms::getIfExists (display, "_NET_WORKAREA");\r
+\r
+ if (hints != None)\r
+ {\r
+ const int numMonitors = ScreenCount (display);\r
+\r
+ for (int i = 0; i < numMonitors; ++i)\r
+ {\r
+ GetXProperty prop (display, RootWindow (display, i), hints, 0, 4, false, XA_CARDINAL);\r
+\r
+ if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4)\r
+ {\r
+ const long* const position = (const long*) prop.data;\r
+\r
+ ExtendedInfo e;\r
+ e.totalBounds = Rectangle<int> ((int) position[0], (int) position[1],\r
+ (int) position[2], (int) position[3]);\r
+ e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet\r
+ e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+ e.isMain = (infos.size() == 0);\r
+ e.scale = masterScale;\r
+ e.dpi = getDisplayDPI (display, i);\r
+\r
+ infos.add (e);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (infos.size() == 0)\r
+ {\r
+ ExtendedInfo e;\r
+ e.totalBounds = Rectangle<int> (DisplayWidth (display, DefaultScreen (display)),\r
+ DisplayHeight (display, DefaultScreen (display)));\r
+ e.usableBounds = e.totalBounds; // Support for usable area is not implemented in JUCE yet\r
+ e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later\r
+ e.isMain = true;\r
+ e.scale = masterScale;\r
+ e.dpi = getDisplayDPI (display, 0);\r
+\r
+ infos.add (e);\r
+ }\r
+ }\r
}\r
\r
+ //==============================================================================\r
+ void updateScaledDisplayCoordinate (bool updateYCoordinates)\r
{\r
- // Other gnome based distros now use gsettings for a global scale factor\r
- ChildProcess gsettings;\r
+ if (infos.size() < 2)\r
+ return;\r
+\r
+ Array<ExtendedInfo*> copy;\r
+\r
+ for (auto& i : infos)\r
+ copy.add (&i);\r
+\r
+ std::sort (copy.begin(), copy.end(), [updateYCoordinates] (const ExtendedInfo* a, const ExtendedInfo* b)\r
+ {\r
+ if (updateYCoordinates)\r
+ return a->totalBounds.getY() < b->totalBounds.getY();\r
\r
- if (File ("/usr/bin/gsettings").existsAsFile()\r
- && gsettings.start ("/usr/bin/gsettings get org.gnome.desktop.interface scaling-factor", ChildProcess::wantStdOut))\r
+ return a->totalBounds.getX() < b->totalBounds.getX();\r
+ });\r
+\r
+ for (int i = 1; i < copy.size(); ++i)\r
{\r
- if (gsettings.waitForProcessToFinish (200))\r
+ auto& current = *copy[i];\r
+\r
+ // Is this screen's position aligned to any other previous display?\r
+ for (int j = i - 1; j >= 0; --j)\r
{\r
- auto gsettingsOutput = StringArray::fromTokens (gsettings.readAllProcessOutput(), true);\r
+ auto& other = *copy[j];\r
+ auto prevCoordinate = updateYCoordinates ? other.totalBounds.getBottom() : other.totalBounds.getRight();\r
+ auto curCoordinate = updateYCoordinates ? current.totalBounds.getY() : current.totalBounds.getX();\r
\r
- if (gsettingsOutput.size() >= 2 && gsettingsOutput[1].length() > 0)\r
+ if (prevCoordinate == curCoordinate)\r
{\r
- auto scaleFactor = gsettingsOutput[1].getDoubleValue();\r
+ // both displays are aligned! As "other" comes before "current" in the array, it must already\r
+ // have a valid topLeftScaled which we can use\r
+ auto topLeftScaled = other.topLeftScaled;\r
+ topLeftScaled += Point<int> (other.totalBounds.getWidth(), other.totalBounds.getHeight()) / other.scale;\r
+\r
+ if (updateYCoordinates)\r
+ current.topLeftScaled.setY (topLeftScaled.getY());\r
+ else\r
+ current.topLeftScaled.setX (topLeftScaled.getX());\r
\r
- if (scaleFactor > 0.0)\r
- return scaleFactor;\r
+ break;\r
}\r
}\r
}\r
}\r
\r
- // If no scale factor is set by GNOME or Ubuntu then calculate from monitor dpi\r
- // We use the same approach as chromium which simply divides the dpi by 96\r
- // and then rounds the result\r
- return round (dpi / 150.0);\r
+ void updatePositions()\r
+ {\r
+ updateScaledDisplayCoordinate (false);\r
+ updateScaledDisplayCoordinate (true);\r
+ }\r
+};\r
+\r
+DisplayGeometry* DisplayGeometry::instance = nullptr;\r
+\r
+#if JUCE_USE_XRANDR\r
+DisplayGeometry::XRandrWrapper* DisplayGeometry::XRandrWrapper::instance = nullptr;\r
+\r
+void ContainerDeletePolicy<XRRScreenResources>::destroy (XRRScreenResources* ptr)\r
+{\r
+ if (ptr != nullptr)\r
+ DisplayGeometry::XRandrWrapper::getInstance().freeScreenResources (ptr);\r
+}\r
+\r
+void ContainerDeletePolicy<XRROutputInfo>::destroy (XRROutputInfo* ptr)\r
+{\r
+ if (ptr != nullptr)\r
+ DisplayGeometry::XRandrWrapper::getInstance().freeOutputInfo (ptr);\r
}\r
\r
+void ContainerDeletePolicy<XRRCrtcInfo>::destroy (XRRCrtcInfo* ptr)\r
+{\r
+ if (ptr != nullptr)\r
+ DisplayGeometry::XRandrWrapper::getInstance().freeCrtcInfo (ptr);\r
+}\r
+#endif\r
+\r
//=============================== X11 - Pixmap =================================\r
\r
namespace PixmapHelpers\r
{\r
ScopedXLock xlock (display);\r
\r
- auto width = (unsigned int) image.getWidth();\r
- auto height = (unsigned int) image.getHeight();\r
+ const unsigned int width = (unsigned int) image.getWidth();\r
+ const unsigned int height = (unsigned int) image.getHeight();\r
HeapBlock<uint32> colour (width * height);\r
int index = 0;\r
\r
{\r
ScopedXLock xlock (display);\r
\r
- auto width = (unsigned int) image.getWidth();\r
- auto height = (unsigned int) image.getHeight();\r
- auto stride = (width + 7) >> 3;\r
+ const unsigned int width = (unsigned int) image.getWidth();\r
+ const unsigned int height = (unsigned int) image.getHeight();\r
+ const unsigned int stride = (width + 7) >> 3;\r
HeapBlock<char> mask;\r
mask.calloc (stride * height);\r
const bool msbfirst = (BitmapBitOrder (display) == MSBFirst);\r
{\r
for (unsigned int x = 0; x < width; ++x)\r
{\r
- auto bit = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
+ const char bit = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
const unsigned int offset = y * stride + (x >> 3);\r
\r
if (image.getPixelAt ((int) x, (int) y).getAlpha() >= 128)\r
class LinuxComponentPeer : public ComponentPeer\r
{\r
public:\r
- LinuxComponentPeer (Component& comp, int windowStyleFlags, Window parentToAddTo)\r
+ LinuxComponentPeer (Component& comp, const int windowStyleFlags, Window parentToAddTo)\r
: ComponentPeer (comp, windowStyleFlags),\r
isAlwaysOnTop (comp.isAlwaysOnTop())\r
{\r
// it's dangerous to create a window on a thread other than the message thread..\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
display = XWindowSystem::getInstance()->displayRef();\r
\r
~LinuxComponentPeer()\r
{\r
// it's dangerous to delete a window on a thread other than the message thread..\r
- JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED\r
+ jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
\r
#if JUCE_X11_SUPPORTS_XEMBED\r
juce_handleXEmbedEvent (this, nullptr);\r
bounds = newBounds.withSize (jmax (1, newBounds.getWidth()),\r
jmax (1, newBounds.getHeight()));\r
\r
- auto& displays = Desktop::getInstance().getDisplays();\r
+ currentScaleFactor = DisplayGeometry::getInstance().findDisplayForRect (bounds, true).scale;\r
\r
- auto newScaleFactor = displays.findDisplayForRect (bounds, true).scale;\r
- if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
- {\r
- currentScaleFactor = newScaleFactor;\r
- scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
- }\r
-\r
- auto physicalBounds = displays.logicalToPhysical (bounds);\r
+ auto physicalBounds = DisplayGeometry::scaledToPhysical (bounds);\r
\r
WeakReference<Component> deletionChecker (&component);\r
ScopedXLock xlock (display);\r
\r
- auto* hints = XAllocSizeHints();\r
+ XSizeHints* const hints = XAllocSizeHints();\r
hints->flags = USSize | USPosition;\r
hints->x = physicalBounds.getX();\r
hints->y = physicalBounds.getY();\r
&& ((unsigned long*) prop.data)[0] == IconicState;\r
}\r
\r
- void setFullScreen (bool shouldBeFullScreen) override\r
+ void setFullScreen (const bool shouldBeFullScreen) override\r
{\r
auto r = lastNonFullscreenBounds; // (get a copy of this before de-minimising)\r
\r
{\r
for (int i = (int) windowListSize; --i >= 0;)\r
{\r
- if (auto* peer = LinuxComponentPeer::getPeerFor (windowList[i]))\r
+ if (LinuxComponentPeer* const peer = LinuxComponentPeer::getPeerFor (windowList[i]))\r
{\r
result = (peer == this);\r
break;\r
return Point<float> ((float) e.x, (float) e.y) / currentScaleFactor;\r
}\r
\r
- void handleWheelEvent (const XButtonPressedEvent& buttonPressEvent, float amount)\r
+ void handleWheelEvent (const XButtonPressedEvent& buttonPressEvent, const float amount)\r
{\r
MouseWheelDetails wheel;\r
wheel.deltaX = 0.0f;\r
while (XEventsQueued (display, QueuedAfterFlush) > 0)\r
{\r
XPeekEvent (display, &nextEvent);\r
-\r
if (nextEvent.type != Expose || nextEvent.xany.window != exposeEvent.window)\r
break;\r
\r
XNextEvent (display, &nextEvent);\r
- auto& nextExposeEvent = (const XExposeEvent&) nextEvent.xexpose;\r
+ const XExposeEvent& nextExposeEvent = (const XExposeEvent&) nextEvent.xexpose;\r
repaint (Rectangle<int> (nextExposeEvent.x, nextExposeEvent.y,\r
nextExposeEvent.width, nextExposeEvent.height) / currentScaleFactor);\r
}\r
{\r
if (clientMsg.message_type == atoms->protocols && clientMsg.format == 32)\r
{\r
- auto atom = (Atom) clientMsg.data.l[0];\r
+ const Atom atom = (Atom) clientMsg.data.l[0];\r
\r
if (atom == atoms->protocolList [Atoms::PING])\r
{\r
}\r
}\r
\r
- bool externalDragTextInit (const String& text, std::function<void()> cb)\r
+ bool externalDragTextInit (const String& text)\r
{\r
if (dragState->dragging)\r
return false;\r
\r
- return externalDragInit (true, text, cb);\r
+ return externalDragInit (true, text);\r
}\r
\r
- bool externalDragFileInit (const StringArray& files, bool /*canMoveFiles*/, std::function<void()> cb)\r
+ bool externalDragFileInit (const StringArray& files, bool /*canMoveFiles*/)\r
{\r
if (dragState->dragging)\r
return false;\r
uriList.add ("file://" + f);\r
}\r
\r
- return externalDragInit (false, uriList.joinIntoString ("\r\n"), cb);\r
+ return externalDragInit (false, uriList.joinIntoString ("\r\n"));\r
}\r
\r
//==============================================================================\r
}\r
\r
//==============================================================================\r
- double getPlatformScaleFactor() const noexcept override\r
+ double getCurrentScale() noexcept\r
{\r
return currentScaleFactor;\r
}\r
ScopedXLock xlock (display);\r
XShmSegmentInfo segmentinfo;\r
\r
- auto testImage = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)),\r
- 24, ZPixmap, 0, &segmentinfo, 64, 64);\r
+ XImage* const testImage\r
+ = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)),\r
+ 24, ZPixmap, 0, &segmentinfo, 64, 64);\r
\r
useARGBImagesForRendering = (testImage->bits_per_pixel == 32);\r
XDestroyImage (testImage);\r
}\r
#endif\r
\r
- auto originalRepaintRegion = regionsNeedingRepaint;\r
+ RectangleList<int> originalRepaintRegion (regionsNeedingRepaint);\r
regionsNeedingRepaint.clear();\r
- auto totalArea = originalRepaintRegion.getBounds();\r
+ const Rectangle<int> totalArea (originalRepaintRegion.getBounds());\r
\r
if (! totalArea.isEmpty())\r
{\r
unsigned long status;\r
};\r
\r
- static void updateKeyStates (int keycode, bool press) noexcept\r
+ static void updateKeyStates (const int keycode, const bool press) noexcept\r
{\r
const int keybyte = keycode >> 3;\r
const int keybit = (1 << (keycode & 7));\r
Keys::keyStates [keybyte] &= ~keybit;\r
}\r
\r
- static void updateKeyModifiers (int status) noexcept\r
+ static void updateKeyModifiers (const int status) noexcept\r
{\r
int keyMods = 0;\r
\r
Keys::capsLock = ((status & LockMask) != 0);\r
}\r
\r
- static bool updateKeyModifiersFromSym (KeySym sym, bool press) noexcept\r
+ static bool updateKeyModifiersFromSym (KeySym sym, const bool press) noexcept\r
{\r
int modifier = 0;\r
bool isModifier = true;\r
static void updateModifierMappings() noexcept\r
{\r
ScopedXLock xlock (display);\r
- int altLeftCode = XKeysymToKeycode (display, XK_Alt_L);\r
- int numLockCode = XKeysymToKeycode (display, XK_Num_Lock);\r
+ const int altLeftCode = XKeysymToKeycode (display, XK_Alt_L);\r
+ const int numLockCode = XKeysymToKeycode (display, XK_Num_Lock);\r
\r
Keys::AltMask = 0;\r
Keys::NumLockMask = 0;\r
\r
- if (auto* mapping = XGetModifierMapping (display))\r
+ if (XModifierKeymap* const mapping = XGetModifierMapping (display))\r
{\r
- for (int modifierIdx = 0; modifierIdx < 8; ++modifierIdx)\r
+ for (int i = 0; i < 8; i++)\r
{\r
- for (int keyIndex = 0; keyIndex < mapping->max_keypermod; ++keyIndex)\r
- {\r
- auto key = mapping->modifiermap[(modifierIdx * mapping->max_keypermod) + keyIndex];\r
-\r
- if (key == altLeftCode)\r
- Keys::AltMask = 1 << modifierIdx;\r
- else if (key == numLockCode)\r
- Keys::NumLockMask = 1 << modifierIdx;\r
- }\r
+ if (mapping->modifiermap [i << 1] == altLeftCode)\r
+ Keys::AltMask = 1 << i;\r
+ else if (mapping->modifiermap [i << 1] == numLockCode)\r
+ Keys::NumLockMask = 1 << i;\r
}\r
\r
XFreeModifiermap (mapping);\r
static int64 getEventTime (::Time t)\r
{\r
static int64 eventTimeOffset = 0x12345678;\r
- auto thisMessageTime = (int64) t;\r
+ const int64 thisMessageTime = (int64) t;\r
\r
if (eventTimeOffset == 0x12345678)\r
eventTimeOffset = Time::currentTimeMillis() - thisMessageTime;\r
\r
if (prop.success && prop.actualFormat == 32)\r
{\r
- auto* sizes = (const unsigned long*) prop.data;\r
+ const unsigned long* const sizes = (const unsigned long*) prop.data;\r
\r
windowBorder = BorderSize<int> ((int) sizes[2], (int) sizes[0],\r
(int) sizes[3], (int) sizes[1]);\r
wx = wy = 0;\r
\r
Rectangle<int> physicalBounds (wx, wy, (int) ww, (int) wh);\r
- auto& displays = Desktop::getInstance().getDisplays();\r
\r
- auto newScaleFactor = displays.findDisplayForRect (physicalBounds, true).scale;\r
- if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
- {\r
- currentScaleFactor = newScaleFactor;\r
- scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
- }\r
+ currentScaleFactor =\r
+ DisplayGeometry::getInstance().findDisplayForRect (physicalBounds, false).scale;\r
\r
- bounds = displays.physicalToLogical (physicalBounds);\r
+ bounds = DisplayGeometry::physicalToScaled (physicalBounds);\r
}\r
}\r
\r
Rectangle<int> silentRect;\r
String textOrFiles;\r
Array<Atom> allowedTypes;\r
- std::function<void()> completionCallback;\r
};\r
\r
//==============================================================================\r
XSendEvent (display, dragAndDropSourceWindow, False, 0, (XEvent*) &msg);\r
}\r
\r
- bool sendExternalDragAndDropMessage (XClientMessageEvent& msg, Window targetWindow)\r
+ bool sendExternalDragAndDropMessage (XClientMessageEvent& msg, const Window targetWindow)\r
{\r
msg.type = ClientMessage;\r
msg.display = display;\r
return XSendEvent (display, targetWindow, False, 0, (XEvent*) &msg) != 0;\r
}\r
\r
- void sendExternalDragAndDropDrop (Window targetWindow)\r
+ void sendExternalDragAndDropDrop (const Window targetWindow)\r
{\r
XClientMessageEvent msg;\r
zerostruct (msg);\r
sendExternalDragAndDropMessage (msg, targetWindow);\r
}\r
\r
- void sendExternalDragAndDropEnter (Window targetWindow)\r
+ void sendExternalDragAndDropEnter (const Window targetWindow)\r
{\r
XClientMessageEvent msg;\r
zerostruct (msg);\r
sendExternalDragAndDropMessage (msg, targetWindow);\r
}\r
\r
- void sendExternalDragAndDropPosition (Window targetWindow)\r
+ void sendExternalDragAndDropPosition (const Window targetWindow)\r
{\r
XClientMessageEvent msg;\r
zerostruct (msg);\r
if (dragState->silentRect.contains (mousePos)) // we've been asked to keep silent\r
return;\r
\r
- auto& displays = Desktop::getInstance().getDisplays();\r
-\r
- mousePos = displays.logicalToPhysical (mousePos);\r
+ mousePos = DisplayGeometry::scaledToPhysical (mousePos);\r
msg.data.l[1] = 0;\r
msg.data.l[2] = (mousePos.x << 16) | mousePos.y;\r
msg.data.l[3] = CurrentTime;\r
dragState->expectingStatus = sendExternalDragAndDropMessage (msg, targetWindow);\r
}\r
\r
- void sendDragAndDropStatus (bool acceptDrop, Atom dropAction)\r
+ void sendDragAndDropStatus (const bool acceptDrop, Atom dropAction)\r
{\r
XClientMessageEvent msg;\r
zerostruct (msg);\r
sendDragAndDropMessage (msg);\r
}\r
\r
- void sendExternalDragAndDropLeave (Window targetWindow)\r
+ void sendExternalDragAndDropLeave (const Window targetWindow)\r
{\r
XClientMessageEvent msg;\r
zerostruct (msg);\r
srcMimeTypeAtomList.clear();\r
\r
dragAndDropCurrentMimeType = 0;\r
- auto dndCurrentVersion = static_cast<unsigned long> (clientMsg.data.l[1] & 0xff000000) >> 24;\r
+ const unsigned long dndCurrentVersion = static_cast<unsigned long> (clientMsg.data.l[1] & 0xff000000) >> 24;\r
\r
if (dndCurrentVersion < 3 || dndCurrentVersion > Atoms::DndVersion)\r
{\r
&& prop.actualFormat == 32\r
&& prop.numItems != 0)\r
{\r
- auto* types = (const unsigned long*) prop.data;\r
+ const unsigned long* const types = (const unsigned long*) prop.data;\r
\r
for (unsigned long i = 0; i < prop.numItems; ++i)\r
if (types[i] != None)\r
}\r
}\r
\r
- if (srcMimeTypeAtomList.isEmpty())\r
+ if (srcMimeTypeAtomList.size() == 0)\r
{\r
for (int i = 2; i < 5; ++i)\r
if (clientMsg.data.l[i] != None)\r
srcMimeTypeAtomList.add ((unsigned long) clientMsg.data.l[i]);\r
\r
- if (srcMimeTypeAtomList.isEmpty())\r
+ if (srcMimeTypeAtomList.size() == 0)\r
{\r
dragAndDropSourceWindow = 0;\r
return;\r
bool isWindowDnDAware (Window w) const\r
{\r
int numProperties = 0;\r
- auto* properties = XListProperties (display, w, &numProperties);\r
- bool dndAwarePropFound = false;\r
+ Atom* const properties = XListProperties (display, w, &numProperties);\r
\r
+ bool dndAwarePropFound = false;\r
for (int i = 0; i < numProperties; ++i)\r
if (properties[i] == atoms->XdndAware)\r
dndAwarePropFound = true;\r
return externalFindDragTargetWindow (child);\r
}\r
\r
- bool externalDragInit (bool isText, const String& textOrFiles, std::function<void()> cb)\r
+ bool externalDragInit (bool isText, const String& textOrFiles)\r
{\r
ScopedXLock xlock (display);\r
\r
dragState->isText = isText;\r
dragState->textOrFiles = textOrFiles;\r
dragState->targetWindow = windowH;\r
- dragState->completionCallback = cb;\r
\r
const int pointerGrabMask = Button1MotionMask | ButtonReleaseMask;\r
\r
XUngrabPointer (display, CurrentTime);\r
}\r
\r
- if (dragState->completionCallback != nullptr)\r
- dragState->completionCallback();\r
-\r
resetExternalDragState();\r
}\r
\r
}\r
\r
//==============================================================================\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
{\r
ScopedXDisplay xDisplay;\r
\r
if (auto display = xDisplay.display)\r
{\r
- #if JUCE_USE_XRANDR\r
- {\r
- int major_opcode, first_event, first_error;\r
-\r
- if (XQueryExtension (display, "RANDR", &major_opcode, &first_event, &first_error))\r
- {\r
- auto& xrandr = XRandrWrapper::getInstance();\r
-\r
- auto numMonitors = ScreenCount (display);\r
- auto mainDisplay = xrandr.getOutputPrimary (display, RootWindow (display, 0));\r
-\r
- for (int i = 0; i < numMonitors; ++i)\r
- {\r
- if (auto* screens = xrandr.getScreenResources (display, RootWindow (display, i)))\r
- {\r
- for (int j = 0; j < screens->noutput; ++j)\r
- {\r
- if (screens->outputs[j])\r
- {\r
- // Xrandr on the raspberry pi fails to determine the main display (mainDisplay == 0)!\r
- // Detect this edge case and make the first found display the main display\r
- if (! mainDisplay)\r
- mainDisplay = screens->outputs[j];\r
-\r
- if (auto* output = xrandr.getOutputInfo (display, screens, screens->outputs[j]))\r
- {\r
- if (output->crtc)\r
- {\r
- if (auto* crtc = xrandr.getCrtcInfo (display, screens, output->crtc))\r
- {\r
- Display d;\r
- d.totalArea = Rectangle<int> (crtc->x, crtc->y,\r
- (int) crtc->width, (int) crtc->height);\r
- d.isMain = (mainDisplay == screens->outputs[j]) && (i == 0);\r
- d.dpi = getDisplayDPI (display, 0);\r
-\r
- // The raspberry pi returns a zero sized display, so we need to guard for divide-by-zero\r
- if (output->mm_width > 0 && output->mm_height > 0)\r
- d.dpi = ((static_cast<double> (crtc->width) * 25.4 * 0.5) / static_cast<double> (output->mm_width))\r
- + ((static_cast<double> (crtc->height) * 25.4 * 0.5) / static_cast<double> (output->mm_height));\r
-\r
- double scale = getScaleForDisplay (output->name, d.dpi);\r
- scale = (scale <= 0.1 ? 1.0 : scale);\r
-\r
- d.scale = masterScale * scale;\r
-\r
- if (d.isMain)\r
- displays.insert (0, d);\r
- else\r
- displays.add (d);\r
-\r
- xrandr.freeCrtcInfo (crtc);\r
- }\r
- }\r
-\r
- xrandr.freeOutputInfo (output);\r
- }\r
- }\r
- }\r
+ auto& geometry = DisplayGeometry::getOrCreateInstance (display, masterScale);\r
\r
- xrandr.freeScreenResources (screens);\r
- }\r
- }\r
- }\r
- }\r
+ // add the main display first\r
+ int mainDisplayIdx;\r
\r
- if (displays.isEmpty())\r
- #endif\r
- #if JUCE_USE_XINERAMA\r
+ for (mainDisplayIdx = 0; mainDisplayIdx < geometry.infos.size(); ++mainDisplayIdx)\r
{\r
- auto screens = XineramaQueryDisplays (display);\r
- int numMonitors = screens.size();\r
+ auto& info = geometry.infos.getReference (mainDisplayIdx);\r
\r
- for (int index = 0; index < numMonitors; ++index)\r
- {\r
- for (int j = numMonitors; --j >= 0;)\r
- {\r
- if (screens[j].screen_number == index)\r
- {\r
- Display d;\r
- d.totalArea = Rectangle<int> (screens[j].x_org,\r
- screens[j].y_org,\r
- screens[j].width,\r
- screens[j].height);\r
- d.isMain = (index == 0);\r
- d.scale = masterScale;\r
- d.dpi = getDisplayDPI (display, 0); // (all screens share the same DPI)\r
-\r
- displays.add (d);\r
- }\r
- }\r
- }\r
+ if (info.isMain)\r
+ break;\r
}\r
\r
- if (displays.isEmpty())\r
- #endif\r
+ // no main display found then use the first\r
+ if (mainDisplayIdx >= geometry.infos.size())\r
+ mainDisplayIdx = 0;\r
+\r
+ // add the main display\r
{\r
- Atom hints = Atoms::getIfExists (display, "_NET_WORKAREA");\r
+ auto& info = geometry.infos.getReference (mainDisplayIdx);\r
\r
- if (hints != None)\r
- {\r
- auto numMonitors = ScreenCount (display);\r
+ Desktop::Displays::Display d;\r
+ d.isMain = true;\r
+ d.scale = masterScale * info.scale;\r
+ d.dpi = info.dpi;\r
+ d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds);\r
+ d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled;\r
\r
- for (int i = 0; i < numMonitors; ++i)\r
- {\r
- GetXProperty prop (display, RootWindow (display, i), hints, 0, 4, false, XA_CARDINAL);\r
+ displays.add (d);\r
+ }\r
\r
- if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4)\r
- {\r
- auto position = (const long*) prop.data;\r
+ for (int i = 0; i < geometry.infos.size(); ++i)\r
+ {\r
+ // don't add the main display a second time\r
+ if (i == mainDisplayIdx)\r
+ continue;\r
\r
- Display d;\r
- d.totalArea = Rectangle<int> ((int) position[0], (int) position[1],\r
- (int) position[2], (int) position[3]);\r
- d.isMain = displays.isEmpty();\r
- d.scale = masterScale;\r
- d.dpi = getDisplayDPI (display, i);\r
+ auto& info = geometry.infos.getReference (i);\r
\r
- displays.add (d);\r
- }\r
- }\r
- }\r
+ Desktop::Displays::Display d;\r
+ d.isMain = false;\r
+ d.scale = masterScale * info.scale;\r
+ d.dpi = info.dpi;\r
+ d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds);\r
+ d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled;\r
\r
- if (displays.isEmpty())\r
- {\r
- Display d;\r
- d.totalArea = Rectangle<int> (DisplayWidth (display, DefaultScreen (display)),\r
- DisplayHeight (display, DefaultScreen (display)));\r
- d.isMain = true;\r
- d.scale = masterScale;\r
- d.dpi = getDisplayDPI (display, 0);\r
-\r
- displays.add (d);\r
- }\r
+ displays.add (d);\r
}\r
-\r
- for (auto& d : displays)\r
- d.userArea = d.totalArea; // JUCE currently does not support requesting the user area on Linux\r
-\r
- updateToLogical();\r
}\r
}\r
\r
//==============================================================================\r
bool MouseInputSource::SourceList::addSource()\r
{\r
- if (sources.isEmpty())\r
+ if (sources.size() == 0)\r
{\r
addSource (0, MouseInputSource::InputSourceType::mouse);\r
return true;\r
bool Desktop::canUseSemiTransparentWindows() noexcept\r
{\r
#if JUCE_USE_XRENDER\r
- auto display = XWindowSystem::getInstance()->displayRef();\r
-\r
- if (XRender::hasCompositingWindowManager (display))\r
+ if (XRender::hasCompositingWindowManager())\r
{\r
int matchedDepth = 0, desiredDepth = 32;\r
\r
return Visuals::findVisualFormat (display, desiredDepth, matchedDepth) != 0\r
- && matchedDepth == desiredDepth;\r
+ && matchedDepth == desiredDepth;\r
}\r
#endif\r
\r
x = y = -1;\r
}\r
\r
- return Desktop::getInstance().getDisplays().physicalToLogical (Point<float> ((float) x, (float) y));\r
+ return DisplayGeometry::physicalToScaled (Point<float> ((float) x, (float) y));\r
}\r
\r
void MouseInputSource::setRawMousePosition (Point<float> newPosition)\r
{\r
ScopedXLock xlock (display);\r
Window root = RootWindow (display, DefaultScreen (display));\r
- newPosition = Desktop::getInstance().getDisplays().logicalToPhysical (newPosition);\r
+ newPosition = DisplayGeometry::scaledToPhysical (newPosition);\r
XWarpPointer (display, None, root, 0, 0, 0, 0, roundToInt (newPosition.getX()), roundToInt (newPosition.getY()));\r
}\r
}\r
//==============================================================================\r
static bool screenSaverAllowed = true;\r
\r
-void Desktop::setScreenSaverEnabled (bool isEnabled)\r
+void Desktop::setScreenSaverEnabled (const bool isEnabled)\r
{\r
if (screenSaverAllowed != isEnabled)\r
{\r
Rectangle<int> juce_LinuxScaledToPhysicalBounds (ComponentPeer* peer, Rectangle<int> bounds)\r
{\r
if (auto* linuxPeer = dynamic_cast<LinuxComponentPeer*> (peer))\r
- bounds *= linuxPeer->getPlatformScaleFactor();\r
+ bounds *= linuxPeer->getCurrentScale();\r
\r
return bounds;\r
}\r
return nullptr;\r
\r
ScopedXLock xlock (display);\r
- auto imageW = (unsigned int) image.getWidth();\r
- auto imageH = (unsigned int) image.getHeight();\r
+ const unsigned int imageW = (unsigned int) image.getWidth();\r
+ const unsigned int imageH = (unsigned int) image.getHeight();\r
int hotspotX = hotspot.x;\r
int hotspotY = hotspot.y;\r
\r
#if JUCE_USE_XCURSOR\r
{\r
- using tXcursorSupportsARGB = XcursorBool (*) (Display*);\r
- using tXcursorImageCreate = XcursorImage* (*) (int, int);\r
- using tXcursorImageDestroy = void (*) (XcursorImage*);\r
- using tXcursorImageLoadCursor = Cursor (*) (Display*, const XcursorImage*);\r
+ typedef XcursorBool (*tXcursorSupportsARGB) (Display*);\r
+ typedef XcursorImage* (*tXcursorImageCreate) (int, int);\r
+ typedef void (*tXcursorImageDestroy) (XcursorImage*);\r
+ typedef Cursor (*tXcursorImageLoadCursor) (Display*, const XcursorImage*);\r
\r
static tXcursorSupportsARGB xcursorSupportsARGB = nullptr;\r
static tXcursorImageCreate xcursorImageCreate = nullptr;\r
{\r
for (int x = (int) cursorW; --x >= 0;)\r
{\r
- auto mask = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
- auto offset = (unsigned int) y * stride + ((unsigned int) x >> 3);\r
+ const char mask = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7)));\r
+ const unsigned int offset = (unsigned int) y * stride + ((unsigned int) x >> 3);\r
\r
- auto c = im.getPixelAt (x, y);\r
+ const Colour c (im.getPixelAt (x, y));\r
\r
if (c.getAlpha() >= 128) maskPlane[offset] |= mask;\r
if (c.getBrightness() >= 0.5f) sourcePlane[offset] |= mask;\r
return result;\r
}\r
\r
-void MouseCursor::deleteMouseCursor (void* cursorHandle, bool)\r
+void MouseCursor::deleteMouseCursor (void* const cursorHandle, const bool)\r
{\r
if (cursorHandle != nullptr)\r
{\r
lp->showMouseCursor ((Cursor) getHandle());\r
}\r
\r
+void MouseCursor::showInAllWindows() const\r
+{\r
+ for (int i = ComponentPeer::getNumPeers(); --i >= 0;)\r
+ showInWindow (ComponentPeer::getPeer (i));\r
+}\r
+\r
//=================================== X11 - DND ================================\r
static LinuxComponentPeer* getPeerForDragEvent (Component* sourceComp)\r
{\r
return nullptr;\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
- Component* sourceComp, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMoveFiles,\r
+ Component* sourceComp)\r
{\r
- if (files.isEmpty())\r
+ if (files.size() == 0)\r
return false;\r
\r
if (auto* lp = getPeerForDragEvent (sourceComp))\r
- return lp->externalDragFileInit (files, canMoveFiles, callback);\r
+ return lp->externalDragFileInit (files, canMoveFiles);\r
\r
// This method must be called in response to a component's mouseDown or mouseDrag event!\r
jassertfalse;\r
return false;\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComp,\r
- std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComp)\r
{\r
if (text.isEmpty())\r
return false;\r
\r
if (auto* lp = getPeerForDragEvent (sourceComp))\r
- return lp->externalDragTextInit (text, callback);\r
+ return lp->externalDragTextInit (text);\r
\r
// This method must be called in response to a component's mouseDown or mouseDrag event!\r
jassertfalse;\r
\r
exitModalState (0);\r
\r
- if (panel != nil && result ==\r
- #if defined (MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9\r
- NSModalResponseOK)\r
- #else\r
- NSFileHandlingPanelOKButton)\r
- #endif\r
+ if (panel != nil && result == NSFileHandlingPanelOKButton)\r
{\r
auto addURLResult = [&chooserResults] (NSURL* urlToAdd)\r
{\r
auto scheme = nsStringToJuce ([urlToAdd scheme]);\r
- auto pathComponents = StringArray::fromTokens (nsStringToJuce ([urlToAdd path]), "/", {});\r
-\r
- for (auto& component : pathComponents)\r
- component = URL::addEscapeChars (component, false);\r
-\r
- chooserResults.add (URL (scheme + "://" + pathComponents.joinIntoString ("/")));\r
+ auto path = nsStringToJuce ([urlToAdd path]);\r
+ chooserResults.add (URL (scheme + "://" + path));\r
};\r
\r
if (isSave)\r
else\r
{\r
auto* openPanel = (NSOpenPanel*) panel;\r
- auto urls = [openPanel URLs];\r
+ auto* urls = [openPanel URLs];\r
\r
for (unsigned int i = 0; i < [urls count]; ++i)\r
addURLResult ([urls objectAtIndex: i]);\r
JuceMainMenuBarHolder()\r
: mainMenuBar ([[NSMenu alloc] initWithTitle: nsStringLiteral ("MainMenu")])\r
{\r
- auto item = [mainMenuBar addItemWithTitle: nsStringLiteral ("Apple")\r
- action: nil\r
+ auto* item = [mainMenuBar addItemWithTitle: nsStringLiteral ("Apple")\r
+ action: nil\r
keyEquivalent: nsEmptyString()];\r
\r
- auto appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")];\r
+ auto* appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")];\r
\r
[NSApp performSelector: @selector (setAppleMenu:) withObject: appMenu];\r
[mainMenuBar setSubmenu: appMenu forItem: item];\r
}\r
else\r
{\r
- auto item = [[NSMenuItem alloc] initWithTitle: text\r
- action: @selector (menuItemInvoked:)\r
- keyEquivalent: nsEmptyString()];\r
+ auto* item = [[NSMenuItem alloc] initWithTitle: text\r
+ action: @selector (menuItemInvoked:)\r
+ keyEquivalent: nsEmptyString()];\r
\r
[item setTag: topLevelIndex];\r
[item setEnabled: i.isEnabled];\r
{\r
if (isPositiveAndBelow (menuItemIndex, (int) [parentMenu numberOfItems]))\r
{\r
- auto menuItem = [parentMenu itemAtIndex:menuItemIndex];\r
+ auto* menuItem = [parentMenu itemAtIndex:menuItemIndex];\r
\r
- if (auto submenu = [menuItem submenu])\r
+ if (auto* submenu = [menuItem submenu])\r
removeItemRecursive (submenu);\r
\r
[parentMenu removeItem:menuItem];\r
{\r
if ([mainMenu numberOfItems] > 0)\r
{\r
- if (auto appMenu = [[mainMenu itemAtIndex: 0] submenu])\r
+ if (auto* appMenu = [[mainMenu itemAtIndex:0] submenu])\r
{\r
[appMenu removeAllItems];\r
MainMenuHelpers::createStandardAppMenu (appMenu, app->getApplicationName(), extraItems);\r
return nullptr;\r
}\r
\r
-using MenuTrackingChangedCallback = void (*)(bool);\r
+typedef void (*MenuTrackingChangedCallback) (bool);\r
extern MenuTrackingChangedCallback menuTrackingChangedCallback;\r
\r
static void mainMenuTrackingChanged (bool isTracking)\r
[((NSCursor*) cursorHandle) release];\r
}\r
\r
+void MouseCursor::showInAllWindows() const\r
+{\r
+ showInWindow (nullptr);\r
+}\r
+\r
void MouseCursor::showInWindow (ComponentPeer*) const\r
{\r
auto c = (NSCursor*) getHandle();\r
void* CustomMouseCursorInfo::create() const { return nullptr; }\r
void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType) { return nullptr; }\r
void MouseCursor::deleteMouseCursor (void*, bool) {}\r
+void MouseCursor::showInAllWindows() const {}\r
void MouseCursor::showInWindow (ComponentPeer*) const {}\r
\r
#endif\r
return r;\r
}\r
\r
+#if JUCE_MODULE_AVAILABLE_juce_opengl\r
+void componentPeerAboutToChange (Component&, bool);\r
+#endif\r
+\r
//==============================================================================\r
class NSViewComponentPeer : public ComponentPeer,\r
private Timer\r
public:\r
NSViewComponentPeer (Component& comp, const int windowStyleFlags, NSView* viewToAttachTo)\r
: ComponentPeer (comp, windowStyleFlags),\r
- safeComponent (&comp),\r
isSharedWindow (viewToAttachTo != nil),\r
lastRepaintTime (Time::getMillisecondCounter())\r
{\r
name: NSViewFrameDidChangeNotification\r
object: view];\r
\r
+ if (! isSharedWindow)\r
+ {\r
+ [notificationCenter addObserver: view\r
+ selector: @selector (frameChanged:)\r
+ name: NSWindowDidMoveNotification\r
+ object: window];\r
+\r
+ [notificationCenter addObserver: view\r
+ selector: @selector (frameChanged:)\r
+ name: NSWindowDidMiniaturizeNotification\r
+ object: window];\r
+\r
+ [notificationCenter addObserver: view\r
+ selector: @selector (frameChanged:)\r
+ name: NSWindowDidDeminiaturizeNotification\r
+ object: window];\r
+ }\r
+\r
[view setPostsFrameChangedNotifications: YES];\r
\r
if (isSharedWindow)\r
#else\r
[window setDelegate: window];\r
#endif\r
-\r
[window setOpaque: component.isOpaque()];\r
-\r
- #if defined (MAC_OS_X_VERSION_10_14)\r
- if (! [window isOpaque])\r
- [window setBackgroundColor: [NSColor clearColor]];\r
- #endif\r
-\r
[window setHasShadow: ((windowStyleFlags & windowHasDropShadow) != 0)];\r
\r
if (component.isAlwaysOnTop())\r
if ([window respondsToSelector: @selector (setTabbingMode:)])\r
[window setTabbingMode:NSWindowTabbingModeDisallowed];\r
#endif\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (frameChanged:)\r
- name: NSWindowDidMoveNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (frameChanged:)\r
- name: NSWindowDidMiniaturizeNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (windowWillMiniaturize:)\r
- name: NSWindowWillMiniaturizeNotification\r
- object: window];\r
-\r
- [notificationCenter addObserver: view\r
- selector: @selector (windowDidDeminiaturize:)\r
- name: NSWindowDidDeminiaturizeNotification\r
- object: window];\r
}\r
\r
auto alpha = component.getAlpha();\r
{\r
if (isSharedWindow)\r
{\r
- if (shouldBeVisible)\r
- [view setHidden: false];\r
- else if ([window firstResponder] != view || ([window firstResponder] == view && [window makeFirstResponder: nil]))\r
- [view setHidden: true];\r
+ [view setHidden: ! shouldBeVisible];\r
}\r
else\r
{\r
bool setAlwaysOnTop (bool alwaysOnTop) override\r
{\r
if (! isSharedWindow)\r
- {\r
[window setLevel: alwaysOnTop ? ((getStyleFlags() & windowIsTemporary) != 0 ? NSPopUpMenuWindowLevel\r
: NSFloatingWindowLevel)\r
: NSNormalWindowLevel];\r
\r
- isAlwaysOnTop = alwaysOnTop;\r
- }\r
-\r
return true;\r
}\r
\r
\r
void redirectWillMoveToWindow (NSWindow* newWindow)\r
{\r
- if (isSharedWindow && [view window] == window && newWindow == nullptr)\r
- {\r
- if (auto* comp = safeComponent.get())\r
- comp->setVisible (false);\r
- }\r
+ #if JUCE_MODULE_AVAILABLE_juce_opengl\r
+ if ([view window] == window)\r
+ componentPeerAboutToChange (getComponent(), newWindow == nullptr);\r
+ #else\r
+ ignoreUnused (newWindow);\r
+ #endif\r
}\r
\r
void sendMouseEvent (NSEvent* ev)\r
{\r
// (need to retain this in case a modal loop runs in handleKeyEvent and\r
// our event object gets lost)\r
- const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);\r
+ const NSObjectRetainer<NSEvent> r (ev);\r
\r
updateKeysDown (ev, true);\r
bool used = handleKeyEvent (ev, true);\r
void redirectModKeyChange (NSEvent* ev)\r
{\r
// (need to retain this in case a modal loop runs and our event object gets lost)\r
- const std::unique_ptr<NSEvent, NSObjectDeleter> r ([ev retain]);\r
+ const NSObjectRetainer<NSEvent> r (ev);\r
\r
keysCurrentlyDown.clear();\r
handleKeyUpOrDown (true);\r
void viewMovedToWindow()\r
{\r
if (isSharedWindow)\r
- {\r
- auto newWindow = [view window];\r
- bool shouldSetVisible = (window == nullptr && newWindow != nullptr);\r
-\r
- window = newWindow;\r
-\r
- if (shouldSetVisible)\r
- getComponent().setVisible (true);\r
- }\r
+ window = [view window];\r
}\r
\r
void liveResizingStart()\r
//==============================================================================\r
NSWindow* window = nil;\r
NSView* view = nil;\r
- WeakReference<Component> safeComponent;\r
bool isSharedWindow = false, fullScreen = false;\r
bool isWindowInKioskMode = false;\r
#if USE_COREGRAPHICS_RENDERING\r
bool isZooming = false, isFirstLiveResize = false, textWasInserted = false;\r
bool isStretchingTop = false, isStretchingLeft = false, isStretchingBottom = false, isStretchingRight = false;\r
bool windowRepresentsFile = false;\r
- bool isAlwaysOnTop = false, wasAlwaysOnTop = false;\r
String stringBeingComposed;\r
NSNotificationCenter* notificationCenter = nil;\r
\r
addMethod (@selector (magnifyWithEvent:), magnify, "v@:@");\r
addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse, "c@:@");\r
addMethod (@selector (frameChanged:), frameChanged, "v@:@");\r
- addMethod (@selector (windowWillMiniaturize:), windowWillMiniaturize, "v@:@");\r
- addMethod (@selector (windowDidDeminiaturize:), windowDidDeminiaturize, "v@:@");\r
addMethod (@selector (wantsDefaultClipping:), wantsDefaultClipping, "c@:");\r
addMethod (@selector (worksWhenModal), worksWhenModal, "c@:");\r
addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow, "v@:");\r
static void frameChanged (id self, SEL, NSNotification*) { if (auto* p = getOwner (self)) p->redirectMovedOrResized(); }\r
static void viewDidMoveToWindow (id self, SEL) { if (auto* p = getOwner (self)) p->viewMovedToWindow(); }\r
\r
- static void windowWillMiniaturize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* p = getOwner (self))\r
- {\r
- if (p->isAlwaysOnTop)\r
- {\r
- // there is a bug when restoring minimised always on top windows so we need\r
- // to remove this behaviour before minimising and restore it afterwards\r
- p->setAlwaysOnTop (false);\r
- p->wasAlwaysOnTop = true;\r
- }\r
- }\r
- }\r
-\r
- static void windowDidDeminiaturize (id self, SEL, NSNotification*)\r
- {\r
- if (auto* p = getOwner (self))\r
- {\r
- if (p->wasAlwaysOnTop)\r
- {\r
- p->setAlwaysOnTop (true);\r
- p->redirectMovedOrResized();\r
- }\r
- }\r
- }\r
-\r
static BOOL isOpaque (id self, SEL)\r
{\r
auto* owner = getOwner (self);\r
static NSView* getNSViewForDragEvent (Component* sourceComp)\r
{\r
if (sourceComp == nullptr)\r
- if (auto* draggingSource = Desktop::getInstance().getDraggingMouseSource (0))\r
+ if (auto* draggingSource = Desktop::getInstance().getDraggingMouseSource(0))\r
sourceComp = draggingSource->getComponentUnderMouse();\r
\r
if (sourceComp != nullptr)\r
return nil;\r
}\r
\r
-struct NSDraggingSourceHelper : public ObjCClass<NSObject<NSDraggingSource>>\r
+struct TextDragDataProviderClass : public ObjCClass<NSObject>\r
{\r
- NSDraggingSourceHelper() : ObjCClass<NSObject<NSDraggingSource>> ("JUCENSDraggingSourceHelper_")\r
+ TextDragDataProviderClass() : ObjCClass<NSObject> ("JUCE_NSTextDragDataProvider_")\r
{\r
- addIvar<std::function<void()>*> ("callback");\r
addIvar<String*> ("text");\r
- addIvar<NSDragOperation*> ("operation");\r
-\r
addMethod (@selector (dealloc), dealloc, "v@:");\r
addMethod (@selector (pasteboard:item:provideDataForType:), provideDataForType, "v@:@@@");\r
-\r
- addMethod (@selector (draggingSession:sourceOperationMaskForDraggingContext:), sourceOperationMaskForDraggingContext, "c@:@@");\r
- addMethod (@selector (draggingSession:endedAtPoint:operation:), draggingSessionEnded, "v@:@@@");\r
-\r
addProtocol (@protocol (NSPasteboardItemDataProvider));\r
-\r
registerClass();\r
}\r
\r
object_setInstanceVariable (self, "text", new String (text));\r
}\r
\r
- static void setCompletionCallback (id self, std::function<void()> cb)\r
- {\r
- object_setInstanceVariable (self, "callback", new std::function<void()> (cb));\r
- }\r
-\r
- static void setDragOperation (id self, NSDragOperation op)\r
- {\r
- object_setInstanceVariable (self, "operation", new NSDragOperation (op));\r
- }\r
-\r
private:\r
static void dealloc (id self, SEL)\r
{\r
delete getIvar<String*> (self, "text");\r
- delete getIvar<std::function<void()>*> (self, "callback");\r
- delete getIvar<NSDragOperation*> (self, "operation");\r
-\r
sendSuperclassMessage (self, @selector (dealloc));\r
}\r
\r
[sender setData: [juceStringToNS (*text) dataUsingEncoding: NSUTF8StringEncoding]\r
forType: NSPasteboardTypeString];\r
}\r
-\r
- static NSDragOperation sourceOperationMaskForDraggingContext (id self, SEL, NSDraggingSession*, NSDraggingContext)\r
- {\r
- return *getIvar<NSDragOperation*> (self, "operation");\r
- }\r
-\r
- static void draggingSessionEnded (id self, SEL, NSDraggingSession*, NSPoint p, NSDragOperation)\r
- {\r
- // Our view doesn't receive a mouse up when the drag ends so we need to generate one here and send it...\r
- if (auto* view = getNSViewForDragEvent (nullptr))\r
- {\r
- auto* cgEvent = CGEventCreateMouseEvent (nullptr, kCGEventLeftMouseUp, CGPointMake (p.x, p.y), kCGMouseButtonLeft);\r
- [view mouseUp: [NSEvent eventWithCGEvent:cgEvent]];\r
- }\r
-\r
- if (auto* cb = getIvar<std::function<void()>*> (self, "callback"))\r
- cb->operator()();\r
- }\r
};\r
\r
-static NSDraggingSourceHelper draggingSourceHelper;\r
-\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComponent,\r
- std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component* sourceComponent)\r
{\r
if (text.isEmpty())\r
return false;\r
{\r
JUCE_AUTORELEASEPOOL\r
{\r
- if (auto event = [[view window] currentEvent])\r
+ if (auto* event = [[view window] currentEvent])\r
{\r
- id helper = [draggingSourceHelper.createInstance() init];\r
- NSDraggingSourceHelper::setText (helper, text);\r
- NSDraggingSourceHelper::setDragOperation (helper, NSDragOperationCopy);\r
+ static TextDragDataProviderClass dataProviderClass;\r
+ id delegate = [dataProviderClass.createInstance() init];\r
+ TextDragDataProviderClass::setText (delegate, text);\r
\r
- if (callback != nullptr)\r
- NSDraggingSourceHelper::setCompletionCallback (helper, callback);\r
-\r
- auto pasteboardItem = [[NSPasteboardItem new] autorelease];\r
- [pasteboardItem setDataProvider: helper\r
+ auto* pasteboardItem = [[NSPasteboardItem new] autorelease];\r
+ [pasteboardItem setDataProvider: delegate\r
forTypes: [NSArray arrayWithObjects: NSPasteboardTypeString, nil]];\r
\r
- auto dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter: pasteboardItem] autorelease];\r
+ auto* dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter: pasteboardItem] autorelease];\r
\r
NSImage* image = [[NSWorkspace sharedWorkspace] iconForFile: nsEmptyString()];\r
[dragItem setDraggingFrame: getDragRect (view, event) contents: image];\r
\r
- if (auto session = [view beginDraggingSessionWithItems: [NSArray arrayWithObject: dragItem]\r
- event: event\r
- source: helper])\r
- {\r
- session.animatesToStartingPositionsOnCancelOrFail = YES;\r
- session.draggingFormation = NSDraggingFormationNone;\r
+ auto* draggingSession = [view beginDraggingSessionWithItems: [NSArray arrayWithObject: dragItem]\r
+ event: event\r
+ source: delegate];\r
\r
- return true;\r
- }\r
+ draggingSession.animatesToStartingPositionsOnCancelOrFail = YES;\r
+ draggingSession.draggingFormation = NSDraggingFormationNone;\r
+ return true;\r
}\r
}\r
}\r
return false;\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool canMoveFiles,\r
- Component* sourceComponent, std::function<void()> callback)\r
+struct NSDraggingSourceHelper : public ObjCClass<NSObject<NSDraggingSource>>\r
+{\r
+ NSDraggingSourceHelper() : ObjCClass<NSObject<NSDraggingSource>> ("JUCENSDraggingSourceHelper_")\r
+ {\r
+ addMethod (@selector (draggingSession:sourceOperationMaskForDraggingContext:), sourceOperationMaskForDraggingContext, "c@:@@");\r
+ registerClass();\r
+ }\r
+\r
+ static NSDragOperation sourceOperationMaskForDraggingContext (id, SEL, NSDraggingSession*, NSDraggingContext)\r
+ {\r
+ return NSDragOperationCopy;\r
+ }\r
+};\r
+\r
+static NSDraggingSourceHelper draggingSourceHelper;\r
+\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, bool /*canMoveFiles*/,\r
+ Component* sourceComponent)\r
{\r
if (files.isEmpty())\r
return false;\r
{\r
JUCE_AUTORELEASEPOOL\r
{\r
- if (auto event = [[view window] currentEvent])\r
+ if (auto* event = [[view window] currentEvent])\r
{\r
- auto dragItems = [[[NSMutableArray alloc] init] autorelease];\r
+ auto* dragItems = [[[NSMutableArray alloc] init] autorelease];\r
\r
for (auto& filename : files)\r
{\r
auto* nsFilename = juceStringToNS (filename);\r
- auto fileURL = [NSURL fileURLWithPath: nsFilename];\r
- auto dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];\r
+ auto* fileURL = [NSURL fileURLWithPath: nsFilename];\r
+ auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];\r
\r
auto eventPos = [event locationInWindow];\r
auto dragRect = [view convertRect: NSMakeRect (eventPos.x - 16.0f, eventPos.y - 16.0f, 32.0f, 32.0f)\r
fromView: nil];\r
- auto dragImage = [[NSWorkspace sharedWorkspace] iconForFile: nsFilename];\r
+ auto* dragImage = [[NSWorkspace sharedWorkspace] iconForFile: nsFilename];\r
[dragItem setDraggingFrame: dragRect\r
contents: dragImage];\r
\r
[dragItem release];\r
}\r
\r
- auto helper = [draggingSourceHelper.createInstance() autorelease];\r
-\r
- if (callback != nullptr)\r
- NSDraggingSourceHelper::setCompletionCallback (helper, callback);\r
-\r
- NSDraggingSourceHelper::setDragOperation (helper, canMoveFiles ? NSDragOperationMove\r
- : NSDragOperationCopy);\r
+ auto* helper = [draggingSourceHelper.createInstance() autorelease];\r
\r
return [view beginDraggingSessionWithItems: dragItems\r
event: event\r
- source: helper] != nullptr;\r
+ source: helper];\r
}\r
}\r
}\r
{\r
DisplaySettingsChangeCallback()\r
{\r
- CGDisplayRegisterReconfigurationCallback (displayReconfigurationCallBack, nullptr);\r
+ CGDisplayRegisterReconfigurationCallback (displayReconfigurationCallBack, 0);\r
}\r
\r
~DisplaySettingsChangeCallback()\r
{\r
- CGDisplayRemoveReconfigurationCallback (displayReconfigurationCallBack, nullptr);\r
+ CGDisplayRemoveReconfigurationCallback (displayReconfigurationCallBack, 0);\r
clearSingletonInstance();\r
}\r
\r
static void displayReconfigurationCallBack (CGDirectDisplayID, CGDisplayChangeSummaryFlags, void*)\r
{\r
- const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+ const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
}\r
\r
JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL (DisplaySettingsChangeCallback)\r
return convertToRectInt (r);\r
}\r
\r
-static Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenBottom, const float masterScale)\r
+static Desktop::Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenBottom, const float masterScale)\r
{\r
- Displays::Display d;\r
+ Desktop::Displays::Display d;\r
\r
d.isMain = (mainScreenBottom == 0);\r
\r
return d;\r
}\r
\r
-void Displays::findDisplays (const float masterScale)\r
+void Desktop::Displays::findDisplays (const float masterScale)\r
{\r
JUCE_AUTORELEASEPOOL\r
{\r
return hDrop;\r
}\r
\r
- struct DragAndDropJob : public ThreadPoolJob\r
+ bool performDragDrop (FORMATETC* const format, STGMEDIUM* const medium, const DWORD whatToDo)\r
{\r
- DragAndDropJob (FORMATETC f, STGMEDIUM m, DWORD d, std::function<void()> cb)\r
- : ThreadPoolJob ("DragAndDrop"),\r
- format (f), medium (m), whatToDo (d),\r
- completionCallback (cb)\r
- {\r
- }\r
-\r
- JobStatus runJob() override\r
- {\r
- OleInitialize (0);\r
-\r
- auto source = new JuceDropSource();\r
- auto data = new JuceDataObject (source, &format, &medium);\r
-\r
- DWORD effect;\r
- DoDragDrop (data, source, whatToDo, &effect);\r
-\r
- data->Release();\r
- source->Release();\r
-\r
- if (completionCallback != nullptr)\r
- MessageManager::callAsync (completionCallback);\r
-\r
- return jobHasFinished;\r
- }\r
-\r
- FORMATETC format;\r
- STGMEDIUM medium;\r
- DWORD whatToDo;\r
-\r
- std::function<void()> completionCallback;\r
- };\r
+ auto source = new JuceDropSource();\r
+ auto data = new JuceDataObject (source, format, medium);\r
\r
- class ThreadPoolHolder : private DeletedAtShutdown\r
- {\r
- public:\r
- ThreadPoolHolder() = default;\r
+ DWORD effect;\r
+ auto res = DoDragDrop (data, source, whatToDo, &effect);\r
\r
- ~ThreadPoolHolder()\r
- {\r
- // Wait forever if there's a job running. The user needs to cancel the transfer\r
- // in the GUI.\r
- pool.removeAllJobs (true, -1);\r
+ data->Release();\r
+ source->Release();\r
\r
- clearSingletonInstance();\r
- }\r
-\r
- juce_DeclareSingleton_SingleThreaded (ThreadPoolHolder, true)\r
-\r
- // We need to make sure we don't do simultaneous text and file drag and drops,\r
- // so use a pool that can only run a single job.\r
- ThreadPool pool { 1 };\r
- };\r
-\r
- juce_ImplementSingleton_SingleThreaded (ThreadPoolHolder)\r
+ return res == DRAGDROP_S_DROP;\r
+ }\r
}\r
\r
//==============================================================================\r
-bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMove,\r
- Component*, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& files, const bool canMove, Component*)\r
{\r
- if (files.isEmpty())\r
- return false;\r
-\r
FORMATETC format = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r
STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 };\r
\r
medium.hGlobal = DragAndDropHelpers::createHDrop (files);\r
\r
- auto& pool = DragAndDropHelpers::ThreadPoolHolder::getInstance()->pool;\r
- pool.addJob (new DragAndDropHelpers::DragAndDropJob (format, medium,\r
- canMove ? (DROPEFFECT_COPY | DROPEFFECT_MOVE) : DROPEFFECT_COPY,\r
- callback),\r
- true);\r
-\r
- return true;\r
+ return DragAndDropHelpers::performDragDrop (&format, &medium, canMove ? (DWORD) (DROPEFFECT_COPY | DROPEFFECT_MOVE)\r
+ : (DWORD) DROPEFFECT_COPY);\r
}\r
\r
-bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component*, std::function<void()> callback)\r
+bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Component*)\r
{\r
- if (text.isEmpty())\r
- return false;\r
-\r
FORMATETC format = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r
STGMEDIUM medium = { TYMED_HGLOBAL, { 0 }, 0 };\r
\r
auto numBytes = CharPointer_UTF16::getBytesRequiredFor (text.getCharPointer());\r
\r
medium.hGlobal = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, numBytes + 2);\r
- auto* data = static_cast<WCHAR*> (GlobalLock (medium.hGlobal));\r
+ WCHAR* const data = static_cast<WCHAR*> (GlobalLock (medium.hGlobal));\r
\r
- text.copyToUTF16 (data, numBytes + 2);\r
+ text.copyToUTF16 (data, numBytes);\r
format.cfFormat = CF_UNICODETEXT;\r
\r
GlobalUnlock (medium.hGlobal);\r
\r
- auto& pool = DragAndDropHelpers::ThreadPoolHolder::getInstance()->pool;\r
- pool.addJob (new DragAndDropHelpers::DragAndDropJob (format,\r
- medium,\r
- DROPEFFECT_COPY | DROPEFFECT_MOVE,\r
- callback),\r
- true);\r
-\r
- return true;\r
+ return DragAndDropHelpers::performDragDrop (&format, &medium, DROPEFFECT_COPY | DROPEFFECT_MOVE);\r
}\r
\r
} // namespace juce\r
#include <juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h>\r
#endif\r
\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
- #include <juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h>\r
-#endif\r
-\r
namespace juce\r
{\r
\r
\r
struct POINTER_INFO\r
{\r
- POINTER_INPUT_TYPE pointerType;\r
- UINT32 pointerId;\r
- UINT32 frameId;\r
- POINTER_FLAGS pointerFlags;\r
- HANDLE sourceDevice;\r
- HWND hwndTarget;\r
- POINT ptPixelLocation;\r
- POINT ptHimetricLocation;\r
- POINT ptPixelLocationRaw;\r
- POINT ptHimetricLocationRaw;\r
- DWORD dwTime;\r
- UINT32 historyCount;\r
- INT32 InputData;\r
- DWORD dwKeyStates;\r
- UINT64 PerformanceCount;\r
+ POINTER_INPUT_TYPE pointerType;\r
+ UINT32 pointerId;\r
+ UINT32 frameId;\r
+ POINTER_FLAGS pointerFlags;\r
+ HANDLE sourceDevice;\r
+ HWND hwndTarget;\r
+ POINT ptPixelLocation;\r
+ POINT ptHimetricLocation;\r
+ POINT ptPixelLocationRaw;\r
+ POINT ptHimetricLocationRaw;\r
+ DWORD dwTime;\r
+ UINT32 historyCount;\r
+ INT32 InputData;\r
+ DWORD dwKeyStates;\r
+ UINT64 PerformanceCount;\r
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;\r
};\r
\r
#endif\r
\r
#ifndef MONITOR_DPI_TYPE\r
- enum Monitor_DPI_Type\r
- {\r
- MDT_Effective_DPI = 0,\r
- MDT_Angular_DPI = 1,\r
- MDT_Raw_DPI = 2,\r
- MDT_Default = MDT_Effective_DPI\r
- };\r
-#endif\r
-\r
-#ifndef DPI_AWARENESS\r
- enum DPI_Awareness\r
- {\r
- DPI_Awareness_Invalid = -1,\r
- DPI_Awareness_Unaware = 0,\r
- DPI_Awareness_System_Aware = 1,\r
- DPI_Awareness_Per_Monitor_Aware = 2\r
- };\r
-#endif\r
-\r
-#ifndef USER_DEFAULT_SCREEN_DPI\r
- #define USER_DEFAULT_SCREEN_DPI 96\r
+ enum Monitor_DPI_Type\r
+ {\r
+ MDT_Effective_DPI = 0,\r
+ MDT_Angular_DPI = 1,\r
+ MDT_Raw_DPI = 2,\r
+ MDT_Default = MDT_Effective_DPI\r
+ };\r
+\r
+ enum Process_DPI_Awareness\r
+ {\r
+ Process_DPI_Unaware = 0,\r
+ Process_System_DPI_Aware = 1,\r
+ Process_Per_Monitor_DPI_Aware = 2\r
+ };\r
#endif\r
\r
-#ifndef _DPI_AWARENESS_CONTEXTS_\r
- typedef HANDLE DPI_AWARENESS_CONTEXT;\r
-\r
- #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT) - 1)\r
- #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT) - 2)\r
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT) - 3)\r
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT) - 4)\r
-#endif\r
-\r
-//==============================================================================\r
-typedef BOOL (WINAPI* RegisterTouchWindowFunc) (HWND, ULONG);\r
-typedef BOOL (WINAPI* GetTouchInputInfoFunc) (HTOUCHINPUT, UINT, TOUCHINPUT*, int);\r
+typedef BOOL (WINAPI* RegisterTouchWindowFunc) (HWND, ULONG);\r
+typedef BOOL (WINAPI* GetTouchInputInfoFunc) (HTOUCHINPUT, UINT, TOUCHINPUT*, int);\r
typedef BOOL (WINAPI* CloseTouchInputHandleFunc) (HTOUCHINPUT);\r
-typedef BOOL (WINAPI* GetGestureInfoFunc) (HGESTUREINFO, GESTUREINFO*);\r
-\r
-static RegisterTouchWindowFunc registerTouchWindow = nullptr;\r
-static GetTouchInputInfoFunc getTouchInputInfo = nullptr;\r
-static CloseTouchInputHandleFunc closeTouchInputHandle = nullptr;\r
-static GetGestureInfoFunc getGestureInfo = nullptr;\r
+typedef BOOL (WINAPI* GetGestureInfoFunc) (HGESTUREINFO, GESTUREINFO*);\r
+typedef BOOL (WINAPI* SetProcessDPIAwareFunc)();\r
+typedef BOOL (WINAPI* SetProcessDPIAwarenessFunc) (Process_DPI_Awareness);\r
+typedef HRESULT (WINAPI* GetDPIForMonitorFunc) (HMONITOR, Monitor_DPI_Type, UINT*, UINT*);\r
+\r
+static RegisterTouchWindowFunc registerTouchWindow = nullptr;\r
+static GetTouchInputInfoFunc getTouchInputInfo = nullptr;\r
+static CloseTouchInputHandleFunc closeTouchInputHandle = nullptr;\r
+static GetGestureInfoFunc getGestureInfo = nullptr;\r
+static SetProcessDPIAwareFunc setProcessDPIAware = nullptr;\r
+static SetProcessDPIAwarenessFunc setProcessDPIAwareness = nullptr;\r
+static GetDPIForMonitorFunc getDPIForMonitor = nullptr;\r
\r
static bool hasCheckedForMultiTouch = false;\r
\r
return registerTouchWindow != nullptr;\r
}\r
\r
-//==============================================================================\r
-typedef BOOL (WINAPI* GetPointerTypeFunc) (UINT32, POINTER_INPUT_TYPE*);\r
+typedef BOOL (WINAPI* GetPointerTypeFunc) (UINT32, POINTER_INPUT_TYPE*);\r
typedef BOOL (WINAPI* GetPointerTouchInfoFunc) (UINT32, POINTER_TOUCH_INFO*);\r
-typedef BOOL (WINAPI* GetPointerPenInfoFunc) (UINT32, POINTER_PEN_INFO*);\r
+typedef BOOL (WINAPI* GetPointerPenInfoFunc) (UINT32, POINTER_PEN_INFO*);\r
\r
static GetPointerTypeFunc getPointerTypeFunction = nullptr;\r
-static GetPointerTouchInfoFunc getPointerTouchInfo = nullptr;\r
-static GetPointerPenInfoFunc getPointerPenInfo = nullptr;\r
+static GetPointerTouchInfoFunc getPointerTouchInfo = nullptr;\r
+static GetPointerPenInfoFunc getPointerPenInfo = nullptr;\r
\r
static bool canUsePointerAPI = false;\r
\r
static void checkForPointerAPI()\r
{\r
- getPointerTypeFunction = (GetPointerTypeFunc) getUser32Function ("GetPointerType");\r
+ getPointerTypeFunction = (GetPointerTypeFunc) getUser32Function ("GetPointerType");\r
getPointerTouchInfo = (GetPointerTouchInfoFunc) getUser32Function ("GetPointerTouchInfo");\r
- getPointerPenInfo = (GetPointerPenInfoFunc) getUser32Function ("GetPointerPenInfo");\r
+ getPointerPenInfo = (GetPointerPenInfoFunc) getUser32Function ("GetPointerPenInfo");\r
\r
canUsePointerAPI = (getPointerTypeFunction != nullptr\r
&& getPointerTouchInfo != nullptr\r
&& getPointerPenInfo != nullptr);\r
}\r
\r
-//==============================================================================\r
-typedef BOOL (WINAPI* SetProcessDPIAwareFunc) ();\r
-typedef BOOL (WINAPI* SetProcessDPIAwarenessContextFunc) (DPI_AWARENESS_CONTEXT);\r
-typedef BOOL (WINAPI* SetProcessDPIAwarenessFunc) (DPI_Awareness);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* SetThreadDPIAwarenessContextFunc) (DPI_AWARENESS_CONTEXT);\r
-typedef HRESULT (WINAPI* GetDPIForMonitorFunc) (HMONITOR, Monitor_DPI_Type, UINT*, UINT*);\r
-typedef UINT (WINAPI* GetDPIForWindowFunc) (HWND);\r
-typedef HRESULT (WINAPI* GetProcessDPIAwarenessFunc) (HANDLE, DPI_Awareness*);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* GetWindowDPIAwarenessContextFunc) (HWND);\r
-typedef DPI_AWARENESS_CONTEXT (WINAPI* GetThreadDPIAwarenessContextFunc) ();\r
-typedef DPI_Awareness (WINAPI* GetAwarenessFromDpiAwarenessContextFunc) (DPI_AWARENESS_CONTEXT);\r
-typedef BOOL (WINAPI* EnableNonClientDPIScalingFunc) (HWND);\r
-\r
-static SetProcessDPIAwareFunc setProcessDPIAware = nullptr;\r
-static SetProcessDPIAwarenessContextFunc setProcessDPIAwarenessContext = nullptr;\r
-static SetProcessDPIAwarenessFunc setProcessDPIAwareness = nullptr;\r
-static SetThreadDPIAwarenessContextFunc setThreadDPIAwarenessContext = nullptr;\r
-static GetDPIForMonitorFunc getDPIForMonitor = nullptr;\r
-static GetDPIForWindowFunc getDPIForWindow = nullptr;\r
-static GetProcessDPIAwarenessFunc getProcessDPIAwareness = nullptr;\r
-static GetWindowDPIAwarenessContextFunc getWindowDPIAwarenessContext = nullptr;\r
-static GetThreadDPIAwarenessContextFunc getThreadDPIAwarenessContext = nullptr;\r
-static GetAwarenessFromDpiAwarenessContextFunc getAwarenessFromDPIAwarenessContext = nullptr;\r
-static EnableNonClientDPIScalingFunc enableNonClientDPIScaling = nullptr;\r
-\r
-static bool hasCheckedForDPIAwareness = false;\r
-\r
-static void setDPIAwareness()\r
-{\r
- if (hasCheckedForDPIAwareness)\r
- return;\r
-\r
- hasCheckedForDPIAwareness = true;\r
-\r
- #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! JUCEApplicationBase::isStandaloneApp())\r
- return;\r
- #endif\r
-\r
- HMODULE shcoreModule = GetModuleHandleA ("SHCore.dll");\r
-\r
- if (shcoreModule != 0)\r
- {\r
- getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor");\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- getDPIForWindow = (GetDPIForWindowFunc) getUser32Function ("GetDpiForWindow");\r
- getProcessDPIAwareness = (GetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "GetProcessDpiAwareness");\r
- getWindowDPIAwarenessContext = (GetWindowDPIAwarenessContextFunc) getUser32Function ("GetWindowDpiAwarenessContext");\r
- getThreadDPIAwarenessContext = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext");\r
- getAwarenessFromDPIAwarenessContext = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext");\r
- setThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext");\r
-\r
- // Only set the DPI awareness context of the process if we are a standalone app\r
- if (! JUCEApplicationBase::isStandaloneApp())\r
- return;\r
-\r
- setProcessDPIAwarenessContext = (SetProcessDPIAwarenessContextFunc) getUser32Function ("SetProcessDpiAwarenessContext");\r
-\r
- if (setProcessDPIAwarenessContext != nullptr\r
- && SUCCEEDED (setProcessDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)))\r
- return;\r
-\r
- setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
- enableNonClientDPIScaling = (EnableNonClientDPIScalingFunc) getUser32Function ("EnableNonClientDpiScaling");\r
-\r
- if (setProcessDPIAwareness != nullptr && enableNonClientDPIScaling != nullptr\r
- && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_Per_Monitor_Aware)))\r
- return;\r
- #endif\r
-\r
- if (setProcessDPIAwareness == nullptr)\r
- setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
-\r
- if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr\r
- && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_System_Aware)))\r
- return;\r
- }\r
-\r
- // fallback for pre Windows 8.1 - equivalent to Process_System_DPI_Aware\r
- setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware");\r
-\r
- if (setProcessDPIAware != nullptr)\r
- setProcessDPIAware();\r
-}\r
-\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- static bool isPerMonitorDPIAwareProcess()\r
- {\r
- static bool dpiAware = []() -> bool\r
- {\r
- setDPIAwareness();\r
-\r
- if (getProcessDPIAwareness == nullptr)\r
- return false;\r
-\r
- DPI_Awareness context;\r
- getProcessDPIAwareness (0, &context);\r
-\r
- return context == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
- }();\r
-\r
- return dpiAware;\r
- }\r
-#endif\r
-\r
-static bool isPerMonitorDPIAwareWindow (HWND h)\r
-{\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- jassert (h != nullptr);\r
-\r
- setDPIAwareness();\r
-\r
- if (getWindowDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr)\r
- return getAwarenessFromDPIAwarenessContext (getWindowDPIAwarenessContext (h)) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
-\r
- return isPerMonitorDPIAwareProcess();\r
- #else\r
- ignoreUnused (h);\r
- return false;\r
- #endif\r
-}\r
-\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- static bool isPerMonitorDPIAwareThread()\r
- {\r
- setDPIAwareness();\r
-\r
- if (getThreadDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr)\r
- return getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware;\r
-\r
- return isPerMonitorDPIAwareProcess();\r
- }\r
-#endif\r
-\r
-static double getGlobalDPI()\r
-{\r
- setDPIAwareness();\r
-\r
- HDC dc = GetDC (0);\r
- auto dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0;\r
- ReleaseDC (0, dc);\r
- return dpi;\r
-}\r
-\r
-//==============================================================================\r
-#if JUCE_WIN_PER_MONITOR_DPI_AWARE && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
- ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler()\r
- {\r
- if (! isPerMonitorDPIAwareThread())\r
- return;\r
-\r
- if (setThreadDPIAwarenessContext != nullptr)\r
- previousContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE);\r
- }\r
-\r
- ScopedDPIAwarenessDisabler::~ScopedDPIAwarenessDisabler()\r
- {\r
- if (previousContext != nullptr)\r
- setThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT)previousContext);\r
- }\r
-#endif\r
-\r
-//==============================================================================\r
typedef void (*SettingChangeCallbackFunc) (void);\r
extern SettingChangeCallbackFunc settingChangeCallback;\r
\r
-//==============================================================================\r
-static Rectangle<int> rectangleFromRECT (const RECT& r) noexcept { return { r.left, r.top, r.right - r.left, r.bottom - r.top }; }\r
-static RECT RECTFromRectangle (const Rectangle<int>& r) noexcept { return { r.getX(), r.getY(), r.getRight(), r.getBottom() }; }\r
-\r
-static Point<int> pointFromPOINT (const POINT& p) noexcept { return { p.x, p.y }; }\r
-static POINT POINTFromPoint (const Point<int>& p) noexcept { return { p.x, p.y }; }\r
-\r
-//==============================================================================\r
-static const Displays::Display* getCurrentDisplayFromScaleFactor (HWND hwnd);\r
-\r
-static Rectangle<int> convertPhysicalScreenRectangleToLogical (const Rectangle<int>& r, HWND h) noexcept\r
+static Rectangle<int> rectangleFromRECT (const RECT& r) noexcept\r
{\r
- if (isPerMonitorDPIAwareWindow (h))\r
- return Desktop::getInstance().getDisplays().physicalToLogical (r, getCurrentDisplayFromScaleFactor (h));\r
-\r
- return r;\r
+ return Rectangle<int>::leftTopRightBottom ((int) r.left, (int) r.top, (int) r.right, (int) r.bottom);\r
}\r
\r
-static Rectangle<int> convertLogicalScreenRectangleToPhysical (const Rectangle<int>& r, HWND h) noexcept\r
+static void setWindowPos (HWND hwnd, Rectangle<int> bounds, UINT flags)\r
{\r
- if (isPerMonitorDPIAwareWindow (h))\r
- return Desktop::getInstance().getDisplays().logicalToPhysical (r, getCurrentDisplayFromScaleFactor (h));\r
-\r
- return r;\r
+ SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags);\r
}\r
\r
-static Point<int> convertPhysicalScreenPointToLogical (const Point<int>& p, HWND h) noexcept\r
+static RECT getWindowRect (HWND hwnd)\r
{\r
- if (isPerMonitorDPIAwareWindow (h))\r
- return Desktop::getInstance().getDisplays().physicalToLogical (p, getCurrentDisplayFromScaleFactor (h));\r
-\r
- return p;\r
+ RECT r;\r
+ GetWindowRect (hwnd, &r);\r
+ return r;\r
}\r
\r
-static double getScaleFactorForWindow (HWND h)\r
+static void setWindowZOrder (HWND hwnd, HWND insertAfter)\r
{\r
- if (isPerMonitorDPIAwareWindow (h) && getDPIForWindow != nullptr)\r
- return (double) getDPIForWindow (h) / USER_DEFAULT_SCREEN_DPI;\r
-\r
- return 1.0;\r
+ SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);\r
}\r
\r
//==============================================================================\r
-static void setWindowPos (HWND hwnd, Rectangle<int> bounds, UINT flags, bool adjustTopLeft = false)\r
+static void setDPIAwareness()\r
{\r
- if (isPerMonitorDPIAwareWindow (hwnd))\r
+ #if ! JUCE_DISABLE_WIN32_DPI_AWARENESS\r
+ if (JUCEApplicationBase::isStandaloneApp())\r
{\r
- if (adjustTopLeft)\r
- bounds = convertLogicalScreenRectangleToPhysical (bounds, hwnd)\r
- .withPosition (Desktop::getInstance().getDisplays().logicalToPhysical (bounds.getTopLeft()));\r
- else\r
- bounds = convertLogicalScreenRectangleToPhysical (bounds, hwnd);\r
- }\r
+ if (setProcessDPIAwareness == nullptr)\r
+ {\r
+ HMODULE shcoreModule = GetModuleHandleA ("SHCore.dll");\r
\r
- SetWindowPos (hwnd, 0, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), flags);\r
-}\r
+ if (shcoreModule != 0)\r
+ {\r
+ setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness");\r
+ getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor");\r
\r
-static RECT getWindowRect (HWND hwnd)\r
-{\r
- RECT r;\r
- GetWindowRect (hwnd, &r);\r
+ if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr\r
+// && SUCCEEDED (setProcessDPIAwareness (Process_Per_Monitor_DPI_Aware)))\r
+ && SUCCEEDED (setProcessDPIAwareness (Process_System_DPI_Aware))) // (keep using this mode temporarily..)\r
+ return;\r
+ }\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- auto windowDPIAware = isPerMonitorDPIAwareWindow (hwnd);\r
- auto threadDPIAware = isPerMonitorDPIAwareThread();\r
+ if (setProcessDPIAware == nullptr)\r
+ {\r
+ setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware");\r
\r
- // If these don't match then we need to convert the RECT returned from GetWindowRect() as it depends\r
- // on the DPI awareness of the calling thread\r
- if (windowDPIAware != threadDPIAware)\r
- {\r
- if (! windowDPIAware)\r
- {\r
- // Thread is per-monitor DPI aware so RECT needs to be converted from physical to logical for\r
- // the DPI unaware window\r
- return RECTFromRectangle (Desktop::getInstance().getDisplays().physicalToLogical (rectangleFromRECT (r)));\r
- }\r
- else if (! threadDPIAware)\r
- {\r
- // Thread is DPI unaware so RECT needs to be converted from logical to physical for the per-monitor\r
- // DPI aware window\r
- return RECTFromRectangle (Desktop::getInstance().getDisplays().logicalToPhysical (rectangleFromRECT (r)));\r
+ if (setProcessDPIAware != nullptr)\r
+ setProcessDPIAware();\r
+ }\r
}\r
}\r
#endif\r
-\r
- return r;\r
}\r
\r
-static void setWindowZOrder (HWND hwnd, HWND insertAfter)\r
+static double getGlobalDPI()\r
{\r
- SetWindowPos (hwnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);\r
+ setDPIAwareness();\r
+\r
+ HDC dc = GetDC (0);\r
+ const double dpi = (GetDeviceCaps (dc, LOGPIXELSX)\r
+ + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0;\r
+ ReleaseDC (0, dc);\r
+ return dpi;\r
}\r
\r
-//==============================================================================\r
double Desktop::getDefaultMasterScale()\r
{\r
- if (! JUCEApplicationBase::isStandaloneApp())\r
- return 1.0;\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareProcess())\r
- return 1.0;\r
- #endif\r
-\r
- return getGlobalDPI() / USER_DEFAULT_SCREEN_DPI;\r
+ return JUCEApplicationBase::isStandaloneApp() ? getGlobalDPI() / 96.0\r
+ : 1.0;\r
}\r
\r
-bool Desktop::canUseSemiTransparentWindows() noexcept { return true; }\r
+bool Desktop::canUseSemiTransparentWindows() noexcept { return true; }\r
\r
+//==============================================================================\r
Desktop::DisplayOrientation Desktop::getCurrentOrientation() const\r
{\r
return upright;\r
};\r
\r
//==============================================================================\r
- HWNDComponentPeer (Component& comp, int windowStyleFlags, HWND parent, bool nonRepainting)\r
+ HWNDComponentPeer (Component& comp, const int windowStyleFlags, HWND parent, bool nonRepainting)\r
: ComponentPeer (comp, windowStyleFlags),\r
dontRepaint (nonRepainting),\r
parentToAddTo (parent),\r
callFunctionIfNotLocked (&createWindowCallback, this);\r
\r
setTitle (component.getName());\r
- updateShadower();\r
+\r
+ if ((windowStyleFlags & windowHasDropShadow) != 0\r
+ && ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
+ {\r
+ shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
+\r
+ if (shadower != nullptr)\r
+ shadower->setOwner (&component);\r
+ }\r
\r
// make sure that the on-screen keyboard code is loaded\r
OnScreenKeyboard::getInstance();\r
void setTitle (const String& title) override\r
{\r
// Unfortunately some ancient bits of win32 mean you can only perform this operation from the message thread.\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
SetWindowText (hwnd, title.toWideCharPointer());\r
}\r
info.cbSize = sizeof (info);\r
\r
if (GetWindowInfo (hwnd, &info))\r
- windowBorder = BorderSize<int> (roundToInt ((info.rcClient.top - info.rcWindow.top) / scaleFactor),\r
- roundToInt ((info.rcClient.left - info.rcWindow.left) / scaleFactor),\r
- roundToInt ((info.rcWindow.bottom - info.rcClient.bottom) / scaleFactor),\r
- roundToInt ((info.rcWindow.right - info.rcClient.right) / scaleFactor));\r
+ windowBorder = BorderSize<int> (info.rcClient.top - info.rcWindow.top,\r
+ info.rcClient.left - info.rcWindow.left,\r
+ info.rcWindow.bottom - info.rcClient.bottom,\r
+ info.rcWindow.right - info.rcClient.right);\r
\r
#if JUCE_DIRECT2D\r
if (direct2DContext != nullptr)\r
{\r
if (auto parentHwnd = GetParent (hwnd))\r
{\r
- auto parentRect = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (parentHwnd)), hwnd);\r
- newBounds.translate (parentRect.getX(), parentRect.getY());\r
+ auto parentRect = getWindowRect (parentHwnd);\r
+ newBounds.translate (parentRect.left, parentRect.top);\r
}\r
}\r
\r
auto oldBounds = getBounds();\r
-\r
const bool hasMoved = (oldBounds.getPosition() != bounds.getPosition());\r
const bool hasResized = (oldBounds.getWidth() != bounds.getWidth()\r
|| oldBounds.getHeight() != bounds.getHeight());\r
if (! hasMoved) flags |= SWP_NOMOVE;\r
if (! hasResized) flags |= SWP_NOSIZE;\r
\r
- setWindowPos (hwnd, newBounds, flags, ! isInDPIChange);\r
+ setWindowPos (hwnd, newBounds, flags);\r
\r
if (hasResized && isValidPeer (this))\r
{\r
\r
Rectangle<int> getBounds() const override\r
{\r
- auto bounds = getWindowRect (hwnd);\r
+ auto bounds = rectangleFromRECT (getWindowRect (hwnd));\r
\r
if (auto parentH = GetParent (hwnd))\r
{\r
auto r = getWindowRect (parentH);\r
- auto localBounds = Rectangle<int>::leftTopRightBottom (bounds.left, bounds.top,\r
- bounds.right, bounds.bottom).translated (-r.left, -r.top);\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareWindow (hwnd))\r
- localBounds = (localBounds.toDouble() / getPlatformScaleFactor()).toNearestInt();\r
- #endif\r
-\r
- return windowBorder.subtractedFrom (localBounds);\r
+ bounds.translate (-r.left, -r.top);\r
}\r
\r
- return windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (bounds), hwnd));\r
+ return windowBorder.subtractedFrom (bounds);\r
}\r
\r
Point<int> getScreenPosition() const\r
{\r
- auto r = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (hwnd)), hwnd);\r
+ auto r = getWindowRect (hwnd);\r
\r
- return { r.getX() + windowBorder.getLeft(),\r
- r.getY() + windowBorder.getTop() };\r
+ return { r.left + windowBorder.getLeft(),\r
+ r.top + windowBorder.getTop() };\r
}\r
\r
Point<float> localToGlobal (Point<float> relativePosition) override { return relativePosition + getScreenPosition().toFloat(); }\r
\r
bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override\r
{\r
- auto r = convertPhysicalScreenRectangleToLogical (rectangleFromRECT (getWindowRect (hwnd)), hwnd);\r
+ auto r = getWindowRect (hwnd);\r
\r
- if (! r.withZeroOrigin().contains (localPos))\r
+ if (! (isPositiveAndBelow (localPos.x, r.right - r.left)\r
+ && isPositiveAndBelow (localPos.y, r.bottom - r.top)))\r
return false;\r
\r
- auto globalPos = localPos + getScreenPosition();\r
+ POINT p = { localPos.x + r.left + windowBorder.getLeft(),\r
+ localPos.y + r.top + windowBorder.getTop() };\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareThread() || isPerMonitorDPIAwareWindow (hwnd))\r
- globalPos = Desktop::getInstance().getDisplays().logicalToPhysical (globalPos);\r
- #endif\r
-\r
- auto w = WindowFromPoint (POINTFromPoint (globalPos));\r
-\r
- return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0));\r
+ HWND w = WindowFromPoint (p);\r
+ return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0));\r
}\r
\r
BorderSize<int> getFrameSize() const override\r
\r
void repaint (const Rectangle<int>& area) override\r
{\r
- auto scale = getPlatformScaleFactor();\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- // if the calling thread is DPI-aware but we are invalidating a non-DPI aware window RECT, we actually have to\r
- // divide the bounds by the scale factor as it will get multiplied for the virtualised paint callback...\r
- if (isPerMonitorDPIAwareThread() && ! isPerMonitorDPIAwareWindow (hwnd))\r
- scale = 1.0 / Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
- #endif\r
-\r
- const RECT r = { roundToInt (area.getX() * scale), roundToInt (area.getY() * scale),\r
- roundToInt (area.getRight() * scale), roundToInt (area.getBottom() * scale) };\r
-\r
+ const RECT r = { area.getX(), area.getY(), area.getRight(), area.getBottom() };\r
InvalidateRect (hwnd, &r, FALSE);\r
}\r
\r
JUCE_COMRESULT DragEnter (IDataObject* pDataObject, DWORD grfKeyState, POINTL mousePos, DWORD* pdwEffect) override\r
{\r
auto hr = updateFileList (pDataObject);\r
-\r
if (FAILED (hr))\r
return hr;\r
\r
\r
JUCE_COMRESULT Drop (IDataObject* pDataObject, DWORD /*grfKeyState*/, POINTL mousePos, DWORD* pdwEffect) override\r
{\r
- auto hr = updateFileList (pDataObject);\r
-\r
+ HRESULT hr = updateFileList (pDataObject);\r
if (FAILED (hr))\r
return hr;\r
\r
Point<float> getMousePos (POINTL mousePos) const\r
{\r
auto& comp = peer.getComponent();\r
- return comp.getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }),\r
- (HWND) peer.getNativeHandle()).toFloat());\r
+ return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp.getDesktopScaleFactor(),\r
+ Point<float> (static_cast<float> (mousePos.x),\r
+ static_cast<float> (mousePos.y))));\r
}\r
\r
template <typename CharType>\r
for (unsigned int i = 0;;)\r
{\r
unsigned int len = 0;\r
-\r
- while (i + len < totalLen && names[i + len] != 0)\r
+ while (i + len < totalLen && names [i + len] != 0)\r
++len;\r
\r
if (len == 0)\r
\r
if (SUCCEEDED (fileData.error))\r
{\r
- auto dropFiles = static_cast<const LPDROPFILES> (fileData.data);\r
+ const LPDROPFILES dropFiles = static_cast<const LPDROPFILES> (fileData.data);\r
const void* const names = addBytesToPointer (dropFiles, sizeof (DROPFILES));\r
\r
if (dropFiles->fWide)\r
return false;\r
}\r
\r
- double getPlatformScaleFactor() const noexcept override\r
- {\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! isPerMonitorDPIAwareWindow (hwnd))\r
- return 1.0;\r
-\r
- if (auto* parentHWND = GetParent (hwnd))\r
- {\r
- if (auto* parentPeer = getOwnerOfWindow (parentHWND))\r
- return parentPeer->getPlatformScaleFactor();\r
-\r
- if (getDPIForWindow != nullptr)\r
- return getScaleFactorForWindow (parentHWND);\r
- }\r
-\r
- return scaleFactor;\r
- #else\r
- return 1.0;\r
- #endif\r
- }\r
-\r
private:\r
HWND hwnd, parentToAddTo;\r
std::unique_ptr<DropShadower> shadower;\r
ModifierKeyProvider* modProvider = nullptr;\r
#endif\r
\r
- double scaleFactor = 1.0;\r
- bool isInDPIChange = false;\r
-\r
- //==============================================================================\r
static MultiTouchMapper<DWORD> currentTouches;\r
\r
//==============================================================================\r
registerTouchWindow (hwnd, 0);\r
\r
setDPIAwareness();\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareThread())\r
- {\r
- auto bounds = component.getBounds();\r
-\r
- if (bounds.isEmpty())\r
- scaleFactor = Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
- else\r
- scaleFactor = Desktop::getInstance().getDisplays().findDisplayForRect (bounds).scale;\r
-\r
- scaleFactor /= Desktop::getInstance().getGlobalScaleFactor();\r
- }\r
- #endif\r
-\r
setMessageFilter();\r
updateBorderSize();\r
checkForPointerAPI();\r
}\r
}\r
\r
- static BOOL CALLBACK revokeChildDragDropCallback (HWND hwnd, LPARAM) { RevokeDragDrop (hwnd); return TRUE; }\r
-\r
static void* destroyWindowCallback (void* handle)\r
{\r
- auto hwnd = reinterpret_cast<HWND> (handle);\r
-\r
- if (IsWindow (hwnd))\r
- {\r
- RevokeDragDrop (hwnd);\r
-\r
- // NB: we need to do this before DestroyWindow() as child HWNDs will be invalid after\r
- EnumChildWindows (hwnd, revokeChildDragDropCallback, 0);\r
-\r
- DestroyWindow (hwnd);\r
- }\r
-\r
+ RevokeDragDrop ((HWND) handle);\r
+ DestroyWindow ((HWND) handle);\r
return nullptr;\r
}\r
\r
\r
bool hasTitleBar() const noexcept { return (styleFlags & windowHasTitleBar) != 0; }\r
\r
- void updateShadower()\r
- {\r
- if (! component.isCurrentlyModal() && (styleFlags & windowHasDropShadow) != 0\r
- && ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
- {\r
- shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
-\r
- if (shadower != nullptr)\r
- shadower->setOwner (&component);\r
- }\r
- }\r
\r
void setIcon (const Image& newIcon)\r
{\r
{\r
auto& info = *(ChildWindowClippingInfo*) context;\r
\r
- auto parent = GetParent (hwnd);\r
+ HWND parent = GetParent (hwnd);\r
\r
if (parent == info.peer->hwnd)\r
{\r
if (GetUpdateRect (hwnd, &r, false))\r
{\r
direct2DContext->start();\r
- direct2DContext->clipToRectangle (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (r), hwnd));\r
+ direct2DContext->clipToRectangle (rectangleFromRECT (r));\r
handlePaint (*direct2DContext);\r
direct2DContext->end();\r
- ValidateRect (hwnd, &r);\r
}\r
}\r
else\r
// if something in a paint handler calls, e.g. a message box, this can become reentrant and\r
// corrupt the image it's using to paint into, so do a check here.\r
static bool reentrant = false;\r
-\r
if (! reentrant)\r
{\r
const ScopedValueSetter<bool> setter (reentrant, true, false);\r
{\r
std::unique_ptr<LowLevelGraphicsContext> context (component.getLookAndFeel()\r
.createGraphicsContext (offscreenImage, Point<int> (-x, -y), contextClip));\r
-\r
- context->addTransform (AffineTransform::scale ((float) getPlatformScaleFactor()));\r
handlePaint (*context);\r
}\r
\r
}\r
\r
static uint32 lastMouseTime = 0;\r
- static auto minTimeBetweenMouses = getMinTimeBetweenMouseMoves();\r
- auto now = Time::getMillisecondCounter();\r
+ static int minTimeBetweenMouses = getMinTimeBetweenMouseMoves();\r
+ const uint32 now = Time::getMillisecondCounter();\r
\r
if (! Desktop::getInstance().getMainMouseSource().isDragging())\r
modsToSend = modsToSend.withoutMouseButtons();\r
{\r
updateModifiersFromWParam (wParam);\r
\r
- #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
+ #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client\r
if (modProvider != nullptr)\r
ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withFlags (modProvider->getWin32Modifiers());\r
- #endif\r
+ #endif\r
\r
isDragging = true;\r
\r
\r
ComponentPeer* findPeerUnderMouse (Point<float>& localPos)\r
{\r
- auto currentMousePos = getPOINTFromLParam (GetMessagePos());\r
+ auto globalPos = getCurrentMousePosGlobal().roundToInt();\r
\r
// Because Windows stupidly sends all wheel events to the window with the keyboard\r
// focus, we have to redirect them here according to the mouse pos..\r
- auto* peer = getOwnerOfWindow (WindowFromPoint (currentMousePos));\r
+ POINT p = { globalPos.x, globalPos.y };\r
+ auto* peer = getOwnerOfWindow (WindowFromPoint (p));\r
\r
if (peer == nullptr)\r
peer = this;\r
\r
- localPos = peer->globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (currentMousePos), hwnd).toFloat());\r
+ localPos = peer->globalToLocal (globalPos.toFloat());\r
return peer;\r
}\r
\r
wheel.isInertial = false;\r
\r
Point<float> localPos;\r
-\r
if (auto* peer = findPeerUnderMouse (localPos))\r
peer->handleMouseWheel (getPointerType (wParam), localPos, getMouseEventTime(), wheel);\r
}\r
\r
const auto touchIndex = currentTouches.getIndexOfTouch (this, touch.dwID);\r
const auto time = getMouseEventTime();\r
- const auto pos = globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT ({ roundToInt (touch.x / 100.0f),\r
- roundToInt (touch.y / 100.0f) }), hwnd).toFloat());\r
+ const auto pos = globalToLocal ({ touch.x / 100.0f, touch.y / 100.0f });\r
const auto pressure = touchPressure;\r
auto modsToSend = ModifierKeys::currentModifiers;\r
\r
if (pointerType == MouseInputSource::InputSourceType::touch)\r
{\r
POINTER_TOUCH_INFO touchInfo;\r
-\r
if (! getPointerTouchInfo (GET_POINTERID_WPARAM (wParam), &touchInfo))\r
return false;\r
\r
else if (pointerType == MouseInputSource::InputSourceType::pen)\r
{\r
POINTER_PEN_INFO penInfo;\r
-\r
if (! getPointerPenInfo (GET_POINTERID_WPARAM (wParam), &penInfo))\r
return false;\r
\r
const auto pressure = (penInfo.penMask & PEN_MASK_PRESSURE) ? penInfo.pressure / 1024.0f : MouseInputSource::invalidPressure;\r
\r
- if (! handlePenInput (penInfo, globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (lParam)), hwnd).toFloat()),\r
+ if (! handlePenInput (penInfo, globalToLocal (Point<float> (static_cast<float> (GET_X_LPARAM(lParam)),\r
+ static_cast<float> (GET_Y_LPARAM(lParam)))),\r
pressure, isDown, isUp))\r
return false;\r
}\r
\r
TOUCHINPUT emulateTouchEventFromPointer (LPARAM lParam, WPARAM wParam)\r
{\r
- Point<int> p (GET_X_LPARAM (lParam),\r
- GET_Y_LPARAM (lParam));\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (! isPerMonitorDPIAwareThread())\r
- p = Desktop::getInstance().getDisplays().physicalToLogical (p);\r
- #endif\r
-\r
TOUCHINPUT touchInput;\r
\r
touchInput.dwID = GET_POINTERID_WPARAM (wParam);\r
- touchInput.x = p.x * 100;\r
- touchInput.y = p.y * 100;\r
+ touchInput.x = GET_X_LPARAM (lParam) * 100;\r
+ touchInput.y = GET_Y_LPARAM (lParam) * 100;\r
\r
return touchInput;\r
}\r
&& ! isKioskMode();\r
}\r
\r
- Rectangle<int> getCurrentScaledBounds() const\r
+ Rectangle<int> getCurrentScaledBounds (float scale) const\r
{\r
- return ScalingHelpers::unscaledScreenPosToScaled (component, windowBorder.addedTo (ScalingHelpers::scaledScreenPosToUnscaled (component, component.getBounds())));\r
+ return ScalingHelpers::unscaledScreenPosToScaled (scale, windowBorder.addedTo (ScalingHelpers::scaledScreenPosToUnscaled (scale, component.getBounds())));\r
}\r
\r
LRESULT handleSizeConstraining (RECT& r, const WPARAM wParam)\r
{\r
if (isConstrainedNativeWindow())\r
{\r
- auto pos = ScalingHelpers::unscaledScreenPosToScaled (component, convertPhysicalScreenRectangleToLogical (rectangleFromRECT (r), hwnd));\r
- auto current = getCurrentScaledBounds();\r
+ auto scale = getComponent().getDesktopScaleFactor();\r
+ auto pos = ScalingHelpers::unscaledScreenPosToScaled (scale, rectangleFromRECT (r));\r
+ auto current = getCurrentScaledBounds (scale);\r
\r
constrainer->checkBounds (pos, current,\r
Desktop::getInstance().getDisplays().getTotalBounds (true),\r
wParam == WMSZ_BOTTOM || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_BOTTOMRIGHT,\r
wParam == WMSZ_RIGHT || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_BOTTOMRIGHT);\r
\r
- r = RECTFromRectangle (convertLogicalScreenRectangleToPhysical (ScalingHelpers::scaledScreenPosToUnscaled (component, pos), hwnd));\r
+ pos = ScalingHelpers::scaledScreenPosToUnscaled (scale, pos);\r
+ r.left = pos.getX();\r
+ r.top = pos.getY();\r
+ r.right = pos.getRight();\r
+ r.bottom = pos.getBottom();\r
}\r
\r
return TRUE;\r
if (isConstrainedNativeWindow())\r
{\r
if ((wp.flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE)\r
- && (wp.x > -32000 && wp.y > -32000)\r
&& ! Component::isMouseButtonDownAnywhere())\r
{\r
- auto pos = ScalingHelpers::unscaledScreenPosToScaled (component, convertPhysicalScreenRectangleToLogical (rectangleFromRECT ({ wp.x, wp.y, wp.x + wp.cx, wp.y + wp.cy }), hwnd));\r
- auto current = getCurrentScaledBounds();\r
+ auto scale = getComponent().getDesktopScaleFactor();\r
+ auto pos = ScalingHelpers::unscaledScreenPosToScaled (scale, Rectangle<int> (wp.x, wp.y, wp.cx, wp.cy));\r
+ auto current = getCurrentScaledBounds (scale);\r
\r
constrainer->checkBounds (pos, current,\r
Desktop::getInstance().getDisplays().getTotalBounds (true),\r
pos.getY() == current.getY() && pos.getBottom() != current.getBottom(),\r
pos.getX() == current.getX() && pos.getRight() != current.getRight());\r
\r
- pos = convertLogicalScreenRectangleToPhysical (ScalingHelpers::scaledScreenPosToUnscaled (component, pos), hwnd);\r
-\r
- wp.x = pos.getX();\r
- wp.y = pos.getY();\r
+ pos = ScalingHelpers::scaledScreenPosToUnscaled (scale, pos);\r
+ wp.x = pos.getX();\r
+ wp.y = pos.getY();\r
wp.cx = pos.getWidth();\r
wp.cy = pos.getHeight();\r
}\r
}\r
\r
handleMovedOrResized();\r
-\r
return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly..\r
}\r
\r
- LRESULT handleDPIChanging (int newDPI, RECT newRect)\r
- {\r
- auto newScale = (double) newDPI / USER_DEFAULT_SCREEN_DPI;\r
-\r
- if (! approximatelyEqual (scaleFactor, newScale))\r
- {\r
- const ScopedValueSetter<bool> setter (isInDPIChange, true);\r
-\r
- auto oldScale = scaleFactor;\r
- scaleFactor = newScale;\r
-\r
- auto scaleRatio = scaleFactor / oldScale;\r
- EnumChildWindows (hwnd, scaleChildHWNDCallback, (LPARAM) &scaleRatio);\r
-\r
- setBounds (windowBorder.subtractedFrom (convertPhysicalScreenRectangleToLogical (rectangleFromRECT (newRect), hwnd)), false);\r
- updateShadower();\r
- InvalidateRect (hwnd, nullptr, FALSE);\r
- scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (scaleFactor); });\r
- }\r
-\r
- return 0;\r
- }\r
-\r
- static BOOL CALLBACK scaleChildHWNDCallback (HWND hwnd, LPARAM context)\r
- {\r
- auto r = getWindowRect (hwnd);\r
-\r
- POINT p { r.left, r.top };\r
- ScreenToClient (GetParent (hwnd), &p);\r
-\r
- auto ratio = *(double*) context;\r
- SetWindowPos (hwnd, 0, roundToInt (p.x * ratio), roundToInt (p.y * ratio),\r
- roundToInt ((r.right - r.left) * ratio), roundToInt ((r.bottom - r.top) * ratio),\r
- SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);\r
-\r
- if (auto* peer = getOwnerOfWindow (hwnd))\r
- peer->handleChildDPIChanging();\r
-\r
- return TRUE;\r
- }\r
-\r
- void handleChildDPIChanging()\r
- {\r
- const ScopedValueSetter<bool> setter (isInDPIChange, true);\r
-\r
- scaleFactor = getScaleFactorForWindow (parentToAddTo);\r
-\r
- updateShadower();\r
- InvalidateRect (hwnd, nullptr, FALSE);\r
- scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (scaleFactor); });\r
- }\r
-\r
void handleAppActivation (const WPARAM wParam)\r
{\r
modifiersAtLastCallback = -1;\r
forceDisplayUpdate();\r
\r
if (fullScreen && ! isMinimised())\r
- setWindowPos (hwnd, Desktop::getInstance().getDisplays().findDisplayForRect (component.getScreenBounds()).userArea,\r
+ {\r
+ auto& display = Desktop::getInstance().getDisplays()\r
+ .getDisplayContaining (component.getScreenBounds().getCentre());\r
+\r
+ setWindowPos (hwnd, display.userArea * display.scale,\r
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSENDCHANGING);\r
+ }\r
}\r
\r
static void forceDisplayUpdate()\r
{\r
- const_cast<Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+ const_cast<Desktop::Displays&> (Desktop::getInstance().getDisplays()).refresh();\r
+ }\r
+\r
+ void handleDPIChange() // happens when a window moves to a screen with a different DPI.\r
+ {\r
}\r
\r
//==============================================================================\r
public:\r
static LRESULT CALLBACK windowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
- // Ensure that non-client areas are scaled for per-monitor DPI awareness v1 - can't\r
- // do this in peerWindowProc as we have no window at this point\r
- if (message == WM_NCCREATE && enableNonClientDPIScaling != nullptr)\r
- enableNonClientDPIScaling (h);\r
-\r
if (auto* peer = getOwnerOfWindow (h))\r
{\r
jassert (isValidPeer (peer));\r
return mm.callFunctionOnMessageThread (callback, userData);\r
}\r
\r
- static POINT getPOINTFromLParam (LPARAM lParam) noexcept\r
+ static Point<float> getPointFromLParam (LPARAM lParam) noexcept\r
{\r
- return { GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam) };\r
+ return { static_cast<float> (GET_X_LPARAM (lParam)),\r
+ static_cast<float> (GET_Y_LPARAM (lParam)) };\r
}\r
\r
- Point<float> getPointFromLocalLParam (LPARAM lParam) noexcept\r
+ static Point<float> getCurrentMousePosGlobal() noexcept\r
{\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareWindow (hwnd))\r
- {\r
- // LPARAM is relative to this window's top-left but may be on a different monitor so we need to calculate the\r
- // physical screen position and then convert this to local logical coordinates\r
- auto localPos = getPOINTFromLParam (lParam);\r
- auto r = getWindowRect (hwnd);\r
-\r
- return globalToLocal (Desktop::getInstance().getDisplays().physicalToLogical (pointFromPOINT ({ r.left + localPos.x + roundToInt (windowBorder.getLeft() * scaleFactor),\r
- r.top + localPos.y + roundToInt (windowBorder.getTop() * scaleFactor) })).toFloat());\r
- }\r
- #endif\r
-\r
- return { static_cast<float> (GET_X_LPARAM (lParam)), static_cast<float> (GET_Y_LPARAM (lParam)) };\r
+ return getPointFromLParam (GetMessagePos());\r
}\r
\r
Point<float> getCurrentMousePos() noexcept\r
{\r
- return globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (getPOINTFromLParam (GetMessagePos())), hwnd).toFloat());\r
+ return globalToLocal (getCurrentMousePosGlobal());\r
}\r
\r
LRESULT peerWindowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)\r
break;\r
\r
//==============================================================================\r
- case WM_MOUSEMOVE: doMouseMove (getPointFromLocalLParam (lParam), false); return 0;\r
+ case WM_MOUSEMOVE: doMouseMove (getPointFromLParam (lParam), false); return 0;\r
\r
case WM_POINTERLEAVE:\r
case WM_MOUSELEAVE: doMouseExit(); return 0;\r
\r
case WM_LBUTTONDOWN:\r
case WM_MBUTTONDOWN:\r
- case WM_RBUTTONDOWN: doMouseDown (getPointFromLocalLParam (lParam), wParam); return 0;\r
+ case WM_RBUTTONDOWN: doMouseDown (getPointFromLParam (lParam), wParam); return 0;\r
\r
case WM_LBUTTONUP:\r
case WM_MBUTTONUP:\r
- case WM_RBUTTONUP: doMouseUp (getPointFromLocalLParam (lParam), wParam); return 0;\r
+ case WM_RBUTTONUP: doMouseUp (getPointFromLParam (lParam), wParam); return 0;\r
\r
case WM_POINTERWHEEL:\r
case 0x020A: /* WM_MOUSEWHEEL */ doMouseWheel (wParam, true); return 0;\r
break;\r
\r
//==============================================================================\r
- case WM_SIZING: return handleSizeConstraining (*(RECT*) lParam, wParam);\r
- case WM_WINDOWPOSCHANGING: return handlePositionChanging (*(WINDOWPOS*) lParam);\r
- case 0x2e0: /* WM_DPICHANGED */ return handleDPIChanging ((int) HIWORD (wParam), *(RECT*) lParam);\r
+ case WM_SIZING: return handleSizeConstraining (*(RECT*) lParam, wParam);\r
+ case WM_WINDOWPOSCHANGING: return handlePositionChanging (*(WINDOWPOS*) lParam);\r
\r
case WM_WINDOWPOSCHANGED:\r
{\r
const WINDOWPOS& wPos = *reinterpret_cast<WINDOWPOS*> (lParam);\r
\r
if ((wPos.flags & SWP_NOMOVE) != 0 && (wPos.flags & SWP_NOSIZE) != 0)\r
- startTimer (100);\r
+ startTimer(100);\r
else\r
if (handlePositionChanged())\r
return 0;\r
doSettingChange();\r
break;\r
\r
+ case 0x2e0: // WM_DPICHANGED\r
+ handleDPIChange();\r
+ break;\r
+\r
case WM_INITMENU:\r
initialiseSysMenu ((HMENU) wParam);\r
break;\r
break;\r
\r
for (selectionEnd = selectionStart; selectionEnd < attributeSizeBytes; ++selectionEnd)\r
- if (attributes[selectionEnd] != ATTR_TARGET_CONVERTED && attributes[selectionEnd] != ATTR_TARGET_NOTCONVERTED)\r
+ if (attributes [selectionEnd] != ATTR_TARGET_CONVERTED && attributes[selectionEnd] != ATTR_TARGET_NOTCONVERTED)\r
break;\r
}\r
}\r
\r
if (ImmGetCompositionString (hImc, GCS_COMPCLAUSE, clauseData, (DWORD) clauseDataSizeBytes) > 0)\r
for (size_t i = 0; i + 1 < numItems; ++i)\r
- result.add (Range<int> ((int) clauseData[i], (int) clauseData[i + 1]) + compositionRange.getStart());\r
+ result.add (Range<int> ((int) clauseData [i], (int) clauseData [i + 1]) + compositionRange.getStart());\r
}\r
}\r
\r
(HWND) parentHWND, true);\r
}\r
\r
-JUCE_API bool shouldScaleGLWindow (void* hwnd)\r
-{\r
- return isPerMonitorDPIAwareWindow ((HWND) hwnd);\r
-}\r
-\r
JUCE_IMPLEMENT_SINGLETON (HWNDComponentPeer::WindowClassHolder)\r
\r
//==============================================================================\r
(SHORT) ']', VK_OEM_6 };\r
\r
for (int i = 0; i < numElementsInArray (translatedValues); i += 2)\r
- if (k == translatedValues[i])\r
- k = translatedValues[i + 1];\r
+ if (k == translatedValues [i])\r
+ k = translatedValues [i + 1];\r
}\r
\r
return HWNDComponentPeer::isKeyDown (k);\r
{\r
UINT flags = MB_TASKMODAL | MB_SETFOREGROUND;\r
\r
- // this window can get lost behind JUCE windows which are set to be alwaysOnTop\r
- // so if there are any set it to be topmost\r
- if (juce_areThereAnyAlwaysOnTopWindows())\r
- flags |= MB_TOPMOST;\r
-\r
switch (iconType)\r
{\r
case AlertWindow::QuestionIcon: flags |= MB_ICONQUESTION; break;\r
{\r
POINT mousePos;\r
GetCursorPos (&mousePos);\r
-\r
- auto p = pointFromPOINT (mousePos);\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareThread())\r
- p = Desktop::getInstance().getDisplays().physicalToLogical (p);\r
- #endif\r
-\r
- return p.toFloat();\r
+ return { (float) mousePos.x, (float) mousePos.y };\r
}\r
\r
void MouseInputSource::setRawMousePosition (Point<float> newPosition)\r
{\r
- auto newPositionInt = newPosition.roundToInt();\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (isPerMonitorDPIAwareThread())\r
- newPositionInt = Desktop::getInstance().getDisplays().logicalToPhysical (newPositionInt);\r
- #endif\r
-\r
- auto point = POINTFromPoint (newPositionInt);\r
- SetCursorPos (point.x, point.y);\r
+ SetCursorPos (roundToInt (newPosition.x),\r
+ roundToInt (newPosition.y));\r
}\r
\r
//==============================================================================\r
\r
void Desktop::allowedOrientationsChanged() {}\r
\r
-//==============================================================================\r
-static const Displays::Display* getCurrentDisplayFromScaleFactor (HWND hwnd)\r
-{\r
- Array<Displays::Display*> candidateDisplays;\r
- double scaleToLookFor = -1.0;\r
-\r
- if (auto* peer = HWNDComponentPeer::getOwnerOfWindow (hwnd))\r
- scaleToLookFor = peer->getPlatformScaleFactor();\r
- else\r
- scaleToLookFor = getScaleFactorForWindow (hwnd);\r
-\r
- auto globalScale = Desktop::getInstance().getGlobalScaleFactor();\r
-\r
- for (auto& d : Desktop::getInstance().getDisplays().displays)\r
- if (approximatelyEqual (d.scale / globalScale, scaleToLookFor))\r
- candidateDisplays.add (&d);\r
-\r
- if (candidateDisplays.size() > 0)\r
- {\r
- if (candidateDisplays.size() == 1)\r
- return candidateDisplays[0];\r
-\r
- Rectangle<int> bounds;\r
-\r
- if (auto* peer = HWNDComponentPeer::getOwnerOfWindow (hwnd))\r
- bounds = peer->getComponent().getTopLevelComponent()->getBounds();\r
- else\r
- bounds = Desktop::getInstance().getDisplays().physicalToLogical (rectangleFromRECT (getWindowRect (hwnd)));\r
-\r
- Displays::Display* retVal = nullptr;\r
- int maxArea = -1;\r
-\r
- for (auto* d : candidateDisplays)\r
- {\r
- auto intersection = d->totalArea.getIntersection (bounds);\r
- auto area = intersection.getWidth() * intersection.getHeight();\r
-\r
- if (area > maxArea)\r
- {\r
- maxArea = area;\r
- retVal = d;\r
- }\r
- }\r
-\r
- if (retVal != nullptr)\r
- return retVal;\r
- }\r
-\r
- return &Desktop::getInstance().getDisplays().getMainDisplay();\r
-}\r
-\r
//==============================================================================\r
struct MonitorInfo\r
{\r
- MonitorInfo (bool main, RECT rect, double d) noexcept\r
- : isMain (main), bounds (rect), dpi (d) {}\r
+ MonitorInfo (Rectangle<int> rect, bool main, double d) noexcept\r
+ : bounds (rect), dpi (d), isMain (main) {}\r
\r
- bool isMain;\r
- RECT bounds;\r
+ Rectangle<int> bounds;\r
double dpi;\r
+ bool isMain;\r
};\r
\r
static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userInfo)\r
MONITORINFO info = { 0 };\r
info.cbSize = sizeof (info);\r
GetMonitorInfo (hm, &info);\r
-\r
- auto isMain = (info.dwFlags & 1 /* MONITORINFOF_PRIMARY */) != 0;\r
- auto dpi = 0.0;\r
+ const bool isMain = (info.dwFlags & 1 /* MONITORINFOF_PRIMARY */) != 0;\r
+ double dpi = 0;\r
\r
if (getDPIForMonitor != nullptr)\r
{\r
dpi = (dpiX + dpiY) / 2.0;\r
}\r
\r
- ((Array<MonitorInfo>*) userInfo)->add ({ isMain, *r, dpi });\r
+ ((Array<MonitorInfo>*) userInfo)->add (MonitorInfo (rectangleFromRECT (*r), isMain, dpi));\r
+\r
return TRUE;\r
}\r
\r
-void Displays::findDisplays (float masterScale)\r
+void Desktop::Displays::findDisplays (float masterScale)\r
{\r
setDPIAwareness();\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- DPI_AWARENESS_CONTEXT prevContext = nullptr;\r
-\r
- if (setThreadDPIAwarenessContext != nullptr && getAwarenessFromDPIAwarenessContext != nullptr && getThreadDPIAwarenessContext != nullptr\r
- && getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) != DPI_Awareness::DPI_Awareness_Per_Monitor_Aware)\r
- {\r
- prevContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);\r
- }\r
- #endif\r
-\r
Array<MonitorInfo> monitors;\r
EnumDisplayMonitors (0, 0, &enumMonitorsProc, (LPARAM) &monitors);\r
\r
- auto globalDPI = getGlobalDPI();\r
+ const double globalDPI = getGlobalDPI();\r
\r
if (monitors.size() == 0)\r
- monitors.add ({ true, getWindowRect (GetDesktopWindow()), globalDPI });\r
+ monitors.add (MonitorInfo (rectangleFromRECT (getWindowRect (GetDesktopWindow())), true, globalDPI));\r
\r
// make sure the first in the list is the main monitor\r
for (int i = 1; i < monitors.size(); ++i)\r
- if (monitors.getReference (i).isMain)\r
+ if (monitors.getReference(i).isMain)\r
monitors.swap (i, 0);\r
\r
- for (auto& monitor : monitors)\r
+ RECT workArea;\r
+ SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0);\r
+\r
+ for (int i = 0; i < monitors.size(); ++i)\r
{\r
Display d;\r
-\r
- d.isMain = monitor.isMain;\r
- d.dpi = monitor.dpi;\r
+ d.userArea = d.totalArea = monitors.getReference(i).bounds / masterScale;\r
+ d.isMain = monitors.getReference(i).isMain;\r
+ d.dpi = monitors.getReference(i).dpi;\r
\r
if (d.dpi == 0)\r
{\r
- d.dpi = globalDPI;\r
d.scale = masterScale;\r
+ d.dpi = globalDPI;\r
}\r
else\r
{\r
- d.scale = (d.dpi / USER_DEFAULT_SCREEN_DPI) * (masterScale / Desktop::getDefaultMasterScale());\r
+ d.scale = d.dpi / 96.0;\r
}\r
\r
- d.userArea = d.totalArea = Rectangle<int>::leftTopRightBottom (monitor.bounds.left, monitor.bounds.top,\r
- monitor.bounds.right, monitor.bounds.bottom);\r
-\r
if (d.isMain)\r
- {\r
- RECT workArea;\r
- SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0);\r
-\r
- d.userArea = d.userArea.getIntersection (Rectangle<int>::leftTopRightBottom (workArea.left, workArea.top,\r
- workArea.right, workArea.bottom));\r
- }\r
+ d.userArea = d.userArea.getIntersection (rectangleFromRECT (workArea) / masterScale);\r
\r
displays.add (d);\r
}\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- updateToLogical();\r
-\r
- // Reset the DPI awareness context if it was overridden earlier\r
- if (prevContext != nullptr)\r
- setThreadDPIAwarenessContext (prevContext);\r
- #else\r
- for (auto& d : displays)\r
- {\r
- d.totalArea /= masterScale;\r
- d.userArea /= masterScale;\r
- }\r
- #endif\r
}\r
\r
//==============================================================================\r
static HICON extractFileHICON (const File& file)\r
{\r
WORD iconNum = 0;\r
- WCHAR name[MAX_PATH * 2];\r
+ WCHAR name [MAX_PATH * 2];\r
file.getFullPathName().copyToUTF16 (name, sizeof (name));\r
\r
return ExtractAssociatedIcon ((HINSTANCE) Process::getCurrentModuleInstanceHandle(),\r
jassertfalse; break;\r
}\r
\r
- if (auto cursorH = LoadCursor (0, cursorName))\r
- return cursorH;\r
+ HCURSOR cursorH = LoadCursor (0, cursorName);\r
\r
- return LoadCursor (0, IDC_ARROW);\r
+ if (cursorH == 0)\r
+ cursorH = LoadCursor (0, IDC_ARROW);\r
+\r
+ return cursorH;\r
}\r
\r
//==============================================================================\r
SetCursor (c);\r
}\r
\r
+void MouseCursor::showInAllWindows() const\r
+{\r
+ showInWindow (nullptr);\r
+}\r
+\r
} // namespace juce\r
RelativeCoordinatePositionerBase (Component&);\r
~RelativeCoordinatePositionerBase();\r
\r
- void componentMovedOrResized (Component&, bool, bool) override;\r
- void componentParentHierarchyChanged (Component&) override;\r
- void componentChildrenChanged (Component&) override;\r
- void componentBeingDeleted (Component&) override;\r
- void markersChanged (MarkerList*) override;\r
- void markerListBeingDeleted (MarkerList*) override;\r
+ void componentMovedOrResized (Component&, bool, bool);\r
+ void componentParentHierarchyChanged (Component&);\r
+ void componentChildrenChanged (Component&);\r
+ void componentBeingDeleted (Component&);\r
+ void markersChanged (MarkerList*);\r
+ void markerListBeingDeleted (MarkerList*);\r
\r
void apply();\r
\r
// Suppress a VS2013 compiler warning\r
ComponentScope& operator= (const ComponentScope&) = delete;\r
\r
- Expression getSymbolValue (const String& symbol) const override;\r
- void visitRelativeScope (const String& scopeName, Visitor&) const override;\r
- String getScopeUID() const override;\r
+ Expression getSymbolValue (const String& symbol) const;\r
+ void visitRelativeScope (const String& scopeName, Visitor&) const;\r
+ String getScopeUID() const;\r
\r
protected:\r
Component& component;\r
{\r
public:\r
StartSubPath (const RelativePoint& pos);\r
- void addToPath (Path& path, Expression::Scope*) const override;\r
- RelativePoint* getControlPoints (int& numPoints) override;\r
- ElementBase* clone() const override;\r
+ void addToPath (Path& path, Expression::Scope*) const;\r
+ RelativePoint* getControlPoints (int& numPoints);\r
+ ElementBase* clone() const;\r
\r
RelativePoint startPos;\r
\r
{\r
public:\r
CloseSubPath();\r
- void addToPath (Path& path, Expression::Scope*) const override;\r
- RelativePoint* getControlPoints (int& numPoints) override;\r
- ElementBase* clone() const override;\r
+ void addToPath (Path& path, Expression::Scope*) const;\r
+ RelativePoint* getControlPoints (int& numPoints);\r
+ ElementBase* clone() const;\r
\r
private:\r
JUCE_DECLARE_NON_COPYABLE (CloseSubPath)\r
public:\r
QuadraticTo (const RelativePoint& controlPoint, const RelativePoint& endPoint);\r
ValueTree createTree() const;\r
- void addToPath (Path& path, Expression::Scope*) const override;\r
- RelativePoint* getControlPoints (int& numPoints) override;\r
- ElementBase* clone() const override;\r
+ void addToPath (Path& path, Expression::Scope*) const;\r
+ RelativePoint* getControlPoints (int& numPoints);\r
+ ElementBase* clone() const;\r
\r
RelativePoint controlPoints[2];\r
\r
public:\r
CubicTo (const RelativePoint& controlPoint1, const RelativePoint& controlPoint2, const RelativePoint& endPoint);\r
ValueTree createTree() const;\r
- void addToPath (Path& path, Expression::Scope*) const override;\r
- RelativePoint* getControlPoints (int& numPoints) override;\r
- ElementBase* clone() const override;\r
+ void addToPath (Path& path, Expression::Scope*) const;\r
+ RelativePoint* getControlPoints (int& numPoints);\r
+ ElementBase* clone() const;\r
\r
RelativePoint controlPoints[3];\r
\r
\r
//==============================================================================\r
/** @internal */\r
- void refresh() override;\r
+ void refresh();\r
\r
private:\r
TextButton button;\r
private Value::Listener\r
{\r
public:\r
- RemapperValueSourceWithDefault (ValueWithDefault* vwd, const Array<var>& map)\r
+ RemapperValueSourceWithDefault (ValueWithDefault& vwd, const Array<var>& map)\r
: valueWithDefault (vwd),\r
- sourceValue (valueWithDefault->getPropertyAsValue()),\r
+ sourceValue (valueWithDefault.getPropertyAsValue()),\r
mappings (map)\r
{\r
sourceValue.addListener (this);\r
\r
var getValue() const override\r
{\r
- if (valueWithDefault->isUsingDefault())\r
+ if (valueWithDefault.isUsingDefault())\r
return -1;\r
\r
auto targetValue = sourceValue.getValue();\r
\r
if (newValueInt == -1)\r
{\r
- valueWithDefault->resetToDefault();\r
+ valueWithDefault.resetToDefault();\r
}\r
else\r
{\r
auto remappedVal = mappings [newValueInt - 1];\r
\r
if (! remappedVal.equalsWithSameType (sourceValue))\r
- *valueWithDefault = remappedVal;\r
+ valueWithDefault = remappedVal;\r
}\r
}\r
\r
private:\r
- void valueChanged (Value&) override { sendChangeMessage (true); }\r
-\r
- ValueWithDefault* valueWithDefault = nullptr;\r
+ ValueWithDefault& valueWithDefault;\r
Value sourceValue;\r
Array<var> mappings;\r
\r
+ void valueChanged (Value&) override { sendChangeMessage (true); }\r
+\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RemapperValueSourceWithDefault)\r
};\r
const Array<var>& correspondingValues)\r
: ChoicePropertyComponent (name, choiceList, correspondingValues)\r
{\r
- valueWithDefault = &valueToControl;\r
+ createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueToControl.getDefault())]);\r
\r
- createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueWithDefault->getDefault())]);\r
-\r
- comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault,\r
+ comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl,\r
correspondingValues)));\r
\r
- valueWithDefault->onDefaultChange = [this, choiceList, correspondingValues]\r
+ valueToControl.onDefaultChange = [this, &valueToControl, choiceList, correspondingValues]\r
{\r
auto selectedId = comboBox.getSelectedId();\r
\r
comboBox.clear();\r
- createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueWithDefault->getDefault())]);\r
+ createComboBoxWithDefault (choiceList [correspondingValues.indexOf (valueToControl.getDefault())]);\r
\r
comboBox.setSelectedId (selectedId);\r
};\r
: PropertyComponent (name),\r
choices ({ "Enabled", "Disabled" })\r
{\r
- valueWithDefault = &valueToControl;\r
-\r
- createComboBoxWithDefault (valueWithDefault->getDefault() ? "Enabled" : "Disabled");\r
+ createComboBoxWithDefault (valueToControl.getDefault() ? "Enabled" : "Disabled");\r
\r
- comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault,\r
+ comboBox.getSelectedIdAsValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl,\r
{ true, false })));\r
\r
- valueWithDefault->onDefaultChange = [this]\r
+ valueToControl.onDefaultChange = [this, &valueToControl]\r
{\r
auto selectedId = comboBox.getSelectedId();\r
\r
comboBox.clear();\r
- createComboBoxWithDefault (valueWithDefault->getDefault() ? "Enabled" : "Disabled");\r
+ createComboBoxWithDefault (valueToControl.getDefault() ? "Enabled" : "Disabled");\r
\r
comboBox.setSelectedId (selectedId);\r
};\r
\r
ChoicePropertyComponent::~ChoicePropertyComponent()\r
{\r
- if (valueWithDefault != nullptr)\r
- valueWithDefault->onDefaultChange = nullptr;\r
}\r
\r
//==============================================================================\r
*/\r
class JUCE_API ChoicePropertyComponent : public PropertyComponent\r
{\r
-private:\r
- /** Delegating constructor. */\r
- ChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
-\r
protected:\r
/** Creates the component.\r
Your subclass's constructor must add a list of options to the choices member variable.\r
/** Creates the component using a ValueWithDefault object. This will add an item to the ComboBox for the\r
default value with an ID of -1.\r
\r
- @param valueToControl the ValueWithDefault object that contains the Value object that the combo box will read and control.\r
- NB: this object must outlive the ChoicePropertyComponent.\r
+ @param valueToControl the ValueWithDefault object that contains the Value object that the combo box will read and control\r
@param propertyName the name of the property\r
@param choices the list of possible values that the drop-down list will contain\r
@param correspondingValues a list of values corresponding to each item in the 'choices' StringArray.\r
StringArray choices;\r
\r
private:\r
- //==============================================================================\r
+ /** Delegating constructor. */\r
+ ChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
+\r
+ ComboBox comboBox;\r
+ bool isCustomClass = false;\r
+\r
class RemapperValueSource;\r
class RemapperValueSourceWithDefault;\r
\r
- //==============================================================================\r
void createComboBox();\r
void createComboBoxWithDefault (const String&);\r
\r
void changeIndex();\r
\r
- //==============================================================================\r
- ComboBox comboBox;\r
- bool isCustomClass = false;\r
-\r
- ValueWithDefault* valueWithDefault = nullptr;\r
-\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChoicePropertyComponent)\r
};\r
\r
private Value::Listener\r
{\r
public:\r
- MultiChoiceRemapperSourceWithDefault (ValueWithDefault* vwd, var v, int c, ToggleButton* b)\r
+ MultiChoiceRemapperSourceWithDefault (ValueWithDefault& vwd, var v, int c, ToggleButton* b)\r
: valueWithDefault (vwd),\r
varToControl (v),\r
- sourceValue (valueWithDefault->getPropertyAsValue()),\r
+ sourceValue (valueWithDefault.getPropertyAsValue()),\r
maxChoices (c),\r
buttonToControl (b)\r
{\r
\r
var getValue() const override\r
{\r
- auto v = valueWithDefault->get();\r
+ auto v = valueWithDefault.get();\r
\r
if (auto* arr = v.getArray())\r
{\r
\r
void setValue (const var& newValue) override\r
{\r
- auto v = valueWithDefault->get();\r
+ auto v = valueWithDefault.get();\r
\r
OptionalScopedPointer<Array<var>> arrayToControl;\r
\r
- if (valueWithDefault->isUsingDefault())\r
+ if (valueWithDefault.isUsingDefault())\r
arrayToControl.set (new Array<var>(), true); // use an empty array so the default values are overwritten\r
else\r
arrayToControl.set (v.getArray(), false);\r
\r
bool newState = newValue;\r
\r
- if (valueWithDefault->isUsingDefault())\r
+ if (valueWithDefault.isUsingDefault())\r
{\r
if (auto* defaultArray = v.getArray())\r
{\r
StringComparator c;\r
temp.sort (c);\r
\r
- *valueWithDefault = temp;\r
+ valueWithDefault = temp;\r
\r
if (temp.size() == 0)\r
- valueWithDefault->resetToDefault();\r
+ valueWithDefault.resetToDefault();\r
}\r
}\r
\r
private:\r
+ ValueWithDefault& valueWithDefault;\r
+ var varToControl;\r
+ Value sourceValue;\r
+\r
+ int maxChoices;\r
+\r
+ ToggleButton* buttonToControl;\r
+\r
//==============================================================================\r
- void valueChanged (Value&) override { sendChangeMessage (true); }\r
+ void valueChanged (Value&) override { sendChangeMessage (true); }\r
\r
void updateButtonTickColour() const noexcept\r
{\r
- auto alpha = valueWithDefault->isUsingDefault() ? 0.4f : 1.0f;\r
+ auto alpha = valueWithDefault.isUsingDefault() ? 0.4f : 1.0f;\r
auto baseColour = buttonToControl->findColour (ToggleButton::tickColourId);\r
\r
buttonToControl->setColour (ToggleButton::tickColourId, baseColour.withAlpha (alpha));\r
}\r
\r
- //==============================================================================\r
- ValueWithDefault* valueWithDefault = nullptr;\r
- var varToControl;\r
- Value sourceValue;\r
-\r
- int maxChoices;\r
-\r
- ToggleButton* buttonToControl;\r
-\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiChoiceRemapperSourceWithDefault)\r
};\r
int maxChoices)\r
: MultiChoicePropertyComponent (propertyName, choices, correspondingValues)\r
{\r
- valueWithDefault = &valueToControl;\r
-\r
// The value to control must be an array!\r
- jassert (valueWithDefault->get().isArray());\r
+ jassert (valueToControl.get().isArray());\r
\r
for (int i = 0; i < choiceButtons.size(); ++i)\r
- choiceButtons[i]->getToggleStateValue().referTo (Value (new MultiChoiceRemapperSourceWithDefault (valueWithDefault,\r
+ choiceButtons[i]->getToggleStateValue().referTo (Value (new MultiChoiceRemapperSourceWithDefault (valueToControl,\r
correspondingValues[i],\r
maxChoices,\r
choiceButtons[i])));\r
\r
- valueWithDefault->onDefaultChange = [this] { repaint(); };\r
-}\r
-\r
-MultiChoicePropertyComponent::~MultiChoicePropertyComponent()\r
-{\r
- if (valueWithDefault != nullptr)\r
- valueWithDefault->onDefaultChange = nullptr;\r
+ valueToControl.onDefaultChange = [this] { repaint(); };\r
}\r
\r
void MultiChoicePropertyComponent::paint (Graphics& g)\r
*/\r
class MultiChoicePropertyComponent : public PropertyComponent\r
{\r
-private:\r
- /** Delegating constructor. */\r
- MultiChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
-\r
public:\r
/** Creates the component. Note that the underlying var object that the Value refers to must be an array.\r
\r
\r
/** Creates the component using a ValueWithDefault object. This will select the default options.\r
\r
- @param valueToControl the ValueWithDefault object that contains the Value object that the ToggleButtons will read and control.\r
- NB: This object must outlive the MultiChoicePropertyComponent.\r
+ @param valueToControl the ValueWithDefault object that contains the Value object that the ToggleButtons will read and control\r
@param propertyName the name of the property\r
@param choices the list of possible values that will be represented\r
@param correspondingValues a list of values corresponding to each item in the 'choices' StringArray.\r
const Array<var>& correspondingValues,\r
int maxChoices = -1);\r
\r
- ~MultiChoicePropertyComponent();\r
-\r
//==============================================================================\r
/** Returns true if the list of options is expanded. */\r
bool isExpanded() const noexcept { return expanded; }\r
void refresh() override {}\r
\r
private:\r
- //==============================================================================\r
+ MultiChoicePropertyComponent (const String&, const StringArray&, const Array<var>&);\r
+\r
class MultiChoiceRemapperSource;\r
class MultiChoiceRemapperSourceWithDefault;\r
\r
void lookAndFeelChanged() override;\r
\r
//==============================================================================\r
- ValueWithDefault* valueWithDefault = nullptr;\r
-\r
int maxHeight = 0;\r
int numHidden = 0;\r
bool expanded = false;\r
namespace juce\r
{\r
\r
-PropertyComponent::PropertyComponent (const String& name, int height)\r
- : Component (name), preferredHeight (height)\r
+PropertyComponent::PropertyComponent (const String& name, const int preferredHeight_)\r
+ : Component (name), preferredHeight (preferredHeight_)\r
{\r
jassert (name.isNotEmpty());\r
}\r
\r
void PropertyComponent::paint (Graphics& g)\r
{\r
- auto& lf = getLookAndFeel();\r
+ LookAndFeel& lf = getLookAndFeel();\r
\r
lf.drawPropertyComponentBackground (g, getWidth(), getHeight(), *this);\r
lf.drawPropertyComponentLabel (g, getWidth(), getHeight(), *this);\r
\r
void PropertyComponent::resized()\r
{\r
- if (auto c = getChildComponent(0))\r
+ if (Component* const c = getChildComponent(0))\r
c->setBounds (getLookAndFeel().getPropertyComponentContentPosition (*this));\r
}\r
\r
\r
//==============================================================================\r
/** @internal */\r
- void refresh() override;\r
+ void refresh();\r
\r
protected:\r
/** The slider component being used in this component.\r
{\r
if (getText().isEmpty() && ! isBeingEdited())\r
{\r
- auto& lf = owner.getLookAndFeel();\r
- auto textArea = lf.getLabelBorderSize (*this).subtractedFrom (getLocalBounds());\r
- auto labelFont = lf.getLabelFont (*this);\r
+ auto textArea = getBorderSize().subtractedFrom (getLocalBounds());\r
+ auto labelFont = owner.getLookAndFeel().getLabelFont (*this);\r
\r
g.setColour (owner.findColour (TextPropertyComponent::textColourId).withAlpha (alphaToUseForEmptyText));\r
g.setFont (labelFont);\r
class TextPropertyComponent::RemapperValueSourceWithDefault : public Value::ValueSource\r
{\r
public:\r
- RemapperValueSourceWithDefault (ValueWithDefault* vwd)\r
+ RemapperValueSourceWithDefault (const ValueWithDefault& vwd)\r
: valueWithDefault (vwd)\r
{\r
}\r
\r
var getValue() const override\r
{\r
- return valueWithDefault->isUsingDefault() ? var() : valueWithDefault->get();\r
+ return valueWithDefault.isUsingDefault() ? var() : valueWithDefault.get();\r
}\r
\r
void setValue (const var& newValue) override\r
{\r
if (newValue.toString().isEmpty())\r
- valueWithDefault->resetToDefault();\r
+ valueWithDefault.resetToDefault();\r
else\r
- *valueWithDefault = newValue;\r
+ valueWithDefault = newValue;\r
}\r
\r
private:\r
- ValueWithDefault* valueWithDefault = nullptr;\r
+ ValueWithDefault valueWithDefault;\r
\r
//==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RemapperValueSourceWithDefault)\r
createEditor (maxNumChars, isEditable);\r
}\r
\r
-TextPropertyComponent::TextPropertyComponent (const Value& valueToControl, const String& name,\r
- int maxNumChars, bool multiLine, bool isEditable)\r
- : TextPropertyComponent (name, maxNumChars, multiLine, isEditable)\r
+TextPropertyComponent::TextPropertyComponent (const Value& valueToControl,\r
+ const String& name,\r
+ int maxNumChars,\r
+ bool isMultiLine,\r
+ bool isEditable)\r
+ : TextPropertyComponent (name, maxNumChars, isMultiLine, isEditable)\r
{\r
textEditor->getTextValue().referTo (valueToControl);\r
}\r
\r
-TextPropertyComponent::TextPropertyComponent (ValueWithDefault& valueToControl, const String& name,\r
- int maxNumChars, bool multiLine, bool isEditable)\r
- : TextPropertyComponent (name, maxNumChars, multiLine, isEditable)\r
+TextPropertyComponent::TextPropertyComponent (ValueWithDefault& valueToControl,\r
+ const String& name,\r
+ int maxNumChars,\r
+ bool isMultiLine,\r
+ bool isEditable)\r
+ : TextPropertyComponent (name, maxNumChars, isMultiLine, isEditable)\r
{\r
- valueWithDefault = &valueToControl;\r
-\r
- textEditor->getTextValue().referTo (Value (new RemapperValueSourceWithDefault (valueWithDefault)));\r
- textEditor->setTextToDisplayWhenEmpty (valueWithDefault->getDefault(), 0.5f);\r
+ textEditor->getTextValue().referTo (Value (new RemapperValueSourceWithDefault (valueToControl)));\r
+ textEditor->setTextToDisplayWhenEmpty (valueToControl.getDefault(), 0.5f);\r
\r
- valueWithDefault->onDefaultChange = [this]\r
+ valueToControl.onDefaultChange = [this, &valueToControl]\r
{\r
- textEditor->setTextToDisplayWhenEmpty (valueWithDefault->getDefault(), 0.5f);\r
+ textEditor->setTextToDisplayWhenEmpty (valueToControl.getDefault(), 0.5f);\r
repaint();\r
};\r
}\r
\r
TextPropertyComponent::~TextPropertyComponent()\r
{\r
- if (valueWithDefault != nullptr)\r
- valueWithDefault->onDefaultChange = nullptr;\r
}\r
\r
void TextPropertyComponent::setText (const String& newText)\r
\r
/** Creates a text property component with a default value.\r
\r
- @param valueToControl The ValueWithDefault that is controlled by the TextPropertyComponent.\r
- NB: this object must outlive the TextPropertyComponent.\r
+ @param valueToControl The ValueWithDefault that is controlled by the TextPropertyComponent\r
@param propertyName The name of the property\r
@param maxNumChars If not zero, then this specifies the maximum allowable length of\r
the string. If zero, then the string will have no length limit.\r
virtual void textWasEdited();\r
\r
private:\r
+ bool isMultiLine;\r
+\r
class RemapperValueSourceWithDefault;\r
+\r
class LabelComp;\r
friend class LabelComp;\r
\r
- //==============================================================================\r
- void callListeners();\r
- void createEditor (int maxNumChars, bool isEditable);\r
-\r
- //==============================================================================\r
- bool isMultiLine;\r
-\r
std::unique_ptr<LabelComp> textEditor;\r
ListenerList<Listener> listenerList;\r
\r
- ValueWithDefault* valueWithDefault = nullptr;\r
+ void callListeners();\r
+ void createEditor (int maxNumChars, bool isEditable);\r
\r
- //==============================================================================\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextPropertyComponent)\r
};\r
\r
label->getRight(), 0, getWidth() - label->getRight(), getHeight(),\r
*this);\r
\r
- if (textWhenNothingSelected.isNotEmpty() && label->getText().isEmpty() && ! label->isBeingEdited())\r
- getLookAndFeel().drawComboBoxTextWhenNothingSelected (g, *this, *label);\r
+ if (textWhenNothingSelected.isNotEmpty()\r
+ && label->getText().isEmpty()\r
+ && ! label->isBeingEdited())\r
+ {\r
+ g.setColour (findColour (textColourId).withMultipliedAlpha (0.5f));\r
+ g.setFont (label->getLookAndFeel().getLabelFont (*label));\r
+ g.drawFittedText (textWhenNothingSelected, label->getBounds().reduced (2, 1),\r
+ label->getJustificationType(),\r
+ jmax (1, (int) (label->getHeight() / label->getFont().getHeight())));\r
+ }\r
}\r
\r
void ComboBox::resized()\r
\r
void ComboBox::showPopup()\r
{\r
- if (! menuActive)\r
- menuActive = true;\r
-\r
auto menu = currentMenu;\r
\r
if (menu.getNumItems() > 0)\r
menu.addItem (1, noChoicesMessage, false, false);\r
}\r
\r
- auto& lf = getLookAndFeel();\r
-\r
- menu.setLookAndFeel (&lf);\r
- menu.showMenuAsync (lf.getOptionsForComboBoxPopupMenu (*this, *label),\r
+ menu.setLookAndFeel (&getLookAndFeel());\r
+ menu.showMenuAsync (PopupMenu::Options().withTargetComponent (this)\r
+ .withItemThatMustBeVisible (getSelectedId())\r
+ .withMinimumWidth (getWidth())\r
+ .withMaximumNumColumns (1)\r
+ .withStandardItemHeight (label->getHeight()),\r
ModalCallbackFunction::forComponent (comboBoxPopupMenuFinishedCallback, this));\r
}\r
\r
\r
The text passed-in will be set as the current text regardless of whether\r
it is one of the items in the list. If the current text isn't one of the\r
- items, then getSelectedId() will return 0, otherwise it wil return\r
+ items, then getSelectedId() will return -1, otherwise it wil return\r
the approriate ID.\r
\r
@param newText the text to select\r
virtual Label* createComboBoxTextBox (ComboBox&) = 0;\r
\r
virtual void positionComboBoxText (ComboBox&, Label& labelToPosition) = 0;\r
-\r
- virtual PopupMenu::Options getOptionsForComboBoxPopupMenu (ComboBox&, Label&) = 0;\r
-\r
- virtual void drawComboBoxTextWhenNothingSelected (Graphics&, ComboBox&, Label&) = 0;\r
};\r
\r
//==============================================================================\r
//==============================================================================\r
Component* Label::getAttachedComponent() const\r
{\r
- return ownerComponent.get();\r
+ return static_cast<Component*> (ownerComponent);\r
}\r
\r
void Label::attachToComponent (Component* owner, bool onLeft)\r
{\r
- jassert (owner != this); // Not a great idea to try to attach it to itself!\r
-\r
if (ownerComponent != nullptr)\r
ownerComponent->removeComponentListener (this);\r
\r
ownerComponent = owner;\r
+\r
leftOfOwnerComp = onLeft;\r
\r
if (ownerComponent != nullptr)\r
\r
void Label::componentMovedOrResized (Component& component, bool /*wasMoved*/, bool /*wasResized*/)\r
{\r
- auto& lf = getLookAndFeel();\r
- auto f = lf.getLabelFont (*this);\r
- auto borderSize = lf.getLabelBorderSize (*this);\r
+ auto f = getLookAndFeel().getLabelFont (*this);\r
\r
if (leftOfOwnerComp)\r
{\r
auto width = jmin (roundToInt (f.getStringWidthFloat (textValue.toString()) + 0.5f)\r
- + borderSize.getLeftAndRight(),\r
+ + getBorderSize().getLeftAndRight(),\r
component.getX());\r
\r
setBounds (component.getX() - width, component.getY(), width, component.getHeight());\r
}\r
else\r
{\r
- auto height = borderSize.getTopAndBottom() + 6 + roundToInt (f.getHeight() + 0.5f);\r
+ auto height = getBorderSize().getTopAndBottom() + 6 + roundToInt (f.getHeight() + 0.5f);\r
\r
setBounds (component.getX(), component.getY() - height, component.getWidth(), height);\r
}\r
\r
virtual void drawLabel (Graphics&, Label&) = 0;\r
virtual Font getLabelFont (Label&) = 0;\r
- virtual BorderSize<int> getLabelBorderSize (Label&) = 0;\r
};\r
\r
protected:\r
|| style == LinearBarVertical;\r
}\r
\r
- bool isTwoValue() const noexcept\r
- {\r
- return style == TwoValueHorizontal\r
- || style == TwoValueVertical;\r
- }\r
-\r
- bool isThreeValue() const noexcept\r
- {\r
- return style == ThreeValueHorizontal\r
- || style == ThreeValueVertical;\r
- }\r
-\r
bool incDecDragDirectionIsHorizontal() const noexcept\r
{\r
return incDecButtonMode == incDecButtonsDraggable_Horizontal\r
\r
int getThumbIndexAt (const MouseEvent& e)\r
{\r
- if (isTwoValue() || isThreeValue())\r
+ bool isTwoValue = (style == TwoValueHorizontal || style == TwoValueVertical);\r
+ bool isThreeValue = (style == ThreeValueHorizontal || style == ThreeValueVertical);\r
+\r
+ if (isTwoValue || isThreeValue)\r
{\r
auto mousePos = isVertical() ? e.position.y : e.position.x;\r
\r
auto minPosDistance = std::abs (getLinearSliderPos (valueMin.getValue()) + (isVertical() ? 0.1f : -0.1f) - mousePos);\r
auto maxPosDistance = std::abs (getLinearSliderPos (valueMax.getValue()) + (isVertical() ? -0.1f : 0.1f) - mousePos);\r
\r
- if (isTwoValue())\r
+ if (isTwoValue)\r
return maxPosDistance <= minPosDistance ? 2 : 1;\r
\r
if (normalPosDistance >= minPosDistance && maxPosDistance >= minPosDistance)\r
\r
minMaxDiff = static_cast<double> (valueMax.getValue()) - static_cast<double> (valueMin.getValue());\r
\r
- if (! isTwoValue())\r
- lastAngle = rotaryParams.startAngleRadians\r
- + (rotaryParams.endAngleRadians - rotaryParams.startAngleRadians)\r
- * owner.valueToProportionOfLength (currentValue.getValue());\r
+ lastAngle = rotaryParams.startAngleRadians\r
+ + (rotaryParams.endAngleRadians - rotaryParams.startAngleRadians)\r
+ * owner.valueToProportionOfLength (currentValue.getValue());\r
\r
valueWhenLastDragged = (sliderBeingDragged == 2 ? valueMax\r
: (sliderBeingDragged == 1 ? valueMin\r
\r
void mouseMove()\r
{\r
+ auto isTwoValue = (style == TwoValueHorizontal || style == TwoValueVertical);\r
+ auto isThreeValue = (style == ThreeValueHorizontal || style == ThreeValueVertical);\r
+\r
// this is a workaround for a bug where the popup display being dismissed triggers\r
// a mouse move causing it to never be hidden\r
auto shouldShowPopup = showPopupOnHover\r
&& (Time::getMillisecondCounterHiRes() - lastPopupDismissal) > 250;\r
\r
if (shouldShowPopup\r
- && ! isTwoValue()\r
- && ! isThreeValue())\r
+ && ! isTwoValue\r
+ && ! isThreeValue)\r
{\r
if (owner.isMouseOver (true))\r
{\r
\r
if (popupDisplay == nullptr)\r
{\r
- popupDisplay.reset (new PopupDisplayComponent (owner, parentForPopupDisplay == nullptr));\r
+ popupDisplay.reset (new PopupDisplayComponent (owner));\r
\r
if (parentForPopupDisplay != nullptr)\r
parentForPopupDisplay->addChildComponent (popupDisplay.get());\r
else\r
- popupDisplay->addToDesktop (ComponentPeer::windowIsTemporary\r
- | ComponentPeer::windowIgnoresKeyPresses\r
- | ComponentPeer::windowIgnoresMouseClicks);\r
+ popupDisplay->addToDesktop (ComponentPeer::windowIsTemporary);\r
\r
if (style == SliderStyle::TwoValueHorizontal\r
|| style == SliderStyle::TwoValueVertical)\r
struct PopupDisplayComponent : public BubbleComponent,\r
public Timer\r
{\r
- PopupDisplayComponent (Slider& s, bool isOnDesktop)\r
+ PopupDisplayComponent (Slider& s)\r
: owner (s),\r
font (s.getLookAndFeel().getSliderPopupFont (s))\r
{\r
- if (isOnDesktop)\r
- setTransform (AffineTransform::scale (getApproximateScaleFactor (&s)));\r
-\r
setAlwaysOnTop (true);\r
setAllowedPlacement (owner.getLookAndFeel().getSliderPopupPlacement (s));\r
setLookAndFeel (&s.getLookAndFeel());\r
\r
~PopupDisplayComponent()\r
{\r
- if (owner.pimpl != nullptr)\r
- owner.pimpl->lastPopupDismissal = Time::getMillisecondCounterHiRes();\r
+ owner.pimpl->lastPopupDismissal = Time::getMillisecondCounterHiRes();\r
}\r
\r
void paintContent (Graphics& g, int w, int h) override\r
}\r
\r
private:\r
- static float getApproximateScaleFactor (Component* targetComponent)\r
- {\r
- AffineTransform transform;\r
-\r
- for (Component* target = targetComponent; target != nullptr; target = target->getParentComponent())\r
- {\r
- transform = transform.followedBy (target->getTransform());\r
-\r
- if (target->isOnDesktop())\r
- transform = transform.scaled (target->getDesktopScaleFactor());\r
- }\r
-\r
- return (transform.getScaleFactor() / Desktop::getInstance().getGlobalScaleFactor());\r
- }\r
-\r
- //==============================================================================\r
Slider& owner;\r
Font font;\r
String text;\r
bool Slider::isVertical() const noexcept { return pimpl->isVertical(); }\r
bool Slider::isRotary() const noexcept { return pimpl->isRotary(); }\r
bool Slider::isBar() const noexcept { return pimpl->isBar(); }\r
-bool Slider::isTwoValue() const noexcept { return pimpl->isTwoValue(); }\r
-bool Slider::isThreeValue() const noexcept { return pimpl->isThreeValue(); }\r
\r
float Slider::getPositionOfValue (double value) const { return pimpl->getPositionOfValue (value); }\r
\r
bool isRotary() const noexcept;\r
/** True if the slider is in a linear bar mode. */\r
bool isBar() const noexcept;\r
- /** True if the slider has two thumbs. */\r
- bool isTwoValue() const noexcept;\r
- /** True if the slider has three thumbs. */\r
- bool isThreeValue() const noexcept;\r
\r
//==============================================================================\r
/** A set of colour IDs to use to change the colour of various aspects of the slider.\r
private:\r
//==============================================================================\r
JUCE_PUBLIC_IN_DLL_BUILD (class Pimpl)\r
+ friend class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
void init (SliderStyle, TextEntryBoxPosition);\r
auto currentIndex = getIndexOfColumnId (columnId, false);\r
newIndex = visibleIndexToTotalIndex (newIndex);\r
\r
- if (columns[currentIndex] != nullptr && currentIndex != newIndex)\r
+ if (columns [currentIndex] != 0 && currentIndex != newIndex)\r
{\r
columns.move (currentIndex, newIndex);\r
sendColumnsChanged();\r
\r
void TableHeaderComponent::restoreFromString (const String& storedVersion)\r
{\r
- if (auto storedXML = parseXML (storedVersion))\r
+ std::unique_ptr<XmlElement> storedXml (XmlDocument::parse (storedVersion));\r
+ int index = 0;\r
+\r
+ if (storedXml != nullptr && storedXml->hasTagName ("TABLELAYOUT"))\r
{\r
- if (storedXML->hasTagName ("TABLELAYOUT"))\r
+ forEachXmlChildElement (*storedXml, col)\r
{\r
- int index = 0;\r
+ auto tabId = col->getIntAttribute ("id");\r
\r
- forEachXmlChildElement (*storedXML, col)\r
+ if (auto* ci = getInfoForId (tabId))\r
{\r
- auto tabId = col->getIntAttribute ("id");\r
-\r
- if (auto* ci = getInfoForId (tabId))\r
- {\r
- columns.move (columns.indexOf (ci), index);\r
- ci->width = col->getIntAttribute ("width");\r
- setColumnVisible (tabId, col->getBoolAttribute ("visible"));\r
- }\r
-\r
- ++index;\r
+ columns.move (columns.indexOf (ci), index);\r
+ ci->width = col->getIntAttribute ("width");\r
+ setColumnVisible (tabId, col->getBoolAttribute ("visible"));\r
}\r
\r
- columnsResized = true;\r
- sendColumnsChanged();\r
-\r
- setSortColumnId (storedXML->getIntAttribute ("sortedCol"),\r
- storedXML->getBoolAttribute ("sortForwards", true));\r
+ ++index;\r
}\r
+\r
+ columnsResized = true;\r
+ sendColumnsChanged();\r
+\r
+ setSortColumnId (storedXml->getIntAttribute ("sortedCol"),\r
+ storedXml->getBoolAttribute ("sortForwards", true));\r
}\r
}\r
\r
//==============================================================================\r
-void TableHeaderComponent::addListener (Listener* newListener)\r
+void TableHeaderComponent::addListener (Listener* const newListener)\r
{\r
listeners.addIfNotAlreadyThere (newListener);\r
}\r
\r
-void TableHeaderComponent::removeListener (Listener* listenerToRemove)\r
+void TableHeaderComponent::removeListener (Listener* const listenerToRemove)\r
{\r
listeners.removeFirstMatchingValue (listenerToRemove);\r
}\r
\r
void TableHeaderComponent::paint (Graphics& g)\r
{\r
- auto& lf = getLookAndFeel();\r
+ LookAndFeel& lf = getLookAndFeel();\r
\r
lf.drawTableHeaderBackground (g, *this);\r
\r
- auto clip = g.getClipBounds();\r
+ const Rectangle<int> clip (g.getClipBounds());\r
\r
int x = 0;\r
\r
\r
bool perform() override\r
{\r
- owner.insert (text, insertIndex, font, colour, nullptr, newCaretPos);\r
+ owner.insert (text, insertIndex, font, colour, 0, newCaretPos);\r
return true;\r
}\r
\r
bool undo() override\r
{\r
- owner.remove ({ insertIndex, insertIndex + text.length() }, nullptr, oldCaretPos);\r
+ owner.remove ({ insertIndex, insertIndex + text.length() }, 0, oldCaretPos);\r
return true;\r
}\r
\r
\r
bool perform() override\r
{\r
- owner.remove (range, nullptr, newCaretPos);\r
+ owner.remove (range, 0, newCaretPos);\r
return true;\r
}\r
\r
bool cursorWasAtEnd = oldCursorPos >= getTotalNumChars();\r
\r
clearInternal (nullptr);\r
- insert (newText, 0, currentFont, findColour (textColourId), nullptr, caretPosition);\r
+ insert (newText, 0, currentFont, findColour (textColourId), 0, caretPosition);\r
\r
// if you're adding text with line-feeds to a single-line text editor, it\r
// ain't gonna look right!\r
void itemDropped (const SourceDetails&) override;\r
\r
private:\r
- friend class TreeViewItem;\r
-\r
class ContentComponent;\r
class TreeViewport;\r
class InsertPointHighlight;\r
class TargetGroupHighlight;\r
+ friend class TreeViewItem;\r
+ friend class ContentComponent;\r
+ friend struct ContainerDeletePolicy<TreeViewport>;\r
+ friend struct ContainerDeletePolicy<InsertPointHighlight>;\r
+ friend struct ContainerDeletePolicy<TargetGroupHighlight>;\r
\r
std::unique_ptr<TreeViewport> viewport;\r
CriticalSection nodeAlterationLock;\r
\r
b->setWantsKeyboardFocus (true);\r
b->setMouseClickGrabsKeyboardFocus (false);\r
- b->setCommandToTrigger (nullptr, returnValue, false);\r
+ b->setCommandToTrigger (0, returnValue, false);\r
b->addShortcut (shortcutKey1);\r
b->addShortcut (shortcutKey2);\r
b->onClick = [this, b] { exitAlert (b); };\r
{\r
setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows());\r
\r
- updatePosition (area, Desktop::getInstance().getDisplays().findDisplayForRect (area).userArea);\r
+ updatePosition (area, Desktop::getInstance().getDisplays()\r
+ .getDisplayContaining (area.getCentre()).userArea);\r
\r
addToDesktop (ComponentPeer::windowIsTemporary);\r
\r
~CallOutBox();\r
\r
//==============================================================================\r
- /** Changes the base width of the arrow. */\r
+ /** Changes the length of the arrow. */\r
void setArrowSize (float newSize);\r
\r
/** Updates the position and size of the box.\r
g.addTransform (component.getTransform());\r
\r
auto peerBounds = getBounds();\r
- auto componentBounds = component.getLocalBounds();\r
\r
- if (component.isTransformed())\r
- componentBounds = componentBounds.transformedBy (component.getTransform());\r
-\r
- if (peerBounds.getWidth() != componentBounds.getWidth() || peerBounds.getHeight() != componentBounds.getHeight())\r
+ if (peerBounds.getWidth() != component.getWidth() || peerBounds.getHeight() != component.getHeight())\r
// Tweak the scaling so that the component's integer size exactly aligns with the peer's scaled size\r
- g.addTransform (AffineTransform::scale (peerBounds.getWidth() / (float) componentBounds.getWidth(),\r
- peerBounds.getHeight() / (float) componentBounds.getHeight()));\r
+ g.addTransform (AffineTransform::scale (peerBounds.getWidth() / (float) component.getWidth(),\r
+ peerBounds.getHeight() / (float) component.getHeight()));\r
\r
#if JUCE_ENABLE_REPAINT_DEBUGGING\r
#ifdef JUCE_IS_REPAINT_DEBUGGING_ACTIVE\r
*/\r
static ModifierKeys getCurrentModifiersRealtime() noexcept;\r
\r
- //==============================================================================\r
- /** Used to receive callbacks when the OS scale factor of this ComponentPeer changes.\r
-\r
- This is used internally by some native JUCE windows on Windows and Linux and you\r
- shouldn't need to worry about it in your own code unless you are dealing directly\r
- with native windows.\r
- */\r
- struct JUCE_API ScaleFactorListener\r
- {\r
- /** Destructor. */\r
- virtual ~ScaleFactorListener() {}\r
-\r
- /** Called when the scale factor changes. */\r
- virtual void nativeScaleFactorChanged (double newScaleFactor) = 0;\r
- };\r
-\r
- /** Adds a scale factor listener. */\r
- void addScaleFactorListener (ScaleFactorListener* listenerToAdd) { scaleFactorListeners.add (listenerToAdd); }\r
-\r
- /** Removes a scale factor listener. */\r
- void removeScaleFactorListener (ScaleFactorListener* listenerToRemove) { scaleFactorListeners.remove (listenerToRemove); }\r
-\r
- //==============================================================================\r
- /** On Windows and Linux this will return the OS scaling factor currently being applied\r
- to the native window. This is used to convert between physical and logical pixels\r
- at the OS API level and you shouldn't need to use it in your own code unless you\r
- are dealing directly with the native window.\r
- */\r
- virtual double getPlatformScaleFactor() const noexcept { return 1.0; }\r
-\r
protected:\r
//==============================================================================\r
Component& component;\r
Rectangle<int> lastNonFullscreenBounds;\r
ComponentBoundsConstrainer* constrainer = nullptr;\r
static std::function<ModifierKeys()> getNativeRealtimeModifiers;\r
- ListenerList<ScaleFactorListener> scaleFactorListeners;\r
\r
private:\r
//==============================================================================\r
//==============================================================================\r
/** Easy way of quickly showing a dialog box containing a given component.\r
\r
- Note: This method has been superceded by the DialogWindow::LaunchOptions structure,\r
+ Note: this method has been superceded by the DialogWindow::LaunchOptions structure,\r
which does the same job with some extra flexibility. The showDialog method is here\r
for backwards compatibility, but please use DialogWindow::LaunchOptions in new code.\r
\r
#if JUCE_MODAL_LOOPS_PERMITTED || DOXYGEN\r
/** Easy way of quickly showing a dialog box containing a given component.\r
\r
- Note: This method has been superceded by the DialogWindow::LaunchOptions structure,\r
+ Note: this method has been superceded by the DialogWindow::LaunchOptions structure,\r
which does the same job with some extra flexibility. The showDialog method is here\r
for backwards compatibility, but please use DialogWindow::LaunchOptions in new code.\r
\r
titleBarArea.getHeight(),\r
titleSpaceX1,\r
jmax (1, titleSpaceX2 - titleSpaceX1),\r
- titleBarIcon.isValid() ? &titleBarIcon : nullptr,\r
+ titleBarIcon.isValid() ? &titleBarIcon : 0,\r
! drawTitleTextCentred);\r
}\r
\r
MenuBarModel* menuBarModel = nullptr;\r
\r
class ButtonListenerProxy;\r
+ friend struct ContainerDeletePolicy<ButtonListenerProxy>;\r
std::unique_ptr<ButtonListenerProxy> buttonListener;\r
\r
void repaintTitleBar();\r
\r
if (onScreenArea.getWidth() * onScreenArea.getHeight() < 32 * 32)\r
{\r
- auto screen = desktop.getDisplays().findDisplayForRect (newPos).userArea;\r
+ auto screen = desktop.getDisplays().getDisplayContaining (newPos.getCentre()).userArea;\r
\r
newPos.setSize (jmin (newPos.getWidth(), screen.getWidth()),\r
jmin (newPos.getHeight(), screen.getHeight()));\r
\r
void ThreadWithProgressWindow::launchThread (int priority)\r
{\r
- JUCE_ASSERT_MESSAGE_THREAD\r
+ jassert (MessageManager::getInstance()->isThisTheMessageThread());\r
\r
startThread (priority);\r
startTimer (100);\r
{\r
bool threadStillRunning = isThreadRunning();\r
\r
- if (! (threadStillRunning && alertWindow->isCurrentlyModal (false)))\r
+ if (! (threadStillRunning && alertWindow->isCurrentlyModal()))\r
{\r
stopTimer();\r
stopThread (timeOutMsWhenCancelling);\r
}\r
else\r
{\r
- updatePosition (tip, screenPos, Desktop::getInstance().getDisplays().findDisplayForPoint (screenPos).userArea);\r
+ updatePosition (tip, screenPos, Desktop::getInstance().getDisplays()\r
+ .getDisplayContaining (screenPos).userArea);\r
\r
addToDesktop (ComponentPeer::windowHasDropShadow\r
| ComponentPeer::windowIsTemporary\r
if (w != this && w->tipShowing == tipShowing)\r
{\r
// Looks like you have more than one TooltipWindow showing the same tip..\r
- // Be careful not to create more than one instance of this class with the\r
- // same parent component!\r
+ // Be careful not to create more than one instance of this class!\r
jassertfalse;\r
}\r
}\r
auto now = Time::getApproximateMillisecondCounter();\r
\r
auto* newComp = mouseSource.isTouch() ? nullptr : mouseSource.getComponentUnderMouse();\r
- auto* parent = getParentComponent();\r
+ auto newTip = newComp != nullptr ? getTipFor (*newComp) : String();\r
+ bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
+ lastComponentUnderMouse = newComp;\r
+ lastTipUnderMouse = newTip;\r
\r
- if (newComp == nullptr || parent == nullptr || parent == newComp || parent->isParentOf (newComp))\r
- {\r
- auto newTip = newComp != nullptr ? getTipFor (*newComp) : String();\r
- bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
- lastComponentUnderMouse = newComp;\r
- lastTipUnderMouse = newTip;\r
-\r
- auto clickCount = desktop.getMouseButtonClickCounter();\r
- auto wheelCount = desktop.getMouseWheelMoveCounter();\r
- bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves);\r
- mouseClicks = clickCount;\r
- mouseWheelMoves = wheelCount;\r
+ auto clickCount = desktop.getMouseButtonClickCounter();\r
+ auto wheelCount = desktop.getMouseWheelMoveCounter();\r
+ bool mouseWasClicked = (clickCount > mouseClicks || wheelCount > mouseWheelMoves);\r
+ mouseClicks = clickCount;\r
+ mouseWheelMoves = wheelCount;\r
\r
- auto mousePos = mouseSource.getScreenPosition();\r
- bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12;\r
- lastMousePos = mousePos;\r
+ auto mousePos = mouseSource.getScreenPosition();\r
+ bool mouseMovedQuickly = mousePos.getDistanceFrom (lastMousePos) > 12;\r
+ lastMousePos = mousePos;\r
\r
- if (tipChanged || mouseWasClicked || mouseMovedQuickly)\r
- lastCompChangeTime = now;\r
+ if (tipChanged || mouseWasClicked || mouseMovedQuickly)\r
+ lastCompChangeTime = now;\r
\r
- if (isVisible() || now < lastHideTime + 500)\r
+ if (isVisible() || now < lastHideTime + 500)\r
+ {\r
+ // if a tip is currently visible (or has just disappeared), update to a new one\r
+ // immediately if needed..\r
+ if (newComp == nullptr || mouseWasClicked || newTip.isEmpty())\r
{\r
- // if a tip is currently visible (or has just disappeared), update to a new one\r
- // immediately if needed..\r
- if (newComp == nullptr || mouseWasClicked || newTip.isEmpty())\r
+ if (isVisible())\r
{\r
- if (isVisible())\r
- {\r
- lastHideTime = now;\r
- hideTip();\r
- }\r
- }\r
- else if (tipChanged)\r
- {\r
- displayTip (mousePos.roundToInt(), newTip);\r
+ lastHideTime = now;\r
+ hideTip();\r
}\r
}\r
- else\r
+ else if (tipChanged)\r
{\r
- // if there isn't currently a tip, but one is needed, only let it\r
- // appear after a timeout..\r
- if (newTip.isNotEmpty()\r
- && newTip != tipShowing\r
- && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears)\r
- {\r
- displayTip (mousePos.roundToInt(), newTip);\r
- }\r
+ displayTip (mousePos.roundToInt(), newTip);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // if there isn't currently a tip, but one is needed, only let it\r
+ // appear after a timeout..\r
+ if (newTip.isNotEmpty()\r
+ && newTip != tipShowing\r
+ && now > lastCompChangeTime + (uint32) millisecondsBeforeTipAppears)\r
+ {\r
+ displayTip (mousePos.roundToInt(), newTip);\r
}\r
}\r
}\r
A window that displays a pop-up tooltip when the mouse hovers over another component.\r
\r
To enable tooltips in your app, just create a single instance of a TooltipWindow\r
- object. Note that if you instantiate more than one instance of this class with the\r
- same parentComponent (even if both TooltipWindow's parentComponent is nil), you'll\r
- end up with multiple tooltips being shown! To avoid this use a SharedResourcePointer\r
- to instantiate the TooltipWindow only once.\r
-\r
- For audio plug-ins (which should not be opening native windows) it is better\r
- to add a TooltipWindow as a member variable to the editor and ensure that the\r
- editor is the parentComponent of your TooltipWindow. This will ensure that your\r
- TooltipWindow is scaled according to your editor and the DAWs scaling setting.\r
+ object. Note that if you instantiate more than one instance of this class, you'll\r
+ end up with multiple tooltips being shown! This is a common problem when compiling\r
+ audio plug-ins with JUCE: depending on the way you instantiate TooltipWindow,\r
+ you may end up with a TooltipWindow for each plug-in instance. To avoid this use a\r
+ SharedResourcePointer to instantiate the TooltipWindow only once.\r
\r
The TooltipWindow object will then stay invisible, waiting until the mouse\r
hovers for the specified length of time - it will then see if it's currently\r
break;\r
}\r
\r
- for (int i = 0; k[i] != nullptr; ++i)\r
+ for (int i = 0; k[i] != 0; ++i)\r
if (token.compare (CharPointer_ASCII (k[i])) == 0)\r
return true;\r
\r
}\r
\r
//==============================================================================\r
-void CodeDocument::addListener (CodeDocument::Listener* l) { listeners.add (l); }\r
-void CodeDocument::removeListener (CodeDocument::Listener* l) { listeners.remove (l); }\r
+void CodeDocument::addListener (CodeDocument::Listener* l) noexcept { listeners.add (l); }\r
+void CodeDocument::removeListener (CodeDocument::Listener* l) noexcept { listeners.remove (l); }\r
\r
//==============================================================================\r
struct CodeDocument::InsertAction : public UndoableAction\r
If the listener is already registered, this method has no effect.\r
@see removeListener\r
*/\r
- void addListener (Listener* listener);\r
+ void addListener (Listener* listener) noexcept;\r
\r
/** Deregisters a listener.\r
@see addListener\r
*/\r
- void removeListener (Listener* listener);\r
+ void removeListener (Listener* listener) noexcept;\r
\r
//==============================================================================\r
/** Iterates the text in a CodeDocument.\r
ApplicationCommandManager* appCommandManager = nullptr;\r
\r
class Pimpl;\r
+ friend class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
class GutterComponent;\r
+ friend class GutterComponent;\r
+ friend struct ContainerDeletePolicy<GutterComponent>;\r
std::unique_ptr<GutterComponent> gutter;\r
\r
enum DragType\r
break;\r
}\r
\r
- for (int i = 0; k[i] != nullptr; ++i)\r
+ for (int i = 0; k[i] != 0; ++i)\r
if (token.compare (CharPointer_ASCII (k[i])) == 0)\r
return true;\r
\r
\r
private:\r
class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> control;\r
bool mouseEventsAllowed = true;\r
\r
The view will be retained and released by this component for as long as\r
it is needed. To remove the current view, just call setView (nullptr).\r
\r
- Note: A void* is used here to avoid including the cocoa headers as\r
+ Note: a void* is used here to avoid including the cocoa headers as\r
part of the juce.h, but the method expects an NSView*.\r
*/\r
void setView (void* nsView);\r
\r
/** Returns the current NSView.\r
\r
- Note: A void* is returned here to avoid the needing to include the cocoa\r
+ Note: a void* is returned here to avoid the needing to include the cocoa\r
headers, so you should just cast the return value to an NSView*.\r
*/\r
void* getView() const;\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2017 - ROLI Ltd.\r
-\r
- JUCE is an open source library subject to commercial or open-source\r
- licensing.\r
-\r
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
- 27th April 2017).\r
-\r
- End User License Agreement: www.juce.com/juce-5-licence\r
- Privacy Policy: www.juce.com/juce-5-privacy-policy\r
-\r
- Or: You may also use this code under the terms of the GPL v3 (see\r
- www.gnu.org/licenses).\r
-\r
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
- DISCLAIMED.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#if (JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE) || DOXYGEN\r
-\r
-//==============================================================================\r
-/**\r
- A Windows-specific class that temporarily sets the DPI awareness context of\r
- the current thread to be DPI unaware and resets it to the previous context\r
- when it goes out of scope.\r
-\r
- If you create one of these before creating a top-level window, the window\r
- will be DPI unaware and bitmap strectched by the OS on a display with >100%\r
- scaling.\r
-\r
- You shouldn't use this unless you really know what you are doing and\r
- are dealing with native HWNDs.\r
-*/\r
-class JUCE_API ScopedDPIAwarenessDisabler\r
-{\r
-public:\r
- ScopedDPIAwarenessDisabler();\r
- ~ScopedDPIAwarenessDisabler();\r
-\r
-private:\r
- void* previousContext = nullptr;\r
-};\r
-#endif\r
-\r
-} // namespace juce\r
The view will be retained and released by this component for as long as\r
it is needed. To remove the current view, just call setView (nullptr).\r
\r
- Note: A void* is used here to avoid including the cocoa headers as\r
+ Note: a void* is used here to avoid including the cocoa headers as\r
part of the juce.h, but the method expects an UIView*.\r
*/\r
void setView (void* uiView);\r
\r
/** Returns the current UIView.\r
\r
- Note: A void* is returned here to avoid the needing to include the cocoa\r
+ Note: a void* is returned here to avoid the needing to include the cocoa\r
headers, so you should just cast the return value to an UIView*.\r
*/\r
void* getView() const;\r
\r
private:\r
class Pimpl;\r
+ friend class Pimpl;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIViewComponent)\r
friend unsigned long juce_getCurrentFocusWindow (ComponentPeer*);\r
\r
class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
};\r
\r
#include <unistd.h>\r
#include <fcntl.h>\r
#include <sys/wait.h>\r
-\r
- #if JUCE_GCC && __GNUC__ > 7\r
- #pragma GCC diagnostic push\r
- #pragma GCC diagnostic ignored "-Wparentheses"\r
- #endif\r
-\r
#include <gtk/gtk.h>\r
-\r
- #if JUCE_GCC && __GNUC__ > 7\r
- #pragma GCC diagnostic pop\r
- #endif\r
-\r
#include <gtk/gtkx.h>\r
#include <glib-unix.h>\r
#include <webkit2/webkit2.h>\r
\r
ID: juce_gui_extra\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE extended GUI classes\r
description: Miscellaneous GUI classes for specialised tasks.\r
website: http://www.juce.com/juce\r
#endif\r
\r
/** Config: JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
- This lets you turn on the JUCE_ENABLE_LIVE_CONSTANT_EDITOR support (desktop only). By default\r
- this will be enabled for debug builds and disabled for release builds. See the documentation\r
+ This lets you turn on the JUCE_ENABLE_LIVE_CONSTANT_EDITOR support. See the documentation\r
for that macro for more details.\r
*/\r
#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR\r
- #if JUCE_DEBUG && ! (JUCE_IOS || JUCE_ANDROID)\r
+ #if JUCE_DEBUG\r
#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 1\r
#endif\r
#endif\r
#include "embedding/juce_NSViewComponent.h"\r
#include "embedding/juce_UIViewComponent.h"\r
#include "embedding/juce_XEmbedComponent.h"\r
-#include "embedding/juce_ScopedDPIAwarenessDisabler.h"\r
#include "misc/juce_AppleRemote.h"\r
#include "misc/juce_BubbleMessageComponent.h"\r
#include "misc/juce_ColourSelector.h"\r
namespace juce\r
{\r
\r
-struct ColourComponentSlider : public Slider\r
+class ColourSelector::ColourComponentSlider : public Slider\r
{\r
- ColourComponentSlider (const String& name) : Slider (name)\r
+public:\r
+ ColourComponentSlider (const String& name)\r
+ : Slider (name)\r
{\r
setRange (0.0, 255.0, 1.0);\r
}\r
\r
- String getTextFromValue (double value) override\r
+ String getTextFromValue (double value)\r
{\r
return String::toHexString ((int) value).toUpperCase().paddedLeft ('0', 2);\r
}\r
\r
- double getValueFromText (const String& text) override\r
+ double getValueFromText (const String& text)\r
{\r
return (double) text.getHexValue32();\r
}\r
+\r
+ JUCE_DECLARE_NON_COPYABLE (ColourComponentSlider)\r
+};\r
+\r
+//==============================================================================\r
+class ColourSelector::ColourSpaceMarker : public Component\r
+{\r
+public:\r
+ ColourSpaceMarker()\r
+ {\r
+ setInterceptsMouseClicks (false, false);\r
+ }\r
+\r
+ void paint (Graphics& g) override\r
+ {\r
+ g.setColour (Colour::greyLevel (0.1f));\r
+ g.drawEllipse (1.0f, 1.0f, getWidth() - 2.0f, getHeight() - 2.0f, 1.0f);\r
+ g.setColour (Colour::greyLevel (0.9f));\r
+ g.drawEllipse (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, 1.0f);\r
+ }\r
+\r
+ JUCE_DECLARE_NON_COPYABLE (ColourSpaceMarker)\r
};\r
\r
//==============================================================================\r
{\r
public:\r
ColourSpaceView (ColourSelector& cs, float& hue, float& sat, float& val, int edgeSize)\r
- : owner (cs), h (hue), s (sat), v (val), edge (edgeSize)\r
+ : owner (cs), h (hue), s (sat), v (val), lastHue (0.0f), edge (edgeSize)\r
{\r
addAndMakeVisible (marker);\r
setMouseCursor (MouseCursor::CrosshairCursor);\r
if (lastHue != h)\r
{\r
lastHue = h;\r
- colours = {};\r
+ colours = Image();\r
repaint();\r
}\r
\r
\r
void resized() override\r
{\r
- colours = {};\r
+ colours = Image();\r
updateMarker();\r
}\r
\r
float& h;\r
float& s;\r
float& v;\r
- float lastHue = 0;\r
+ float lastHue;\r
+ ColourSpaceMarker marker;\r
const int edge;\r
Image colours;\r
\r
- struct ColourSpaceMarker : public Component\r
+ void updateMarker()\r
{\r
- ColourSpaceMarker()\r
- {\r
- setInterceptsMouseClicks (false, false);\r
- }\r
+ marker.setBounds (roundToInt ((getWidth() - edge * 2) * s),\r
+ roundToInt ((getHeight() - edge * 2) * (1.0f - v)),\r
+ edge * 2, edge * 2);\r
+ }\r
\r
- void paint (Graphics& g) override\r
- {\r
- g.setColour (Colour::greyLevel (0.1f));\r
- g.drawEllipse (1.0f, 1.0f, getWidth() - 2.0f, getHeight() - 2.0f, 1.0f);\r
- g.setColour (Colour::greyLevel (0.9f));\r
- g.drawEllipse (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, 1.0f);\r
- }\r
- };\r
+ JUCE_DECLARE_NON_COPYABLE (ColourSpaceView)\r
+};\r
\r
- ColourSpaceMarker marker;\r
+//==============================================================================\r
+class ColourSelector::HueSelectorMarker : public Component\r
+{\r
+public:\r
+ HueSelectorMarker()\r
+ {\r
+ setInterceptsMouseClicks (false, false);\r
+ }\r
\r
- void updateMarker()\r
+ void paint (Graphics& g) override\r
{\r
- auto markerSize = jmax (14, edge * 2);\r
- auto area = getLocalBounds().reduced (edge);\r
+ auto cw = (float) getWidth();\r
+ auto ch = (float) getHeight();\r
+\r
+ Path p;\r
+ p.addTriangle (1.0f, 1.0f,\r
+ cw * 0.3f, ch * 0.5f,\r
+ 1.0f, ch - 1.0f);\r
+\r
+ p.addTriangle (cw - 1.0f, 1.0f,\r
+ cw * 0.7f, ch * 0.5f,\r
+ cw - 1.0f, ch - 1.0f);\r
\r
- marker.setBounds (Rectangle<int> (markerSize, markerSize)\r
- .withCentre (area.getRelativePoint (s, 1.0f - v)));\r
+ g.setColour (Colours::white.withAlpha (0.75f));\r
+ g.fillPath (p);\r
+\r
+ g.setColour (Colours::black.withAlpha (0.75f));\r
+ g.strokePath (p, PathStrokeType (1.2f));\r
}\r
\r
- JUCE_DECLARE_NON_COPYABLE (ColourSpaceView)\r
+private:\r
+ JUCE_DECLARE_NON_COPYABLE (HueSelectorMarker)\r
};\r
\r
//==============================================================================\r
\r
void resized() override\r
{\r
- auto markerSize = jmax (14, edge * 2);\r
- auto area = getLocalBounds().reduced (edge);\r
-\r
- marker.setBounds (Rectangle<int> (getWidth(), markerSize)\r
- .withCentre (area.getRelativePoint (0.5f, h)));\r
+ marker.setBounds (0, roundToInt ((getHeight() - edge * 2) * h), getWidth(), edge * 2);\r
}\r
\r
void mouseDown (const MouseEvent& e) override\r
private:\r
ColourSelector& owner;\r
float& h;\r
- const int edge;\r
-\r
- struct HueSelectorMarker : public Component\r
- {\r
- HueSelectorMarker()\r
- {\r
- setInterceptsMouseClicks (false, false);\r
- }\r
-\r
- void paint (Graphics& g) override\r
- {\r
- auto cw = (float) getWidth();\r
- auto ch = (float) getHeight();\r
-\r
- Path p;\r
- p.addTriangle (1.0f, 1.0f,\r
- cw * 0.3f, ch * 0.5f,\r
- 1.0f, ch - 1.0f);\r
-\r
- p.addTriangle (cw - 1.0f, 1.0f,\r
- cw * 0.7f, ch * 0.5f,\r
- cw - 1.0f, ch - 1.0f);\r
-\r
- g.setColour (Colours::white.withAlpha (0.75f));\r
- g.fillPath (p);\r
-\r
- g.setColour (Colours::black.withAlpha (0.75f));\r
- g.strokePath (p, PathStrokeType (1.2f));\r
- }\r
- };\r
-\r
HueSelectorMarker marker;\r
+ const int edge;\r
\r
JUCE_DECLARE_NON_COPYABLE (HueSelectorComp)\r
};\r
{\r
if (comp != nullptr)\r
{\r
- if (result == 1) comp->setColourFromSwatch();\r
- if (result == 2) comp->setSwatchFromColour();\r
+ if (result == 1)\r
+ comp->setColourFromSwatch();\r
+ else if (result == 2)\r
+ comp->setSwatchFromColour();\r
}\r
}\r
\r
\r
sliders[3]->setVisible ((flags & showAlphaChannel) != 0);\r
\r
- for (auto& slider : sliders)\r
- { // braces needed here to avoid a VS2013 compiler bug\r
- slider->onValueChange = [this] { changeColour(); };\r
- }\r
+ for (int i = 4; --i >= 0;)\r
+ sliders[i]->onValueChange = [this] { changeColour(); };\r
}\r
\r
if ((flags & showColourspace) != 0)\r
{\r
colourSpace.reset (new ColourSpaceView (*this, h, s, v, gapAroundColourSpaceComponent));\r
- hueSelector.reset (new HueSelectorComp (*this, h, gapAroundColourSpaceComponent));\r
+ hueSelector.reset (new HueSelectorComp (*this, h, gapAroundColourSpaceComponent));\r
\r
addAndMakeVisible (colourSpace.get());\r
addAndMakeVisible (hueSelector.get());\r
g.setColour (findColour (labelTextColourId));\r
g.setFont (11.0f);\r
\r
- for (auto& slider : sliders)\r
+ for (int i = 4; --i >= 0;)\r
{\r
- if (slider->isVisible())\r
- g.drawText (slider->getName() + ":",\r
- 0, slider->getY(),\r
- slider->getX() - 8, slider->getHeight(),\r
+ if (sliders[i]->isVisible())\r
+ g.drawText (sliders[i]->getName() + ":",\r
+ 0, sliders[i]->getY(),\r
+ sliders[i]->getX() - 8, sliders[i]->getHeight(),\r
Justification::centredRight, false);\r
}\r
}\r
labelTextColourId = 0x1007001 /**< the colour used for the labels next to the sliders. */\r
};\r
\r
- //==============================================================================\r
- // These need to be public otherwise the Projucer's live-build engine will complain\r
- class ColourSpaceView;\r
- class HueSelectorComp;\r
\r
private:\r
//==============================================================================\r
+ class ColourSpaceView;\r
+ class HueSelectorComp;\r
class SwatchComponent;\r
+ class ColourComponentSlider;\r
+ class ColourSpaceMarker;\r
+ class HueSelectorMarker;\r
+ friend class ColourSpaceView;\r
+ friend struct ContainerDeletePolicy<ColourSpaceView>;\r
+ friend class HueSelectorComp;\r
+ friend struct ContainerDeletePolicy<HueSelectorComp>;\r
\r
Colour colour;\r
float h, s, v;\r
class MappingItem;\r
class CategoryItem;\r
class ItemComponent;\r
+ friend class TopLevelItem;\r
+ friend struct ContainerDeletePolicy<ChangeKeyButton>;\r
+ friend struct ContainerDeletePolicy<TopLevelItem>;\r
std::unique_ptr<TopLevelItem> treeItem;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KeyMappingEditorComponent)\r
\r
void resized() override\r
{\r
- auto r = getLocalBounds().reduced (2, 0);\r
+ Rectangle<int> r (getLocalBounds().reduced (2, 0));\r
\r
for (int i = 0; i < editors.size(); ++i)\r
editors.getUnchecked(i)->setBounds (r.removeFromTop (itemHeight));\r
LiveValue<Type>& getValue (const char* file, int line, const Type& initialValue)\r
{\r
const ScopedLock sl (lock);\r
- using ValueType = LiveValue<Type>;\r
+ typedef LiveValue<Type> ValueType;\r
+\r
+ for (int i = 0; i < values.size(); ++i)\r
+ {\r
+ LiveValueBase* v = values.getUnchecked(i);\r
\r
- for (auto* v : values)\r
if (v->sourceLine == line && v->sourceFile == file)\r
return *static_cast<ValueType*> (v);\r
+ }\r
\r
- auto v = new ValueType (file, line, initialValue);\r
+ ValueType* v = new ValueType (file, line, initialValue);\r
addValue (v);\r
return *v;\r
}\r
OwnedArray<CodeDocument> documents;\r
Array<File> documentFiles;\r
class EditorWindow;\r
+ friend class EditorWindow;\r
+ friend struct ContainerDeletePolicy<EditorWindow>;\r
Component::SafePointer<EditorWindow> editorWindow;\r
CriticalSection lock;\r
\r
file, then the URL should be "sounds/my_sound.caf".\r
\r
For a custom sound on Android, set URL to the name of a raw resource file\r
- (without an extension) that was included when exporting an Android project in\r
+ (without an extention) that was included when exporting an Android project in\r
Projucer (see "Extra Android Raw Resources" setting). */\r
\r
var properties; /**< Optional: collection of additional properties that may be passed as a dictionary. */\r
*/\r
struct Category\r
{\r
- juce::String identifier; /**< unique identifier */\r
+ juce::String identifier; /**< unique indentifier */\r
juce::Array<Action> actions; /**< optional list of actions within this category */\r
bool sendDismissAction = false; /**< whether dismiss action will be sent to the app (from iOS 10 only) */\r
};\r
notification was received when the app was in the foreground already. On iOS 10 it will be\r
called when a user presses on a notification\r
\r
- Note: On Android, if remote notification was received while the app was in the background and\r
+ Note: on Android, if remote notification was received while the app was in the background and\r
then user pressed on it, the notification object received in this callback will contain only\r
"properties" member set. Hence, if you want to know what was the notification title, content\r
etc, you need to set them as additional properties, so that you will be able to restore them\r
// from the recent list, so we clear them all and add them back excluding\r
// the specified file\r
\r
- auto sharedDocController = [NSDocumentController sharedDocumentController];\r
- auto recentDocumentURLs = [sharedDocController recentDocumentURLs];\r
+ auto* sharedDocController = [NSDocumentController sharedDocumentController];\r
+ auto* recentDocumentURLs = [sharedDocController recentDocumentURLs];\r
\r
[sharedDocController clearRecentDocuments: nil];\r
\r
auto* nsFile = createNSURLFromFile (file);\r
\r
- auto reverseEnumerator = [recentDocumentURLs reverseObjectEnumerator];\r
+ auto* reverseEnumerator = [recentDocumentURLs reverseObjectEnumerator];\r
\r
for (NSURL* url : reverseEnumerator)\r
if (! [url isEqual:nsFile])\r
if (embedAsSiblingRatherThanChild)\r
{\r
// This is a workaround for a bug in a web browser component where\r
- // scrolling would be very slow and occasionally would scroll in\r
+ // scrolling would be very slow and occassionally would scroll in\r
// opposite direction to dragging direction. In normal circumstances,\r
// the native view should be a child of peerView instead.\r
auto parentView = LocalRef<jobject> (env->CallObjectMethod (peerView, AndroidView.getParent));\r
namespace juce\r
{\r
\r
+#if __ANDROID_API__ >= 21\r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
+ METHOD (build, "build", "()Landroid/media/AudioAttributes;") \\r
+ METHOD (constructor, "<init>", "()V") \\r
+ METHOD (setContentType, "setContentType", "(I)Landroid/media/AudioAttributes$Builder;") \\r
+ METHOD (setUsage, "setUsage", "(I)Landroid/media/AudioAttributes$Builder;")\r
+\r
+DECLARE_JNI_CLASS (AudioAttributesBuilder, "android/media/AudioAttributes$Builder")\r
+#undef JNI_CLASS_MEMBERS\r
+#endif\r
+\r
#if __ANDROID_API__ >= 26\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(Ljava/lang/String;Ljava/lang/CharSequence;I)V") \\r
METHOD (setSound, "setSound", "(Landroid/net/Uri;Landroid/media/AudioAttributes;)V") \\r
METHOD (setVibrationPattern, "setVibrationPattern", "([J)V")\r
\r
-DECLARE_JNI_CLASS (NotificationChannel, "android/app/NotificationChannel")\r
+DECLARE_JNI_CLASS (NotificationChannel, "android/app/NotificationChannel");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(Ljava/lang/String;Ljava/lang/CharSequence;)V")\r
\r
-DECLARE_JNI_CLASS (NotificationChannelGroup, "android/app/NotificationChannelGroup")\r
+DECLARE_JNI_CLASS (NotificationChannelGroup, "android/app/NotificationChannelGroup");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
FIELD (extras, "extras", "Landroid/os/Bundle;")\r
\r
-DECLARE_JNI_CLASS (AndroidNotification, "android/app/Notification")\r
+DECLARE_JNI_CLASS (AndroidNotification, "android/app/Notification");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (constructor, "<init>", "(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V") \\r
METHOD (build, "build", "()Landroid/app/Notification$Action;")\r
\r
-DECLARE_JNI_CLASS (NotificationActionBuilder, "android/app/Notification$Action$Builder")\r
+DECLARE_JNI_CLASS (NotificationActionBuilder, "android/app/Notification$Action$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (setVibrate, "setVibrate", "([J)Landroid/app/Notification$Builder;") \\r
METHOD (setWhen, "setWhen", "(J)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderBase, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderBase, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
\r
#if __ANDROID_API__ >= 16\r
METHOD (setSubText, "setSubText", "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;") \\r
METHOD (setUsesChronometer, "setUsesChronometer", "(Z)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi16, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi16, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setShowWhen, "setShowWhen", "(Z)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi17, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi17, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (setGroupSummary, "setGroupSummary", "(Z)Landroid/app/Notification$Builder;") \\r
METHOD (setSortKey, "setSortKey", "(Ljava/lang/String;)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi20, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi20, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (setPublicVersion, "setPublicVersion", "(Landroid/app/Notification;)Landroid/app/Notification$Builder;") \\r
METHOD (setVisibility, "setVisibility", "(I)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi21, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi21, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setChronometerCountDown, "setChronometerCountDown", "(Z)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi24, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi24, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (setGroupAlertBehavior, "setGroupAlertBehavior", "(I)Landroid/app/Notification$Builder;") \\r
METHOD (setTimeoutAfter, "setTimeoutAfter", "(J)Landroid/app/Notification$Builder;")\r
\r
-DECLARE_JNI_CLASS (NotificationBuilderApi26, "android/app/Notification$Builder")\r
+DECLARE_JNI_CLASS (NotificationBuilderApi26, "android/app/Notification$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (cancelAll, "cancelAll", "()V") \\r
METHOD (notify, "notify", "(Ljava/lang/String;ILandroid/app/Notification;)V")\r
\r
-DECLARE_JNI_CLASS (NotificationManagerBase, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerBase, "android/app/NotificationManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
#if __ANDROID_API__ >= 23\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getActiveNotifications, "getActiveNotifications", "()[Landroid/service/notification/StatusBarNotification;")\r
\r
-DECLARE_JNI_CLASS (NotificationManagerApi23, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi23, "android/app/NotificationManager");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (areNotificationsEnabled, "areNotificationsEnabled", "()Z")\r
\r
-DECLARE_JNI_CLASS (NotificationManagerApi24, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi24, "android/app/NotificationManager");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (createNotificationChannel, "createNotificationChannel", "(Landroid/app/NotificationChannel;)V") \\r
METHOD (createNotificationChannelGroup, "createNotificationChannelGroup", "(Landroid/app/NotificationChannelGroup;)V")\r
\r
-DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager")\r
+DECLARE_JNI_CLASS (NotificationManagerApi26, "android/app/NotificationManager");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (getResultsFromIntent, "getResultsFromIntent", "(Landroid/content/Intent;)Landroid/os/Bundle;")\r
\r
-DECLARE_JNI_CLASS (RemoteInput, "android/app/RemoteInput")\r
+DECLARE_JNI_CLASS (RemoteInput, "android/app/RemoteInput");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setChoices, "setChoices", "([Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;") \\r
METHOD (setLabel, "setLabel", "(Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;")\r
\r
-DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder")\r
+DECLARE_JNI_CLASS (RemoteInputBuilder, "android/app/RemoteInput$Builder");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getNotification, "getNotification", "()Landroid/app/Notification;")\r
\r
- DECLARE_JNI_CLASS (StatusBarNotification, "android/service/notification/StatusBarNotification")\r
+ DECLARE_JNI_CLASS (StatusBarNotification, "android/service/notification/StatusBarNotification");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
STATICMETHOD (getInstance, "getInstance", "()Lcom/google/firebase/iid/FirebaseInstanceId;") \\r
METHOD (getToken, "getToken", "()Ljava/lang/String;")\r
\r
- DECLARE_JNI_CLASS (FirebaseInstanceId, "com/google/firebase/iid/FirebaseInstanceId")\r
+ DECLARE_JNI_CLASS (FirebaseInstanceId, "com/google/firebase/iid/FirebaseInstanceId");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
METHOD (subscribeToTopic, "subscribeToTopic", "(Ljava/lang/String;)V") \\r
METHOD (unsubscribeFromTopic, "unsubscribeFromTopic", "(Ljava/lang/String;)V") \\r
\r
- DECLARE_JNI_CLASS (FirebaseMessaging, "com/google/firebase/messaging/FirebaseMessaging")\r
+ DECLARE_JNI_CLASS (FirebaseMessaging, "com/google/firebase/messaging/FirebaseMessaging");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getTo, "getTo", "()Ljava/lang/String;") \\r
METHOD (getTtl, "getTtl", "()I")\r
\r
- DECLARE_JNI_CLASS (RemoteMessage, "com/google/firebase/messaging/RemoteMessage")\r
+ DECLARE_JNI_CLASS (RemoteMessage, "com/google/firebase/messaging/RemoteMessage");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setMessageType, "setMessageType", "(Ljava/lang/String;)Lcom/google/firebase/messaging/RemoteMessage$Builder;") \\r
METHOD (setTtl, "setTtl", "(I)Lcom/google/firebase/messaging/RemoteMessage$Builder;")\r
\r
- DECLARE_JNI_CLASS (RemoteMessageBuilder, "com/google/firebase/messaging/RemoteMessage$Builder")\r
+ DECLARE_JNI_CLASS (RemoteMessageBuilder, "com/google/firebase/messaging/RemoteMessage$Builder");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getTitleLocalizationArgs, "getTitleLocalizationArgs", "()[Ljava/lang/String;") \\r
METHOD (getTitleLocalizationKey, "getTitleLocalizationKey", "()Ljava/lang/String;")\r
\r
- DECLARE_JNI_CLASS (RemoteMessageNotification, "com/google/firebase/messaging/RemoteMessage$Notification")\r
+ DECLARE_JNI_CLASS (RemoteMessageNotification, "com/google/firebase/messaging/RemoteMessage$Notification");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
\r
if (remoteInputResult.get() != 0)\r
{\r
- auto charSequence = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, AndroidBundle.getCharSequence, resultKeyString.get()));\r
+ auto charSequence = LocalRef<jobject> (env->CallObjectMethod (remoteInputResult, JavaBundle.getCharSequence, resultKeyString.get()));\r
auto responseStringRef = LocalRef<jstring> ((jstring) env->CallObjectMethod (charSequence, JavaCharSequence.toString));\r
responseString = juceString (responseStringRef.get());\r
}\r
{\r
auto* env = getEnv();\r
\r
- auto bundle = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
-\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("identifier") .get(), javaString (n.identifier).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("title") .get(), javaString (n.title).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("body") .get(), javaString (n.body).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("subtitle") .get(), javaString (n.subtitle).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("badgeNumber") .get(), n.badgeNumber);\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("soundToPlay") .get(), javaString (n.soundToPlay.toString (true)).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putBundle, javaString ("properties") .get(), varToBundleWithPropertiesString (n.properties).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("icon") .get(), javaString (n.icon).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("channelId") .get(), javaString (n.channelId).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("tickerText") .get(), javaString (n.tickerText).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("progressMax") .get(), n.progress.max);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("progressCurrent") .get(), n.progress.current);\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("progressIndeterminate") .get(), n.progress.indeterminate);\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("person") .get(), javaString (n.person).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("type") .get(), n.type);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("priority") .get(), n.priority);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("lockScreenAppearance") .get(), n.lockScreenAppearance);\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("groupId") .get(), javaString (n.groupId).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("groupSortKey") .get(), javaString (n.groupSortKey).get());\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("groupSummary") .get(), n.groupSummary);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("accentColour") .get(), n.accentColour.getARGB());\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("ledColour") .get(), n.ledColour.getARGB());\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("shouldAutoCancel") .get(), n.shouldAutoCancel);\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("localOnly") .get(), n.localOnly);\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("ongoing") .get(), n.ongoing);\r
- env->CallVoidMethod (bundle, AndroidBundle.putBoolean, javaString ("alertOnlyOnce") .get(), n.alertOnlyOnce);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("timestampVisibility") .get(), n.timestampVisibility);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("badgeIconType") .get(), n.badgeIconType);\r
- env->CallVoidMethod (bundle, AndroidBundle.putInt, javaString ("groupAlertBehaviour") .get(), n.groupAlertBehaviour);\r
- env->CallVoidMethod (bundle, AndroidBundle.putLong, javaString ("timeoutAfterMs") .get(), (jlong)n.timeoutAfterMs);\r
+ auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
+\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("identifier") .get(), javaString (n.identifier).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("title") .get(), javaString (n.title).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("body") .get(), javaString (n.body).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("subtitle") .get(), javaString (n.subtitle).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("badgeNumber") .get(), n.badgeNumber);\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("soundToPlay") .get(), javaString (n.soundToPlay.toString (true)).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putBundle, javaString ("properties") .get(), varToBundleWithPropertiesString (n.properties).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("icon") .get(), javaString (n.icon).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("channelId") .get(), javaString (n.channelId).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("tickerText") .get(), javaString (n.tickerText).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("progressMax") .get(), n.progress.max);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("progressCurrent") .get(), n.progress.current);\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("progressIndeterminate") .get(), n.progress.indeterminate);\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("person") .get(), javaString (n.person).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("type") .get(), n.type);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("priority") .get(), n.priority);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("lockScreenAppearance") .get(), n.lockScreenAppearance);\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("groupId") .get(), javaString (n.groupId).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("groupSortKey") .get(), javaString (n.groupSortKey).get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("groupSummary") .get(), n.groupSummary);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("accentColour") .get(), n.accentColour.getARGB());\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledColour") .get(), n.ledColour.getARGB());\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledBlinkPatternMsToBeOn") .get(), n.ledBlinkPattern.msToBeOn);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("ledBlinkPatternMsToBeOff").get(), n.ledBlinkPattern.msToBeOff);\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("shouldAutoCancel") .get(), n.shouldAutoCancel);\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("localOnly") .get(), n.localOnly);\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("ongoing") .get(), n.ongoing);\r
+ env->CallVoidMethod (bundle, JavaBundle.putBoolean, javaString ("alertOnlyOnce") .get(), n.alertOnlyOnce);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("timestampVisibility") .get(), n.timestampVisibility);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("badgeIconType") .get(), n.badgeIconType);\r
+ env->CallVoidMethod (bundle, JavaBundle.putInt, javaString ("groupAlertBehaviour") .get(), n.groupAlertBehaviour);\r
+ env->CallVoidMethod (bundle, JavaBundle.putLong, javaString ("timeoutAfterMs") .get(), (jlong)n.timeoutAfterMs);\r
\r
const int size = n.vibrationPattern.size();\r
\r
elements[i] = (jlong) n.vibrationPattern[i];\r
\r
env->SetLongArrayRegion (array, 0, size, elements);\r
- env->CallVoidMethod (bundle, AndroidBundle.putLongArray, javaString ("vibrationPattern").get(), array.get());\r
+ env->CallVoidMethod (bundle, JavaBundle.putLongArray, javaString ("vibrationPattern").get(), array.get());\r
}\r
\r
return bundle;\r
\r
env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.setLocalOnly, n.localOnly);\r
\r
- auto extras = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+ auto extras = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
\r
- env->CallVoidMethod (extras, AndroidBundle.putBundle, javaString ("notificationData").get(),\r
+ env->CallVoidMethod (extras, JavaBundle.putBundle, javaString ("notificationData").get(),\r
juceNotificationToBundle (n).get());\r
\r
env->CallObjectMethod (notificationBuilder, NotificationBuilderApi20.addExtras, extras.get());\r
{\r
auto* env = getEnv();\r
\r
- auto bundle = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
- env->CallVoidMethod (bundle, AndroidBundle.putString, javaString ("properties").get(),\r
+ auto bundle = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
+ env->CallVoidMethod (bundle, JavaBundle.putString, javaString ("properties").get(),\r
javaString (JSON::toString (varToParse, false)).get());\r
\r
return bundle;\r
{\r
auto* env = getEnv();\r
\r
- auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, AndroidBundle.getString,\r
+ auto varString = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString,\r
javaString ("properties").get()));\r
\r
var resultVar;\r
JSON::parse (juceString (varString.get()), resultVar);\r
\r
- // Note: We are not checking if result of parsing was okay, because there may be no properties set at all.\r
+ // Note: we are not checking if result of parsing was okay, because there may be no properties set at all.\r
return resultVar;\r
}\r
\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
{\r
- auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, AndroidBundle.getString, keyString.get()));\r
+ auto value = LocalRef<jstring> ((jstring)env->CallObjectMethod (bundle, JavaBundle.getString, keyString.get()));\r
return juceString (value);\r
}\r
\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
- return env->CallIntMethod (bundle, AndroidBundle.getInt, keyString.get());\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+ return env->CallIntMethod (bundle, JavaBundle.getInt, keyString.get());\r
\r
return 0;\r
}\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
- return (int) env->CallLongMethod (bundle, AndroidBundle.getLong, keyString.get());\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+ return (int) env->CallLongMethod (bundle, JavaBundle.getLong, keyString.get());\r
\r
return 0;\r
}\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
{\r
- auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.getBundle, keyString.get()));\r
+ auto value = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.getBundle, keyString.get()));\r
return bundleWithPropertiesStringToVar (value);\r
}\r
\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
- return env->CallBooleanMethod (bundle, AndroidBundle.getBoolean, keyString.get());\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
+ return env->CallBooleanMethod (bundle, JavaBundle.getBoolean, keyString.get());\r
\r
return false;\r
}\r
{\r
auto keyString = javaString (key);\r
\r
- if (env->CallBooleanMethod (bundle, AndroidBundle.containsKey, keyString.get()))\r
+ if (env->CallBooleanMethod (bundle, JavaBundle.containsKey, keyString.get()))\r
{\r
- auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, AndroidBundle.getLongArray, keyString.get()));\r
+ auto array = LocalRef<jlongArray> ((jlongArray) env->CallObjectMethod (bundle, JavaBundle.getLongArray, keyString.get()));\r
\r
const int size = env->GetArrayLength (array.get());\r
\r
auto* env = getEnv();\r
\r
auto extras = LocalRef<jobject> (env->GetObjectField (notification, AndroidNotification.extras));\r
- auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, AndroidBundle.getBundle,\r
+ auto notificationData = LocalRef<jobject> (env->CallObjectMethod (extras, JavaBundle.getBundle,\r
javaString ("notificationData").get()));\r
\r
if (notificationData.get() != nullptr)\r
{\r
auto* env = getEnv();\r
\r
- auto keySet = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.keySet));\r
+ auto keySet = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.keySet));\r
auto iterator = LocalRef<jobject> (env->CallObjectMethod (keySet, JavaSet.iterator));\r
\r
DynamicObject::Ptr dynamicObject = new DynamicObject();\r
break;\r
\r
auto key = LocalRef<jstring> ((jstring) env->CallObjectMethod (iterator, JavaIterator.next));\r
- auto object = LocalRef<jobject> (env->CallObjectMethod (bundle, AndroidBundle.get, key.get()));\r
+ auto object = LocalRef<jobject> (env->CallObjectMethod (bundle, JavaBundle.get, key.get()));\r
\r
if (object.get() != nullptr)\r
{\r
auto objectClass = LocalRef<jobject> (env->CallObjectMethod (object, JavaObject.getClass));\r
auto classAsString = LocalRef<jstring> ((jstring) env->CallObjectMethod (objectClass, JavaClass.getName));\r
\r
- // Note: It seems that Firebase delivers values as strings always, so this check is rather unnecessary,\r
- // at least untill they change the behaviour.\r
+ // Note: seems that Firebase delivers values as strings always, so this check is rather unnecessary,\r
+ // at least till they change the behaviour.\r
var value = juceString (classAsString) == "java.lang.Bundle" ? bundleToVar (object) : var (juceString (objectAsString.get()));\r
dynamicObject->setProperty (juceString (key.get()), value);\r
}\r
}\r
}\r
\r
- return var (dynamicObject.get());\r
+ return var (dynamicObject);\r
}\r
\r
return {};\r
const uint8 b = (uint8) colourString.substring (4, 6).getIntValue();\r
n.accentColour = Colour (r, g, b);\r
\r
- // Note: Ignoring the icon, because Firebase passes it as a string.\r
+ // Note: ignoring icon, because Firebase passes it as a string.\r
\r
propertiesDynamicObject->setProperty ("clickAction", juceString (clickAction.get()));\r
propertiesDynamicObject->setProperty ("bodyLocalizationKey", juceString (bodyLocalizationKey.get()));\r
env->CallVoidMethod (channel, NotificationChannel.enableVibration, c.enableVibration);\r
}\r
\r
- LocalRef<jobject> builder (env->NewObject (AndroidAudioAttributesBuilder, AndroidAudioAttributesBuilder.constructor));\r
+ auto audioAttributesBuilder = LocalRef<jobject> (env->NewObject (AudioAttributesBuilder, AudioAttributesBuilder.constructor));\r
const int contentTypeSonification = 4;\r
const int usageNotification = 5;\r
- env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.setContentType, contentTypeSonification);\r
- env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.setUsage, usageNotification);\r
- auto audioAttributes = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAudioAttributesBuilder.build));\r
+ env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.setContentType, contentTypeSonification);\r
+ env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.setUsage, usageNotification);\r
+ auto audioAttributes = LocalRef<jobject> (env->CallObjectMethod (audioAttributesBuilder, AudioAttributesBuilder.build));\r
env->CallVoidMethod (channel, NotificationChannel.setSound, juceUrlToAndroidUri (c.soundToPlay).get(), audioAttributes.get());\r
\r
env->CallVoidMethod (notificationManager, NotificationManagerApi26.createNotificationChannel, channel.get());\r
if (extras == 0)\r
return false;\r
\r
- return env->CallBooleanMethod (extras, AndroidBundle.containsKey, javaString ("google.sent_time").get())\r
- && env->CallBooleanMethod (extras, AndroidBundle.containsKey, javaString ("google.message_id").get());\r
+ return env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.sent_time").get())\r
+ && env->CallBooleanMethod (extras, JavaBundle.containsKey, javaString ("google.message_id").get());\r
}\r
\r
PushNotifications& owner;\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "()V")\r
\r
-DECLARE_JNI_CLASS (AndroidWebChromeClient, "android/webkit/WebChromeClient")\r
+DECLARE_JNI_CLASS (AndroidWebChromeClient, "android/webkit/WebChromeClient");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "()V")\r
\r
-DECLARE_JNI_CLASS (AndroidWebViewClient, "android/webkit/WebViewClient")\r
+DECLARE_JNI_CLASS (AndroidWebViewClient, "android/webkit/WebViewClient");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (getInstance, "getInstance", "()Landroid/webkit/CookieManager;")\r
\r
-DECLARE_JNI_CLASS (AndroidCookieManager, "android/webkit/CookieManager")\r
+DECLARE_JNI_CLASS (AndroidCookieManager, "android/webkit/CookieManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
\r
-DECLARE_JNI_CLASS (JuceWebChromeClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebChromeClient")\r
+DECLARE_JNI_CLASS (JuceWebChromeClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebChromeClient");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
METHOD (hostDeleted, "hostDeleted", "()V")\r
\r
-DECLARE_JNI_CLASS (JuceWebViewClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebViewClient")\r
+DECLARE_JNI_CLASS (JuceWebViewClient, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceWebViewClient");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setJavaScriptEnabled, "setJavaScriptEnabled", "(Z)V") \\r
METHOD (setSupportMultipleWindows, "setSupportMultipleWindows", "(Z)V")\r
\r
-DECLARE_JNI_CLASS (WebSettings, "android/webkit/WebSettings")\r
+DECLARE_JNI_CLASS (WebSettings, "android/webkit/WebSettings");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
{\r
MemoryOutputStream ostream;\r
\r
- for (;;)\r
+ while (true)\r
{\r
if (threadShouldExit())\r
return;\r
\r
char buffer [8192];\r
- auto num = webInputStream->read (buffer, sizeof (buffer));\r
+ const int num = webInputStream->read (buffer, sizeof (buffer));\r
\r
if (num <= 0)\r
break;\r
{\r
if (iOSEarlierThan10)\r
{\r
- auto action = [[UIMutableUserNotificationAction alloc] init];\r
+ auto* action = [[UIMutableUserNotificationAction alloc] init];\r
\r
action.identifier = juceStringToNS (a.identifier);\r
action.title = juceStringToNS (a.title);\r
{\r
if (iOSEarlierThan10)\r
{\r
- auto category = [[UIMutableUserNotificationCategory alloc] init];\r
+ auto* category = [[UIMutableUserNotificationCategory alloc] init];\r
category.identifier = juceStringToNS (c.identifier);\r
\r
- auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+ auto* actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
\r
for (const auto& a : c.actions)\r
{\r
else\r
{\r
#if defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0\r
- auto actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
+ auto* actions = [NSMutableArray arrayWithCapacity: (NSUInteger) c.actions.size()];\r
\r
for (const auto& a : c.actions)\r
{\r
//==============================================================================\r
UILocalNotification* juceNotificationToUILocalNotification (const PushNotifications::Notification& n)\r
{\r
- auto notification = [[UILocalNotification alloc] init];\r
+ auto* notification = [[UILocalNotification alloc] init];\r
\r
notification.alertTitle = juceStringToNS (n.title);\r
notification.alertBody = juceStringToNS (n.body);\r
UNNotificationRequest* juceNotificationToUNNotificationRequest (const PushNotifications::Notification& n)\r
{\r
// content\r
- auto content = [[UNMutableNotificationContent alloc] init];\r
+ auto* content = [[UNMutableNotificationContent alloc] init];\r
\r
content.title = juceStringToNS (n.title);\r
content.subtitle = juceStringToNS (n.subtitle);\r
propsVarObject->setProperty (propertyName, properties.getValueAt (i));\r
}\r
\r
- return var (propsVarObject.get());\r
+ return var (propsVarObject);\r
}\r
\r
//==============================================================================\r
{\r
settings = settingsToUse;\r
\r
- auto categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
+ auto* categories = [NSMutableSet setWithCapacity: (NSUInteger) settings.categories.size()];\r
\r
if (iOSEarlierThan10)\r
{\r
\r
void tryNextRead()\r
{\r
- for (;;)\r
+ while (true)\r
{\r
size_t len = (receivingLength ? sizeof (size_t) : bufferLength.len);\r
\r
if (! params.isVoid())\r
obj->setProperty (getParamIdentifier(), params);\r
\r
- String json (JSON::toString (var (obj.get())));\r
+ String json (JSON::toString (var (obj)));\r
\r
size_t jsonLength = static_cast<size_t> (json.length());\r
size_t len = sizeof (size_t) + jsonLength;\r
\r
params->setProperty ("url", String (webkit_uri_request_get_uri (webkit_navigation_action_get_request (action))));\r
params->setProperty ("decision_id", (int64) decision);\r
- CommandReceiver::sendCommand (outChannel, "pageAboutToLoad", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "pageAboutToLoad", var (params));\r
\r
return true;\r
}\r
DynamicObject::Ptr params = new DynamicObject;\r
\r
params->setProperty ("url", String (webkit_uri_request_get_uri (webkit_navigation_action_get_request (action))));\r
- CommandReceiver::sendCommand (outChannel, "newWindowAttemptingToLoad", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "newWindowAttemptingToLoad", var (params));\r
\r
// never allow new windows\r
webkit_policy_decision_ignore (decision);\r
DynamicObject::Ptr params = new DynamicObject;\r
\r
params->setProperty ("url", String (webkit_web_view_get_uri (webview)));\r
- CommandReceiver::sendCommand (outChannel, "pageFinishedLoading", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "pageFinishedLoading", var (params));\r
}\r
}\r
\r
DynamicObject::Ptr params = new DynamicObject;\r
\r
params->setProperty ("error", String (error != nullptr ? error->message : "unknown error"));\r
- CommandReceiver::sendCommand (outChannel, "pageLoadHadNetworkError", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "pageLoadHadNetworkError", var (params));\r
}\r
\r
private:\r
if (postData != nullptr)\r
params->setProperty ("postData", var (*postData));\r
\r
- CommandReceiver::sendCommand (outChannel, "goToURL", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "goToURL", var (params));\r
}\r
\r
void goBack() { CommandReceiver::sendCommand (outChannel, "goBack", var()); }\r
params->setProperty ("decision_id", decision_id);\r
params->setProperty ("allow", owner.pageAboutToLoad (url));\r
\r
- CommandReceiver::sendCommand (outChannel, "decision", var (params.get()));\r
+ CommandReceiver::sendCommand (outChannel, "decision", var (params));\r
}\r
}\r
\r
};\r
\r
//==============================================================================\r
- struct SharedKeyWindow : public ReferenceCountedObject\r
+ class SharedKeyWindow : public ReferenceCountedObject\r
{\r
- SharedKeyWindow (ComponentPeer* peerToUse)\r
- : keyPeer (peerToUse),\r
- keyProxy (juce_createKeyProxyWindow (keyPeer))\r
- {}\r
-\r
- ~SharedKeyWindow()\r
- {\r
- juce_deleteKeyProxyWindow (keyPeer);\r
-\r
- auto& keyWindows = getKeyWindows();\r
- keyWindows.remove (keyPeer);\r
- }\r
-\r
+ public:\r
using Ptr = ReferenceCountedObjectPtr<SharedKeyWindow>;\r
\r
//==============================================================================\r
\r
private:\r
//==============================================================================\r
+ friend struct ContainerDeletePolicy<SharedKeyWindow>;\r
+\r
+ SharedKeyWindow (ComponentPeer* peerToUse)\r
+ : keyPeer (peerToUse),\r
+ keyProxy (juce_createKeyProxyWindow (keyPeer))\r
+ {}\r
+\r
+ ~SharedKeyWindow()\r
+ {\r
+ juce_deleteKeyProxyWindow (keyPeer);\r
+\r
+ auto& keyWindows = getKeyWindows();\r
+ keyWindows.remove (keyPeer);\r
+ }\r
+\r
ComponentPeer* keyPeer;\r
Window keyProxy;\r
\r
// on which screen it might appear to get a scaling factor :-(\r
auto& displays = Desktop::getInstance().getDisplays();\r
auto* peer = owner.getPeer();\r
- const double scale = (peer != nullptr ? peer->getPlatformScaleFactor()\r
- : displays.getMainDisplay().scale);\r
+ const double scale = (peer != nullptr ? displays.getDisplayContaining (peer->getBounds().getCentre())\r
+ : displays.getMainDisplay()).scale;\r
\r
Point<int> topLeftInPeer\r
= (peer != nullptr ? peer->getComponent().getLocalPoint (&owner, Point<int> (0, 0))\r
if (auto* peer = owner.getPeer())\r
{\r
auto r = peer->getComponent().getLocalArea (&owner, owner.getLocalBounds());\r
- return r * peer->getPlatformScaleFactor();\r
+ auto scale = Desktop::getInstance().getDisplays().getDisplayContaining (peer->localToGlobal (r.getCentre())).scale;\r
+\r
+ return r * scale;\r
}\r
\r
return owner.getLocalBounds();\r
\r
bool AppleRemoteDevice::open (const bool openInExclusiveMode)\r
{\r
- Array<int> cookies;\r
+ Array <int> cookies;\r
\r
CFArrayRef elements;\r
- auto device122 = (IOHIDDeviceInterface122**) device;\r
+ IOHIDDeviceInterface122** const device122 = (IOHIDDeviceInterface122**) device;\r
\r
- if ((*device122)->copyMatchingElements (device122, nullptr, &elements) != kIOReturnSuccess)\r
+ if ((*device122)->copyMatchingElements (device122, 0, &elements) != kIOReturnSuccess)\r
return false;\r
\r
for (int i = 0; i < CFArrayGetCount (elements); ++i)\r
{\r
- auto element = (CFDictionaryRef) CFArrayGetValueAtIndex (elements, i);\r
+ CFDictionaryRef element = (CFDictionaryRef) CFArrayGetValueAtIndex (elements, i);\r
\r
// get the cookie\r
CFTypeRef object = CFDictionaryGetValue (element, CFSTR (kIOHIDElementCookieKey));\r
\r
- if (object == nullptr || CFGetTypeID (object) != CFNumberGetTypeID())\r
+ if (object == 0 || CFGetTypeID (object) != CFNumberGetTypeID())\r
continue;\r
\r
long number;\r
{\r
queue = (*(IOHIDDeviceInterface**) device)->allocQueue ((IOHIDDeviceInterface**) device);\r
\r
- if (queue != nullptr)\r
+ if (queue != 0)\r
{\r
(*(IOHIDQueueInterface**) queue)->create ((IOHIDQueueInterface**) queue, 0, 12);\r
\r
->createAsyncEventSource ((IOHIDQueueInterface**) queue, &eventSource) == KERN_SUCCESS)\r
{\r
if ((*(IOHIDQueueInterface**) queue)->setEventCallout ((IOHIDQueueInterface**) queue,\r
- appleRemoteQueueCallback, this, nullptr) == KERN_SUCCESS)\r
+ appleRemoteQueueCallback, this, 0) == KERN_SUCCESS)\r
{\r
CFRunLoopAddSource (CFRunLoopGetCurrent(), eventSource, kCFRunLoopDefaultMode);\r
\r
bool isEarlierThanMavericks,\r
bool isEarlierThanYosemite)\r
{\r
- auto notification = [[NSUserNotification alloc] init];\r
+ auto* notification = [[NSUserNotification alloc] init];\r
\r
notification.title = juceStringToNS (n.title);\r
notification.subtitle = juceStringToNS (n.subtitle);\r
\r
if (n.repeat && n.triggerIntervalSec >= 60)\r
{\r
- auto dateComponents = [[NSDateComponents alloc] init];\r
+ auto* dateComponents = [[NSDateComponents alloc] init];\r
auto intervalSec = NSInteger (n.triggerIntervalSec);\r
dateComponents.second = intervalSec;\r
dateComponents.nanosecond = NSInteger ((n.triggerIntervalSec - intervalSec) * 1000000000);\r
{\r
if (n.actions.size() > 1)\r
{\r
- auto additionalActions = [NSMutableArray arrayWithCapacity: (NSUInteger) n.actions.size() - 1];\r
+ auto* additionalActions = [NSMutableArray arrayWithCapacity: (NSUInteger) n.actions.size() - 1];\r
\r
for (int a = 1; a < n.actions.size(); ++a)\r
[additionalActions addObject: [NSUserNotificationAction actionWithIdentifier: juceStringToNS (n.actions[a].identifier)\r
//PushNotificationsDelegate\r
void registeredForRemoteNotifications (NSData* deviceTokenToUse) override\r
{\r
- auto deviceTokenString = [[[[deviceTokenToUse description]\r
- stringByReplacingOccurrencesOfString: nsStringLiteral ("<") withString: nsStringLiteral ("")]\r
- stringByReplacingOccurrencesOfString: nsStringLiteral (">") withString: nsStringLiteral ("")]\r
- stringByReplacingOccurrencesOfString: nsStringLiteral (" ") withString: nsStringLiteral ("")];\r
+ auto* deviceTokenString = [[[[deviceTokenToUse description]\r
+ stringByReplacingOccurrencesOfString: nsStringLiteral ("<") withString: nsStringLiteral ("")]\r
+ stringByReplacingOccurrencesOfString: nsStringLiteral (">") withString: nsStringLiteral ("")]\r
+ stringByReplacingOccurrencesOfString: nsStringLiteral (" ") withString: nsStringLiteral ("")];\r
\r
deviceToken = nsStringToJuce (deviceTokenString);\r
\r
// page to avoid this, (and send it back when it's made visible again).\r
\r
blankPageShown = true;\r
- browser->goToURL ("about:blank", nullptr, nullptr);\r
+ browser->goToURL ("about:blank", 0, 0);\r
}\r
}\r
}\r
\r
JUCE_COMRESULT GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo)\r
{\r
- /* Note: If you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks..\r
+ /* Note: if you call AddRef on the frame here, then some types of object (e.g. web browser control) cause leaks..\r
If you don't call AddRef then others crash (e.g. QuickTime).. Bit of a catch-22, so letting it leak is probably preferable.\r
*/\r
if (lplpFrame != nullptr) { frame->AddRef(); *lplpFrame = frame; }\r
\r
//==============================================================================\r
class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- , public ComponentPeer::ScaleFactorListener\r
- #endif\r
{\r
public:\r
Pimpl (HWND hwnd, ActiveXControlComponent& activeXComp)\r
\r
clientSite->Release();\r
storage->Release();\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
- if (auto* peer = ComponentPeer::getPeer (i))\r
- peer->removeScaleFactorListener (this);\r
- #endif\r
}\r
\r
void setControlBounds (Rectangle<int> newBounds) const\r
{\r
if (controlHWND != 0)\r
- {\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
- newBounds = (newBounds.toDouble() * peer->getPlatformScaleFactor()).toNearestInt();\r
- #endif\r
-\r
MoveWindow (controlHWND, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE);\r
- }\r
-\r
}\r
\r
void setControlVisible (bool shouldBeVisible) const\r
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override\r
{\r
if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
- setControlBounds (peer->getAreaCoveredBy (owner));\r
+ setControlBounds (peer->getAreaCoveredBy(owner));\r
}\r
\r
void componentPeerChanged() override\r
{\r
componentMovedOrResized (true, true);\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (auto* peer = owner.getTopLevelComponent()->getPeer())\r
- peer->addScaleFactorListener (this);\r
- #endif\r
}\r
\r
void componentVisibilityChanged() override\r
componentPeerChanged();\r
}\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
- {\r
- componentMovedOrResized (true, true);\r
- }\r
- #endif\r
-\r
// intercepts events going to an activeX control, so we can sneakily use the mouse events\r
static LRESULT CALLBACK activeXHookWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
mat[12] = vector.x; mat[13] = vector.y; mat[14] = vector.z; mat[15] = Type (1);\r
}\r
\r
- /** Returns a new matrix from the given frustum values. */\r
+ /** Returns a new matrix from the given frustrum values. */\r
static Matrix3D fromFrustum (Type left, Type right, Type bottom, Type top, Type nearDistance, Type farDistance) noexcept\r
{\r
return { (Type (2) * nearDistance) / (right - left), 0, 0, 0,\r
#if JUCE_MAC || JUCE_IOS\r
if (auto* nsView = (JUCE_IOS_MAC_VIEW*) peer->getNativeHandle())\r
{\r
- if (auto nsWindow = [nsView window])\r
+ if (auto* nsWindow = [nsView window])\r
{\r
#if JUCE_MAC\r
return ([nsWindow isVisible]\r
\r
ID: juce_opengl\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE OpenGL classes\r
description: Classes for rendering OpenGL in a JUCE window.\r
website: http://www.juce.com/juce\r
USE_FUNCTION (glUniform1fv, void, (GLint p1, GLsizei p2, const GLfloat* p3), (p1, p2, p3))\\r
USE_FUNCTION (glUniformMatrix2fv, void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
USE_FUNCTION (glUniformMatrix3fv, void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
- USE_FUNCTION (glUniformMatrix4fv, void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\\r
- USE_FUNCTION (glBindAttribLocation, void, (GLuint p1, GLuint p2, const GLchar* p3), (p1, p2, p3))\\r
- USE_FUNCTION (glDrawBuffers, void, (GLsizei p1, const GLenum* p2), (p1, p2))\r
+ USE_FUNCTION (glUniformMatrix4fv, void, (GLint p1, GLsizei p2, GLboolean p3, const GLfloat* p4), (p1, p2, p3, p4))\r
\r
/** @internal This macro contains a list of GL extension functions that need to be dynamically loaded on Windows/Linux.\r
@see OpenGLExtensionFunctions\r
bool /*useMultisampling*/,\r
OpenGLVersion)\r
: component (comp),\r
- surface (EGL_NO_SURFACE), context (EGL_NO_CONTEXT)\r
+ hasInitialised (false),\r
+ juceContext (nullptr), surface (EGL_NO_SURFACE), context (EGL_NO_CONTEXT)\r
{\r
- auto env = getEnv();\r
+ JNIEnv* env = getEnv();\r
\r
// Do we have a native peer that we can attach to?\r
if (component.getPeer()->getNativeHandle() == nullptr)\r
// create a native surface view\r
surfaceView = GlobalRef (env->CallObjectMethod (android.activity.get(),\r
JuceAppActivity.createNativeSurfaceView,\r
- reinterpret_cast<jlong> (this),\r
- false));\r
+ reinterpret_cast<jlong> (this)));\r
if (surfaceView.get() == nullptr)\r
return;\r
\r
AndroidViewGroup.addView, surfaceView.get());\r
\r
// initialise the geometry of the view\r
- auto bounds = component.getTopLevelComponent()->getLocalArea (&component, component.getLocalBounds());\r
+ Rectangle<int> bounds = component.getTopLevelComponent()\r
+ ->getLocalArea (&component, component.getLocalBounds());\r
bounds *= component.getDesktopScaleFactor();\r
\r
updateWindowPosition (bounds);\r
\r
~NativeContext()\r
{\r
- auto env = getEnv();\r
+ JNIEnv* env = getEnv();\r
\r
if (jobject viewParent = env->CallObjectMethod (surfaceView.get(), NativeSurfaceView.getParent))\r
env->CallVoidMethod (viewParent, AndroidViewGroup.removeView, surfaceView.get());\r
// has the context already attached?\r
jassert (surface == EGL_NO_SURFACE && context == EGL_NO_CONTEXT);\r
\r
- auto env = getEnv();\r
+ JNIEnv* env = getEnv();\r
\r
+ // get a pointer to the native window\r
ANativeWindow* window = nullptr;\r
-\r
if (jobject jSurface = env->CallObjectMethod (surfaceView.get(), NativeSurfaceView.getNativeSurface))\r
{\r
- window = ANativeWindow_fromSurface (env, jSurface);\r
+ window = ANativeWindow_fromSurface(env, jSurface);\r
\r
- // if we didn't succeed the first time, wait briefly and try again..\r
+ // if we didn't succeed the first time, wait 25ms and try again\r
if (window == nullptr)\r
{\r
- Thread::sleep (200);\r
+ Thread::sleep (25);\r
window = ANativeWindow_fromSurface (env, jSurface);\r
}\r
}\r
\r
if (window == nullptr)\r
{\r
- // failed to get a pointer to the native window after second try so bail out\r
+ // failed to get a pointer to the native window after second try so\r
+ // bail out\r
jassertfalse;\r
+\r
return false;\r
}\r
\r
// create the surface\r
- surface = eglCreateWindowSurface (display, config, window, 0);\r
+ surface = eglCreateWindowSurface(display, config, window, 0);\r
jassert (surface != EGL_NO_SURFACE);\r
\r
ANativeWindow_release (window);\r
\r
// create the OpenGL context\r
- EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };\r
- context = eglCreateContext (display, config, EGL_NO_CONTEXT, contextAttribs);\r
+ EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};\r
+ context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);\r
jassert (context != EGL_NO_CONTEXT);\r
\r
juceContext = &aContext;\r
+\r
return true;\r
}\r
\r
{\r
if (lastBounds != bounds)\r
{\r
- auto env = getEnv();\r
+ JNIEnv* env = getEnv();\r
\r
lastBounds = bounds;\r
- auto r = bounds * Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
+ Rectangle<int> r = bounds * Desktop::getInstance().getDisplays().getMainDisplay().scale;\r
\r
env->CallVoidMethod (surfaceView.get(), NativeSurfaceView.layout,\r
(jint) r.getX(), (jint) r.getY(), (jint) r.getRight(), (jint) r.getBottom());\r
}\r
\r
//==============================================================================\r
- bool hasInitialised = false;\r
+ bool hasInitialised;\r
\r
GlobalRef surfaceView;\r
Rectangle<int> lastBounds;\r
\r
- OpenGLContext* juceContext = nullptr;\r
+ OpenGLContext* juceContext;\r
EGLSurface surface;\r
EGLContext context;\r
\r
\r
void shutdownOnRenderThread()\r
{\r
- ScopedXLock xlock (display);\r
context = nullptr;\r
deactivateCurrentContext();\r
glXDestroyContext (display, renderContext);\r
\r
bool makeActive() const noexcept\r
{\r
- ScopedXLock xlock (display);\r
return renderContext != 0\r
&& glXMakeCurrent (display, embeddedWindow, renderContext);\r
}\r
\r
bool isActive() const noexcept\r
{\r
- ScopedXLock xlock (display);\r
return glXGetCurrentContext() == renderContext && renderContext != 0;\r
}\r
\r
static void deactivateCurrentContext()\r
{\r
ScopedXDisplay xDisplay;\r
- ScopedXLock xlock (xDisplay.display);\r
glXMakeCurrent (xDisplay.display, None, 0);\r
}\r
\r
void swapBuffers()\r
{\r
- ScopedXLock xlock (display);\r
glXSwapBuffers (display, embeddedWindow);\r
}\r
\r
if (auto GLXSwapIntervalSGI\r
= (PFNGLXSWAPINTERVALSGIPROC) OpenGLHelpers::getExtensionFunction ("glXSwapIntervalSGI"))\r
{\r
- ScopedXLock xlock (display);\r
swapFrames = numFramesPerSwap;\r
GLXSwapIntervalSGI (numFramesPerSwap);\r
return true;\r
void* contextToShare,\r
bool shouldUseMultisampling,\r
OpenGLVersion version)\r
+ : lastSwapTime (0), minSwapTimeMs (0), underrunCounter (0)\r
{\r
NSOpenGLPixelFormatAttribute attribs[64] = { 0 };\r
createAttribs (attribs, version, pixFormat, shouldUseMultisampling);\r
[renderContext clearDrawable];\r
[renderContext setView: nil];\r
[view setOpenGLContext: nil];\r
- [view release];\r
+ renderContext = nil;\r
}\r
\r
static void createAttribs (NSOpenGLPixelFormatAttribute* attribs, OpenGLVersion version,\r
int numAttribs = 0;\r
\r
#if JUCE_OPENGL3\r
- attribs[numAttribs++] = NSOpenGLPFAOpenGLProfile;\r
- attribs[numAttribs++] = version >= openGL3_2 ? NSOpenGLProfileVersion3_2Core\r
- : NSOpenGLProfileVersionLegacy;\r
+ attribs [numAttribs++] = NSOpenGLPFAOpenGLProfile;\r
+ attribs [numAttribs++] = version >= openGL3_2 ? NSOpenGLProfileVersion3_2Core\r
+ : NSOpenGLProfileVersionLegacy;\r
#endif\r
\r
- attribs[numAttribs++] = NSOpenGLPFADoubleBuffer;\r
- attribs[numAttribs++] = NSOpenGLPFAClosestPolicy;\r
- attribs[numAttribs++] = NSOpenGLPFANoRecovery;\r
- attribs[numAttribs++] = NSOpenGLPFAColorSize;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.redBits + pixFormat.greenBits + pixFormat.blueBits);\r
- attribs[numAttribs++] = NSOpenGLPFAAlphaSize;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.alphaBits;\r
- attribs[numAttribs++] = NSOpenGLPFADepthSize;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.depthBufferBits;\r
- attribs[numAttribs++] = NSOpenGLPFAStencilSize;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.stencilBufferBits;\r
- attribs[numAttribs++] = NSOpenGLPFAAccumSize;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.accumulationBufferRedBits + pixFormat.accumulationBufferGreenBits\r
+ attribs [numAttribs++] = NSOpenGLPFADoubleBuffer;\r
+ attribs [numAttribs++] = NSOpenGLPFAClosestPolicy;\r
+ attribs [numAttribs++] = NSOpenGLPFANoRecovery;\r
+ attribs [numAttribs++] = NSOpenGLPFAColorSize;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.redBits + pixFormat.greenBits + pixFormat.blueBits);\r
+ attribs [numAttribs++] = NSOpenGLPFAAlphaSize;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.alphaBits;\r
+ attribs [numAttribs++] = NSOpenGLPFADepthSize;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.depthBufferBits;\r
+ attribs [numAttribs++] = NSOpenGLPFAStencilSize;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.stencilBufferBits;\r
+ attribs [numAttribs++] = NSOpenGLPFAAccumSize;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) (pixFormat.accumulationBufferRedBits + pixFormat.accumulationBufferGreenBits\r
+ pixFormat.accumulationBufferBlueBits + pixFormat.accumulationBufferAlphaBits);\r
\r
if (shouldUseMultisampling)\r
{\r
- attribs[numAttribs++] = NSOpenGLPFAMultisample;\r
- attribs[numAttribs++] = NSOpenGLPFASampleBuffers;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) 1;\r
- attribs[numAttribs++] = NSOpenGLPFASamples;\r
- attribs[numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.multisamplingLevel;\r
+ attribs [numAttribs++] = NSOpenGLPFAMultisample;\r
+ attribs [numAttribs++] = NSOpenGLPFASampleBuffers;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) 1;\r
+ attribs [numAttribs++] = NSOpenGLPFASamples;\r
+ attribs [numAttribs++] = (NSOpenGLPixelFormatAttribute) pixFormat.multisamplingLevel;\r
}\r
}\r
\r
\r
void swapBuffers()\r
{\r
- auto now = Time::getMillisecondCounterHiRes();\r
+ double now = Time::getMillisecondCounterHiRes();\r
[renderContext flushBuffer];\r
\r
if (minSwapTimeMs > 0)\r
// speed, burning CPU. This hack detects when things are going too fast\r
// and sleeps if necessary.\r
\r
- auto swapTime = Time::getMillisecondCounterHiRes() - now;\r
- auto frameTime = (int) (now - lastSwapTime);\r
+ const double swapTime = Time::getMillisecondCounterHiRes() - now;\r
+ const int frameTime = (int) (now - lastSwapTime);\r
\r
if (swapTime < 0.5 && frameTime < minSwapTimeMs - 3)\r
{\r
now = Time::getMillisecondCounterHiRes();\r
}\r
else\r
- {\r
++underrunCounter;\r
- }\r
}\r
else\r
{\r
return numFrames;\r
}\r
\r
- NSOpenGLContext* renderContext = nil;\r
- NSOpenGLView* view = nil;\r
+ NSOpenGLContext* renderContext;\r
+ NSOpenGLView* view;\r
ReferenceCountedObjectPtr<ReferenceCountedObject> viewAttachment;\r
- double lastSwapTime = 0;\r
- int minSwapTimeMs = 0, underrunCounter = 0;\r
+ double lastSwapTime;\r
+ int minSwapTimeMs, underrunCounter;\r
\r
//==============================================================================\r
struct MouseForwardingNSOpenGLViewClass : public ObjCClass<NSOpenGLView>\r
//==============================================================================\r
bool OpenGLHelpers::isContextActive()\r
{\r
- return CGLGetCurrentContext() != CGLContextObj();\r
+ return CGLGetCurrentContext() != 0;\r
+}\r
+\r
+//==============================================================================\r
+void componentPeerAboutToChange (Component& comp, bool shouldSuspend)\r
+{\r
+ if (auto* context = OpenGLContext::getContextAttachedTo (comp))\r
+ context->overrideCanBeAttached (shouldSuspend);\r
+\r
+ for (auto* child : comp.getChildren())\r
+ componentPeerAboutToChange (*child, shouldSuspend);\r
}\r
\r
} // namespace juce\r
{\r
\r
extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent);\r
-extern bool shouldScaleGLWindow (void* hwnd);\r
\r
//==============================================================================\r
class OpenGLContext::NativeContext\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- : public ComponentPeer::ScaleFactorListener\r
- #endif\r
{\r
public:\r
NativeContext (Component& component,\r
{\r
deleteRenderContext();\r
releaseDC();\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
- if (auto* peer = ComponentPeer::getPeer (i))\r
- peer->removeScaleFactorListener (this);\r
- #endif\r
}\r
\r
bool initialiseOnRenderThread (OpenGLContext& c)\r
void updateWindowPosition (Rectangle<int> bounds)\r
{\r
if (nativeWindow != nullptr)\r
- {\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- if (safeComponent != nullptr)\r
- if (auto* peer = safeComponent->getTopLevelComponent()->getPeer())\r
- bounds = (bounds.toDouble() * peer->getPlatformScaleFactor()).toNearestInt();\r
- #endif\r
-\r
SetWindowPos ((HWND) nativeWindow->getNativeHandle(), 0,\r
bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(),\r
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);\r
- }\r
}\r
\r
bool createdOk() const noexcept { return getRawContext() != nullptr; }\r
\r
struct Locker { Locker (NativeContext&) {} };\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
- {\r
- if (safeComponent != nullptr)\r
- if (auto peer = safeComponent->getTopLevelComponent()->getPeer())\r
- updateWindowPosition (peer->getAreaCoveredBy (*safeComponent));\r
- }\r
- #endif\r
-\r
- double getWindowScaleFactor (const Rectangle<int>& screenBounds)\r
- {\r
- if (nativeWindow != nullptr && shouldScaleGLWindow (nativeWindow->getNativeHandle()))\r
- return Desktop::getInstance().getDisplays().findDisplayForRect (screenBounds).scale;\r
-\r
- return 1.0;\r
- }\r
-\r
private:\r
struct DummyComponent : public Component\r
{\r
HGLRC renderContext;\r
HDC dc;\r
OpenGLContext* context = {};\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- Component::SafePointer<Component> safeComponent;\r
- #endif\r
\r
#define JUCE_DECLARE_WGL_EXTENSION_FUNCTION(name, returnType, params) \\r
typedef returnType (__stdcall *type_ ## name) params; type_ ## name name;\r
nativeWindow.reset (createNonRepaintingEmbeddedWindowsPeer (*dummyComponent, topComp->getWindowHandle()));\r
\r
if (auto* peer = topComp->getPeer())\r
- {\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- peer->addScaleFactorListener (this);\r
- safeComponent = Component::SafePointer<Component> (&component);\r
- #endif\r
-\r
updateWindowPosition (peer->getAreaCoveredBy (component));\r
- }\r
\r
nativeWindow->setVisible (true);\r
dc = GetDC ((HWND) nativeWindow->getNativeHandle());\r
{\r
if (auto* peer = component.getPeer())\r
{\r
- #if JUCE_WINDOWS\r
- auto newScale = nativeContext->getWindowScaleFactor (component.getTopLevelComponent()->getScreenBounds());\r
- #else\r
- auto newScale = Desktop::getInstance().getDisplays().findDisplayForRect (component.getTopLevelComponent()->getScreenBounds()).scale;\r
- #endif\r
+ lastScreenBounds = component.getTopLevelComponent()->getScreenBounds();\r
+\r
+ auto newScale = Desktop::getInstance().getDisplays()\r
+ .getDisplayContaining (lastScreenBounds.getCentre()).scale;\r
\r
auto localBounds = component.getLocalBounds();\r
- auto newArea = peer->getComponent().getLocalArea (&component, localBounds).withZeroOrigin() * newScale;\r
+\r
+ auto newArea = peer->getComponent().getLocalArea (&component, localBounds)\r
+ .withZeroOrigin()\r
+ * newScale;\r
\r
if (scale != newScale || viewportArea != newArea)\r
{\r
{\r
if (calledFromDestructor || destroying.get() == 0)\r
{\r
- if (shouldBlock)\r
- {\r
- auto blocker = new BlockingWorker (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
- OpenGLContext::AsyncWorker::Ptr worker (*blocker);\r
- workQueue.add (worker);\r
+ BlockingWorker* blocker = (shouldBlock ? new BlockingWorker (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse)) : nullptr);\r
+ OpenGLContext::AsyncWorker::Ptr worker = (blocker != nullptr ? blocker : static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
+ workQueue.add (worker);\r
\r
- messageManagerLock.abort();\r
- context.triggerRepaint();\r
+ messageManagerLock.abort();\r
+ context.triggerRepaint();\r
\r
+ if (blocker != nullptr)\r
blocker->block();\r
- }\r
- else\r
- {\r
- workQueue.add (static_cast<OpenGLContext::AsyncWorker::Ptr&&> (workerToUse));\r
-\r
- messageManagerLock.abort();\r
- context.triggerRepaint();\r
- }\r
}\r
else\r
{\r
jassert (c != nullptr && nativeContext != nullptr);\r
jassert (getCurrentContext() != nullptr);\r
\r
- auto index = c->associatedObjectNames.indexOf (name);\r
- return index >= 0 ? c->associatedObjects.getUnchecked (index).get() : nullptr;\r
+ const int index = c->associatedObjectNames.indexOf (name);\r
+ return index >= 0 ? c->associatedObjects.getUnchecked (index) : nullptr;\r
}\r
\r
void OpenGLContext::setAssociatedObject (const char* name, ReferenceCountedObject* newObject)\r
jassertfalse; // You must have attached the context to a component\r
}\r
\r
+void OpenGLContext::overrideCanBeAttached (bool newCanAttach)\r
+{\r
+ if (overrideCanAttach != newCanAttach)\r
+ {\r
+ overrideCanAttach = newCanAttach;\r
+\r
+ if (auto* a = attachment.get())\r
+ a->update();\r
+ }\r
+}\r
+\r
//==============================================================================\r
struct DepthTestDisabler\r
{\r
extensions.glBufferData (GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW);\r
\r
auto index = (GLuint) program.params.positionAttribute.attributeID;\r
- extensions.glVertexAttribPointer (index, 2, GL_SHORT, GL_FALSE, 4, nullptr);\r
+ extensions.glVertexAttribPointer (index, 2, GL_SHORT, GL_FALSE, 4, 0);\r
extensions.glEnableVertexAttribArray (index);\r
JUCE_CHECK_OPENGL_ERROR\r
\r
//==============================================================================\r
/** Returns the scale factor used by the display that is being rendered.\r
\r
- The scale is that of the display - see Displays::Display::scale\r
+ The scale is that of the display - see Desktop::Displays::Display::scale\r
\r
Note that this should only be called during an OpenGLRenderer::renderOpenGL()\r
callback - at other times the value it returns is undefined.\r
JUCE_DECLARE_NON_COPYABLE (AsyncWorkerFunctor)\r
};\r
\r
+ //==============================================================================\r
+ friend void componentPeerAboutToChange (Component&, bool);\r
+ void overrideCanBeAttached (bool);\r
+\r
//==============================================================================\r
CachedImage* getCachedImage() const noexcept;\r
void execute (AsyncWorker::Ptr, bool);\r
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\r
JUCE_CHECK_OPENGL_ERROR\r
\r
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);\r
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);\r
JUCE_CHECK_OPENGL_ERROR\r
\r
context.extensions.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);\r
\r
private:\r
class Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
class SavedState;\r
+ friend struct ContainerDeletePolicy<SavedState>;\r
std::unique_ptr<SavedState> savedState;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLFrameBuffer)\r
{\r
TextureInfo t;\r
\r
- if (textureNeedsReloading && pixelData != nullptr)\r
+ if (textureNeedsReloading)\r
{\r
textureNeedsReloading = false;\r
- texture.loadImage (Image (*pixelData));\r
+ texture.loadImage (Image (pixelData));\r
}\r
\r
t.textureID = texture.getTextureID();\r
\r
void bindAttributes (OpenGLContext& context)\r
{\r
- context.extensions.glVertexAttribPointer ((GLuint) positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 8, nullptr);\r
+ context.extensions.glVertexAttribPointer ((GLuint) positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 8, (void*) 0);\r
context.extensions.glVertexAttribPointer ((GLuint) colourAttribute.attributeID, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, (void*) 4);\r
context.extensions.glEnableVertexAttribArray ((GLuint) positionAttribute.attributeID);\r
context.extensions.glEnableVertexAttribArray ((GLuint) colourAttribute.attributeID);\r
context.extensions.glBufferSubData (GL_ARRAY_BUFFER, 0, (GLsizeiptr) ((size_t) numVertices * sizeof (VertexInfo)), vertexData);\r
// NB: If you get a random crash in here and are running in a Parallels VM, it seems to be a bug in\r
// their driver.. Can't find a workaround unfortunately.\r
- glDrawElements (GL_TRIANGLES, (numVertices * 3) / 2, GL_UNSIGNED_SHORT, nullptr);\r
+ glDrawElements (GL_TRIANGLES, (numVertices * 3) / 2, GL_UNSIGNED_SHORT, 0);\r
JUCE_CHECK_OPENGL_ERROR\r
numVertices = 0;\r
}\r
if (programs == nullptr)\r
{\r
programs = new ShaderPrograms (context);\r
- context.setAssociatedObject (programValueID, programs.get());\r
+ context.setAssociatedObject (programValueID, programs);\r
}\r
}\r
\r
auto p3 = Point<float> (g.point1.x + (g.point2.y - g.point1.y),\r
g.point1.y - (g.point2.x - g.point1.x)).transformedBy (t);\r
\r
- auto programs = currentShader.programs;\r
+ ShaderPrograms* const programs = currentShader.programs;\r
const ShaderPrograms::MaskedShaderParams* maskParams = nullptr;\r
\r
if (g.isRadial)\r
{\r
blendMode.setPremultipliedBlendingMode (shaderQuadQueue);\r
\r
- auto programs = currentShader.programs;\r
+ ShaderPrograms* const programs = currentShader.programs;\r
\r
const ShaderPrograms::MaskedShaderParams* maskParams = nullptr;\r
const ShaderPrograms::ImageParams* imageParams;\r
const std::unique_ptr<EdgeTable> et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight));\r
\r
if (et != nullptr)\r
- fillShape (*new EdgeTableRegionType (*et), false);\r
+ fillShape (new EdgeTableRegionType (*et), false);\r
}\r
}\r
}\r
{\r
}\r
\r
- static ReferenceCountedObjectPtr<CustomProgram> get (const String& hashName)\r
+ static CustomProgram* get (const String& hashName)\r
{\r
if (auto* c = OpenGLContext::getCurrentContext())\r
- if (auto* o = c->getAssociatedObject (hashName.toRawUTF8()))\r
- return *static_cast<CustomProgram*> (o);\r
+ return static_cast<CustomProgram*> (c->getAssociatedObject (hashName.toRawUTF8()));\r
\r
- return {};\r
+ return nullptr;\r
}\r
\r
- static ReferenceCountedObjectPtr<CustomProgram> getOrCreate (LowLevelGraphicsContext& gc, const String& hashName,\r
- const String& code, String& errorMessage)\r
+ static CustomProgram* getOrCreate (LowLevelGraphicsContext& gc, const String& hashName,\r
+ const String& code, String& errorMessage)\r
{\r
- if (auto c = get (hashName))\r
+ if (auto* c = get (hashName))\r
return c;\r
\r
if (auto* sc = dynamic_cast<OpenGLRendering::ShaderContext*> (&gc))\r
{\r
if (auto context = OpenGLContext::getCurrentContext())\r
{\r
- context->setAssociatedObject (hashName.toRawUTF8(), c.get());\r
+ context->setAssociatedObject (hashName.toRawUTF8(), c);\r
return c;\r
}\r
}\r
\r
ImagePixelData::Ptr clone() override\r
{\r
- Image newImage (*new OpenGLFrameBufferImage (context, width, height));\r
+ Image newImage (new OpenGLFrameBufferImage (context, width, height));\r
Graphics g (newImage);\r
- g.drawImageAt (Image (*this), 0, 0, false);\r
+ g.drawImageAt (Image (this), 0, 0, false);\r
\r
- return ImagePixelData::Ptr (newImage.getPixelData());\r
+ return newImage.getPixelData();\r
}\r
\r
void initialiseBitmapData (Image::BitmapData& bitmapData, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
return ImagePixelData::Ptr();\r
\r
im->frameBuffer.clear (Colours::transparentBlack);\r
- return *im.release();\r
+ return im.release();\r
}\r
\r
OpenGLFrameBuffer* OpenGLImageType::getFrameBufferFrom (const Image& image)\r
\r
ID: juce_osc\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE OSC classes\r
description: Open Sound Control implementation.\r
website: http://www.juce.com/juce\r
if (pattern == patternEnd)\r
return false;\r
\r
- // Note: In case this code is ever moved into the more generic CharPointerFunctions,\r
+ // Note: in case this code is ever moved into the more generic CharPointerFunctions,\r
// the next two lines probably will not compile as soon as this class is used with a\r
// Char template type parameter that is not the same type as String::Char.\r
StringArray set;\r
expectDoesNotThrow (OSCAddressPattern ("/[a-e]"));\r
expectDoesNotThrow (OSCAddressPattern ("/foo/[a-z]x{foo,bar}/*BAZ42/"));\r
\r
- /* Note: If malformed expressions are used, e.g. "bracenotclosed{" or "{a-e}" or "[-foo]",\r
+ /* Note: if malformed expressions are used, e.g. "bracenotclosed{" or "{a-e}" or "[-foo]",\r
this should not throw at construction time. Instead it should simply fail any pattern match later.\r
So there is no need to test for those.\r
The reason is that we do not actually parse the expressions now, but only during matching.\r
\r
beginTest ("basic string matching");\r
{\r
- /* Note: The actual expression matching is tested in OSCPatternMatcher, so here we just\r
+ /* Note: the actual expression matching is tested in OSCPatternMatcher, so here we just\r
do some basic tests and check if the matching works with multi-part addresses.\r
*/\r
{\r
bool operator!= (const OSCAddress& other) const noexcept;\r
\r
/** Converts the OSCAddress to a String.\r
- Note: Trailing slashes are always removed automatically.\r
+ Note: trailing slashes are always removed automatically.\r
\r
@returns a String object that represents the OSC address.\r
*/\r
bool containsWildcards() const noexcept { return wasInitialisedWithWildcards; }\r
\r
/** Converts the OSCAddressPattern to a String.\r
- Note: Trailing slashes are always removed automatically.\r
+ Note: trailing slashes are always removed automatically.\r
\r
@returns a String object that represents the OSC address pattern.\r
*/\r
namespace juce\r
{\r
\r
-OSCArgument::OSCArgument (int32 v) : type (OSCTypes::int32), intValue (v) {}\r
-OSCArgument::OSCArgument (float v) : type (OSCTypes::float32), floatValue (v) {}\r
-OSCArgument::OSCArgument (const String& s) : type (OSCTypes::string), stringValue (s) {}\r
-OSCArgument::OSCArgument (MemoryBlock b) : type (OSCTypes::blob), blob (static_cast<MemoryBlock&&> (b)) {}\r
-OSCArgument::OSCArgument (OSCColour c) : type (OSCTypes::colour), intValue ((int32) c.toInt32()) {}\r
+OSCArgument::OSCArgument (int32 value) noexcept\r
+ : type (OSCTypes::int32), intValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (float value) noexcept\r
+ : type (OSCTypes::float32), floatValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (const String& value) noexcept\r
+ : type (OSCTypes::string), stringValue (value)\r
+{\r
+}\r
+\r
+OSCArgument::OSCArgument (const MemoryBlock& b)\r
+ : type (OSCTypes::blob), blob (b)\r
+{\r
+}\r
\r
//==============================================================================\r
String OSCArgument::getString() const noexcept\r
return blob;\r
}\r
\r
-OSCColour OSCArgument::getColour() const noexcept\r
-{\r
- if (isColour())\r
- return OSCColour::fromInt32 ((uint32) intValue);\r
-\r
- jassertfalse; // you must check the type of an argument before attempting to get its value!\r
- return { 0, 0, 0, 0 };\r
-}\r
\r
//==============================================================================\r
//==============================================================================\r
OSCArgument arg (value);\r
\r
expect (arg.getType() == OSCTypes::int32);\r
+\r
expect (arg.isInt32());\r
expect (! arg.isFloat32());\r
expect (! arg.isString());\r
expect (! arg.isBlob());\r
- expect (! arg.isColour());\r
\r
expect (arg.getInt32() == value);\r
}\r
OSCArgument arg (value);\r
\r
expect (arg.getType() == OSCTypes::float32);\r
+\r
expect (! arg.isInt32());\r
expect (arg.isFloat32());\r
expect (! arg.isString());\r
expect (! arg.isBlob());\r
- expect (! arg.isColour());\r
\r
expect (arg.getFloat32() == value);\r
+\r
+\r
}\r
\r
beginTest ("String");\r
OSCArgument arg (value);\r
\r
expect (arg.getType() == OSCTypes::string);\r
+\r
expect (! arg.isInt32());\r
expect (! arg.isFloat32());\r
expect (arg.isString());\r
expect (! arg.isBlob());\r
- expect (! arg.isColour());\r
\r
expect (arg.getString() == value);\r
}\r
OSCArgument arg ("Hello, World!");\r
\r
expect (arg.getType() == OSCTypes::string);\r
+\r
expect (! arg.isInt32());\r
expect (! arg.isFloat32());\r
expect (arg.isString());\r
expect (! arg.isBlob());\r
- expect (! arg.isColour());\r
\r
- expect (arg.getString() == "Hello, World!");\r
+ expect (arg.getString() == String ("Hello, World!"));\r
}\r
\r
beginTest ("Blob");\r
{\r
- auto blob = getMemoryBlockWithRandomData (413);\r
+ const size_t numBytes = 412;\r
+ MemoryBlock blob = getMemoryBlockWithRandomData (numBytes);\r
+\r
OSCArgument arg (blob);\r
\r
expect (arg.getType() == OSCTypes::blob);\r
+\r
expect (! arg.isInt32());\r
expect (! arg.isFloat32());\r
expect (! arg.isString());\r
expect (arg.isBlob());\r
- expect (! arg.isColour());\r
\r
expect (arg.getBlob() == blob);\r
}\r
\r
- beginTest ("Colour");\r
- {\r
- Random rng = getRandom();\r
-\r
- for (int i = 100; --i >= 0;)\r
- {\r
- OSCColour col = { (uint8) rng.nextInt (256),\r
- (uint8) rng.nextInt (256),\r
- (uint8) rng.nextInt (256),\r
- (uint8) rng.nextInt (256) };\r
-\r
- OSCArgument arg (col);\r
-\r
- expect (arg.getType() == OSCTypes::colour);\r
- expect (! arg.isInt32());\r
- expect (! arg.isFloat32());\r
- expect (! arg.isString());\r
- expect (! arg.isBlob());\r
- expect (arg.isColour());\r
-\r
- expect (arg.getColour().toInt32() == col.toInt32());\r
- }\r
- }\r
-\r
beginTest ("Copy, move and assignment");\r
{\r
{\r
{\r
public:\r
/** Constructs an OSCArgument with type int32 and a given value. */\r
- OSCArgument (int32 value);\r
+ OSCArgument (int32 value) noexcept;\r
\r
/** Constructs an OSCArgument with type float32 and a given value. */\r
- OSCArgument (float value);\r
+ OSCArgument (float value) noexcept;\r
\r
/** Constructs an OSCArgument with type string and a given value */\r
- OSCArgument (const String& value);\r
+ OSCArgument (const String& value) noexcept;\r
\r
/** Constructs an OSCArgument with type blob and copies dataSize bytes\r
from the memory pointed to by data into the blob.\r
The data owned by the blob will be released when the OSCArgument object\r
gets destructed.\r
*/\r
- OSCArgument (MemoryBlock blob);\r
-\r
- /** Constructs an OSCArgument with type colour and a given colour value */\r
- OSCArgument (OSCColour colour);\r
+ OSCArgument (const MemoryBlock& blob);\r
\r
/** Returns the type of the OSCArgument as an OSCType.\r
OSCType is a char type, and its value will be the OSC type tag of the type.\r
/** Returns whether the type of the OSCArgument is int32. */\r
bool isInt32() const noexcept { return type == OSCTypes::int32; }\r
\r
- /** Returns whether the type of the OSCArgument is float. */\r
+ /** Returns whether the type of the OSCArgument is int32. */\r
bool isFloat32() const noexcept { return type == OSCTypes::float32; }\r
\r
- /** Returns whether the type of the OSCArgument is string. */\r
+ /** Returns whether the type of the OSCArgument is int32. */\r
bool isString() const noexcept { return type == OSCTypes::string; }\r
\r
- /** Returns whether the type of the OSCArgument is blob. */\r
+ /** Returns whether the type of the OSCArgument is int32. */\r
bool isBlob() const noexcept { return type == OSCTypes::blob; }\r
\r
- /** Returns whether the type of the OSCArgument is blob. */\r
- bool isColour() const noexcept { return type == OSCTypes::colour; }\r
-\r
/** Returns the value of the OSCArgument as an int32.\r
If the type of the OSCArgument is not int32, the behaviour is undefined.\r
- */\r
+ */\r
int32 getInt32() const noexcept;\r
\r
/** Returns the value of the OSCArgument as a float32.\r
If the type of the OSCArgument is not float32, the behaviour is undefined.\r
- */\r
+ */\r
float getFloat32() const noexcept;\r
\r
/** Returns the value of the OSCArgument as a string.\r
If the type of the OSCArgument is not string, the behaviour is undefined.\r
- */\r
+ */\r
String getString() const noexcept;\r
\r
/** Returns the binary data contained in the blob and owned by the OSCArgument,\r
as a reference to a JUCE MemoryBlock object.\r
\r
If the type of the OSCArgument is not blob, the behaviour is undefined.\r
- */\r
+ */\r
const MemoryBlock& getBlob() const noexcept;\r
\r
- /** Returns the value of the OSCArgument as an OSCColour.\r
- If the type of the OSCArgument is not a colour, the behaviour is undefined.\r
- */\r
- OSCColour getColour() const noexcept;\r
\r
private:\r
//==============================================================================\r
void OSCMessage::addInt32 (int32 value) { arguments.add (OSCArgument (value)); }\r
void OSCMessage::addFloat32 (float value) { arguments.add (OSCArgument (value)); }\r
void OSCMessage::addString (const String& value) { arguments.add (OSCArgument (value)); }\r
-void OSCMessage::addBlob (MemoryBlock blob) { arguments.add (OSCArgument (static_cast<MemoryBlock&&> (blob))); }\r
-void OSCMessage::addColour (OSCColour colour) { arguments.add (OSCArgument (colour)); }\r
+void OSCMessage::addBlob (const MemoryBlock& blob) { arguments.add (OSCArgument (blob)); }\r
void OSCMessage::addArgument (OSCArgument arg) { arguments.add (arg); }\r
\r
//==============================================================================\r
expectEquals (msg.size(), 0);\r
expect (msg.getAddressPattern().toString() == "/test/param0");\r
\r
- const int numTestArgs = 5;\r
+ const int numTestArgs = 4;\r
\r
const int testInt = 42;\r
const float testFloat = 3.14159f;\r
const String testString = "Hello, World!";\r
- const OSCColour testColour = { 10, 20, 150, 200 };\r
\r
const uint8 testBlobData[5] = { 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };\r
const MemoryBlock testBlob (testBlobData, sizeof (testBlobData));\r
msg.addFloat32 (testFloat);\r
msg.addString (testString);\r
msg.addBlob (testBlob);\r
- msg.addColour (testColour);\r
\r
expectEquals (msg.size(), numTestArgs);\r
\r
expectEquals (msg[1].getType(), OSCTypes::float32);\r
expectEquals (msg[2].getType(), OSCTypes::string);\r
expectEquals (msg[3].getType(), OSCTypes::blob);\r
- expectEquals (msg[4].getType(), OSCTypes::colour);\r
\r
expect (msg[0].isInt32());\r
expect (msg[1].isFloat32());\r
expect (msg[2].isString());\r
expect (msg[3].isBlob());\r
- expect (msg[4].isColour());\r
\r
expectEquals (msg[0].getInt32(), testInt);\r
expectEquals (msg[1].getFloat32(), testFloat);\r
expectEquals (msg[2].getString(), testString);\r
expect (msg[3].getBlob() == testBlob);\r
- expect (msg[4].getColour().toInt32() == testColour.toInt32());\r
\r
expect (msg.begin() + numTestArgs == msg.end());\r
\r
- auto arg = msg.begin();\r
+ OSCArgument* arg = msg.begin();\r
expect (arg->isInt32());\r
expectEquals (arg->getInt32(), testInt);\r
++arg;\r
expectEquals (arg->getString(), testString);\r
++arg;\r
expect (arg->isBlob());\r
- expect (arg->getBlob() == testBlob);\r
- ++arg;\r
- expect (arg->isColour());\r
- expect (arg->getColour().toInt32() == testColour.toInt32());\r
+ expect(arg->getBlob() == testBlob);\r
++arg;\r
expect (arg == msg.end());\r
}\r
void clear();\r
\r
//==============================================================================\r
- /** Creates a new OSCArgument of type int32 with the given value,\r
+ /** Creates a new OSCArgument of type int32 with a given value\r
and adds it to the OSCMessage object.\r
*/\r
void addInt32 (int32 value);\r
\r
- /** Creates a new OSCArgument of type float32 with the given value,\r
+ /** Creates a new OSCArgument of type float32 with a given value\r
and adds it to the OSCMessage object.\r
*/\r
void addFloat32 (float value);\r
\r
- /** Creates a new OSCArgument of type string with the given value,\r
+ /** Creates a new OSCArgument of type string with a given value\r
and adds it to the OSCMessage object.\r
*/\r
void addString (const String& value);\r
/** Creates a new OSCArgument of type blob with binary data content copied from\r
the given MemoryBlock.\r
\r
- Note: If the argument passed is an lvalue, this may copy the binary data.\r
+ Note: if the argument passed is an lvalue, this may copy the binary data.\r
*/\r
- void addBlob (MemoryBlock blob);\r
-\r
- /** Creates a new OSCArgument of type colour with the given value,\r
- and adds it to the OSCMessage object.\r
- */\r
- void addColour (OSCColour colour);\r
+ void addBlob (const MemoryBlock& blob);\r
\r
/** Adds the OSCArgument argument to the OSCMessage object.\r
\r
This class is implementing the Open Sound Control 1.0 Specification for\r
interpreting the data.\r
\r
- Note: Some older implementations of OSC may omit the OSC Type Tag string\r
+ Note: some older implementations of OSC may omit the OSC Type Tag string\r
in OSC messages. This class will treat such OSC messages as format errors.\r
*/\r
class OSCInputStream\r
size_t getDataSize() const noexcept { return input.getDataSize(); }\r
\r
/** Returns the current position of the stream. */\r
- uint64 getPosition() { return (uint64) input.getPosition(); }\r
+ uint64 getPosition() { return uint64 (input.getPosition()); }\r
\r
/** Attempts to set the current position of the stream. Returns true if this was successful. */\r
bool setPosition (int64 pos) { return input.setPosition (pos); }\r
//==============================================================================\r
int32 readInt32()\r
{\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading int32");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading int32");\r
+\r
return input.readIntBigEndian();\r
}\r
\r
uint64 readUint64()\r
{\r
- checkBytesAvailable (8, "OSC input stream exhausted while reading uint64");\r
+ if (input.getNumBytesRemaining() < 8)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading uint64");\r
+\r
return (uint64) input.readInt64BigEndian();\r
}\r
\r
float readFloat32()\r
{\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading float");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading float");\r
+\r
return input.readFloatBigEndian();\r
}\r
\r
String readString()\r
{\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading string");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading string");\r
\r
auto posBegin = (size_t) getPosition();\r
auto s = input.readString();\r
\r
MemoryBlock readBlob()\r
{\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading blob");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading blob");\r
+\r
+ auto blobDataSize = (size_t) input.readIntBigEndian();\r
\r
- auto blobDataSize = input.readIntBigEndian();\r
- checkBytesAvailable ((blobDataSize + 3) % 4, "OSC input stream exhausted before reaching end of blob");\r
+ if ((size_t) input.getNumBytesRemaining() < (blobDataSize + 3) % 4)\r
+ throw OSCFormatError ("OSC input stream exhausted before reaching end of blob");\r
\r
MemoryBlock blob;\r
+\r
auto bytesRead = input.readIntoMemoryBlock (blob, (ssize_t) blobDataSize);\r
readPaddingZeros (bytesRead);\r
\r
return blob;\r
}\r
\r
- OSCColour readColour()\r
- {\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading colour");\r
- return OSCColour::fromInt32 ((uint32) input.readIntBigEndian());\r
- }\r
-\r
OSCTimeTag readTimeTag()\r
{\r
- checkBytesAvailable (8, "OSC input stream exhausted while reading time tag");\r
+ if (input.getNumBytesRemaining() < 8)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading time tag");\r
+\r
return OSCTimeTag (uint64 (input.readInt64BigEndian()));\r
}\r
\r
{\r
OSCTypeList typeList;\r
\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading type tag string");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading type tag string");\r
\r
if (input.readByte() != ',')\r
throw OSCFormatError ("OSC input stream format error: expected type tag string");\r
case OSCTypes::float32: return OSCArgument (readFloat32());\r
case OSCTypes::string: return OSCArgument (readString());\r
case OSCTypes::blob: return OSCArgument (readBlob());\r
- case OSCTypes::colour: return OSCArgument (readColour());\r
\r
default:\r
// You supplied an invalid OSCType when calling readArgument! This should never happen.\r
// bundle, so we know when to consider the next element *not* part of this\r
// bundle anymore (but part of the outer bundle) and return.\r
\r
- checkBytesAvailable (16, "OSC input stream exhausted while reading bundle");\r
+ if (input.getNumBytesRemaining() < 16)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading bundle");\r
\r
if (readString() != "#bundle")\r
throw OSCFormatError ("OSC input stream format error: bundle does not start with string '#bundle'");\r
//==============================================================================\r
OSCBundle::Element readElement()\r
{\r
- checkBytesAvailable (4, "OSC input stream exhausted while reading bundle element size");\r
+ if (input.getNumBytesRemaining() < 4)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading bundle element size");\r
\r
auto elementSize = (size_t) readInt32();\r
\r
//==============================================================================\r
OSCBundle::Element readElementWithKnownSize (size_t elementSize)\r
{\r
- checkBytesAvailable ((int64) elementSize, "OSC input stream exhausted while reading bundle element content");\r
+ if ((uint64) input.getNumBytesRemaining() < elementSize)\r
+ throw OSCFormatError ("OSC input stream exhausted while reading bundle element content");\r
\r
auto firstContentChar = static_cast<const char*> (getData()) [getPosition()];\r
\r
OSCMessage readMessageWithCheckedSize (size_t size)\r
{\r
auto begin = (size_t) getPosition();\r
- auto message = readMessage();\r
+ OSCMessage message (readMessage());\r
\r
if (getPosition() - begin != size)\r
throw OSCFormatError ("OSC input stream format error: wrong element content size encountered while reading");\r
\r
return message;\r
}\r
-\r
- void checkBytesAvailable (int64 requiredBytes, const char* message)\r
- {\r
- if (input.getNumBytesRemaining() < requiredBytes)\r
- throw OSCFormatError (message);\r
- }\r
};\r
\r
} // namespace\r
struct OSCReceiver::Pimpl : private Thread,\r
private MessageListener\r
{\r
- Pimpl (const String& oscThreadName) : Thread (oscThreadName)\r
+ Pimpl (const String& threadName) : Thread (threadName)\r
{\r
}\r
\r
waitForThreadToExit (10000);\r
socket.reset();\r
}\r
-\r
return true;\r
}\r
\r
if (listeners.size() > 0 || listenersWithAddress.size() > 0)\r
postMessage (new CallbackMessage (content));\r
}\r
- catch (const OSCFormatError&)\r
+ catch (OSCFormatError)\r
{\r
if (formatErrorHandler != nullptr)\r
formatErrorHandler (data, (int) dataSize);\r
while (! threadShouldExit())\r
{\r
jassert (socket != nullptr);\r
- auto ready = socket->waitUntilReady (true, 100);\r
+ char buffer[oscBufferSize];\r
+ socket->waitUntilReady (true, -1);\r
\r
- if (ready < 0 || threadShouldExit())\r
+ if (threadShouldExit())\r
return;\r
\r
- if (ready == 0)\r
- continue;\r
-\r
- char buffer[oscBufferSize];\r
auto bytesRead = (size_t) socket->read (buffer, (int) sizeof (buffer), false);\r
\r
if (bytesRead >= 4)\r
\r
OSCInputStream inStream (data, sizeof (data));\r
\r
- auto msg = inStream.readMessage();\r
+ OSCMessage msg = inStream.readMessage();\r
expect (msg.getAddressPattern().toString() == "/test");\r
expect (msg.size() == 0);\r
}\r
\r
OSCInputStream inStream (data, sizeof (data));\r
\r
- auto msg = inStream.readMessage();\r
+ OSCMessage msg = inStream.readMessage();\r
\r
expectEquals (msg.getAddressPattern().toString(), String ("/test"));\r
expectEquals (msg.size(), 4);\r
and has to be either MessageLoopCallback or RealtimeCallback. If not specified,\r
MessageLoopCallback will be used by default.\r
\r
- Note: This type of listener will ignore OSC bundles.\r
+ Note: this type of listener will ignore OSC bundles.\r
\r
@see OSCReceiver::addListener, OSCReceiver::Listener,\r
OSCReceiver::MessageLoopCallback, OSCReceiver::RealtimeCallback\r
private:\r
//==============================================================================\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
friend struct OSCReceiverCallbackMessage;\r
\r
return output.writeRepeatedByte (0, numPaddingZeros);\r
}\r
\r
- bool writeColour (OSCColour colour)\r
- {\r
- return output.writeIntBigEndian ((int32) colour.toInt32());\r
- }\r
-\r
bool writeTimeTag (OSCTimeTag timeTag)\r
{\r
return output.writeInt64BigEndian (int64 (timeTag.getRawTimeTag()));\r
case OSCTypes::float32: return writeFloat32 (arg.getFloat32());\r
case OSCTypes::string: return writeString (arg.getString());\r
case OSCTypes::blob: return writeBlob (arg.getBlob());\r
- case OSCTypes::colour: return writeColour (arg.getColour());\r
\r
default:\r
// In this very unlikely case you supplied an invalid OSCType!\r
/** Connects to a datagram socket and prepares the socket for sending OSC\r
packets to the specified target.\r
\r
- Note: The operating system will choose which specific network adapter(s)\r
+ Note: the operating system will choose which specific network adapter(s)\r
to bind your socket to, and which local port to use for the sender.\r
\r
@param targetHostName The remote host to which messages will be send.\r
private:\r
//==============================================================================\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSCSender)\r
\r
namespace juce\r
{\r
-\r
-const OSCType OSCTypes::int32 = 'i';\r
-const OSCType OSCTypes::float32 = 'f';\r
-const OSCType OSCTypes::string = 's';\r
-const OSCType OSCTypes::blob = 'b';\r
-const OSCType OSCTypes::colour = 'r';\r
-\r
-uint32 OSCColour::toInt32() const\r
-{\r
- return ByteOrder::makeInt (alpha, blue, green, red);\r
+ const OSCType OSCTypes::int32 = 'i';\r
+ const OSCType OSCTypes::float32 = 'f';\r
+ const OSCType OSCTypes::string = 's';\r
+ const OSCType OSCTypes::blob = 'b';\r
}\r
-\r
-OSCColour OSCColour::fromInt32 (uint32 c)\r
-{\r
- return { (uint8) (c >> 24),\r
- (uint8) (c >> 16),\r
- (uint8) (c >> 8),\r
- (uint8) c };\r
-}\r
-\r
-} // namespace juce\r
{\r
\r
//==============================================================================\r
+\r
/** The type used for OSC type tags. */\r
-using OSCType = char;\r
+typedef char OSCType;\r
\r
\r
/** The type used for OSC type tag strings. */\r
-using OSCTypeList = Array<OSCType>;\r
+typedef Array<OSCType> OSCTypeList;\r
\r
//==============================================================================\r
+\r
/** The definitions of supported OSC types and their associated OSC type tags,\r
as defined in the OpenSoundControl 1.0 specification.\r
\r
- Note: This implementation does not support any additional type tags that\r
+ Note: this implementation does not support any additional type tags that\r
are not part of the specification.\r
\r
@tags{OSC}\r
static const OSCType float32;\r
static const OSCType string;\r
static const OSCType blob;\r
- static const OSCType colour;\r
\r
static bool isSupportedType (OSCType type) noexcept\r
{\r
return type == OSCTypes::int32\r
|| type == OSCTypes::float32\r
|| type == OSCTypes::string\r
- || type == OSCTypes::blob\r
- || type == OSCTypes::colour;\r
+ || type == OSCTypes::blob;\r
}\r
};\r
\r
-\r
-//==============================================================================\r
-/**\r
- Holds a 32-bit RGBA colour for passing to and from an OSCArgument.\r
- @see OSCArgument, OSCTypes::colour\r
- @tags{OSC}\r
-*/\r
-struct OSCColour\r
-{\r
- uint8 red, green, blue, alpha;\r
-\r
- uint32 toInt32() const;\r
- static OSCColour fromInt32 (uint32);\r
-};\r
-\r
-\r
//==============================================================================\r
/** Base class for exceptions that can be thrown by methods in the OSC module.\r
\r
//==============================================================================\r
/** Exception type thrown in cases of unexpected errors in the OSC module.\r
\r
- Note: This should never happen, and all the places where this is thrown\r
+ Note: this should never happen, and all the places where this is thrown\r
should have a preceding jassertfalse to facilitate debugging.\r
\r
@tags{OSC}\r
\r
InAppPurchases class will own downloads and will delete them as soon as they are finished.\r
\r
- NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens,\r
+ NOTE: it is possible to receive this callback for the same purchase multiple times. If that happens,\r
only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore!\r
*/\r
virtual void productPurchaseFinished (const PurchaseInfo&, bool /*success*/, const String& /*statusDescription*/) {}\r
/** Called when a list of all purchases is restored. This can be used to figure out to\r
which products a user is entitled to.\r
\r
- NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens,\r
+ NOTE: it is possible to receive this callback for the same purchase multiple times. If that happens,\r
only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore!\r
*/\r
virtual void purchasesListRestored (const Array<PurchaseInfo>&, bool /*success*/, const String& /*statusDescription*/) {}\r
/** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListReceived()\r
callback will be invoked. The user may be prompted to login first.\r
\r
- @param includeDownloadInfo (iOS only) if true, then after restoration is successful, the downloads array passed to\r
+ @param includeDownloadInfo (iOS only) if true, then after restoration is successfull, the downloads array passed to\r
Listener::purchasesListReceived() callback will contain all the download objects corresponding with\r
the purchase. In the opposite case, the downloads array will be empty.\r
\r
\r
ID: juce_product_unlocking\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE Online marketplace support\r
description: Classes for online product authentication\r
website: http://www.juce.com/juce\r
\r
const int buttonHeight = 22;\r
\r
- auto r = getLocalBounds().reduced (10, 20);\r
+ Rectangle<int> r (getLocalBounds().reduced (10, 20));\r
\r
- auto buttonArea = r.removeFromBottom (buttonHeight);\r
+ Rectangle<int> buttonArea (r.removeFromBottom (buttonHeight));\r
registerButton.changeWidthToFitText (buttonHeight);\r
cancelButton.changeWidthToFitText (buttonHeight);\r
\r
namespace juce\r
{\r
\r
-/* Note: There's a bit of light obfuscation in this code, just to make things\r
+/* Note: there's a bit of light obfuscation in this code, just to make things\r
a bit more annoying for crackers who try to reverse-engineer your binaries, but\r
nothing particularly foolproof.\r
*/\r
{\r
key.applyToValue (val);\r
\r
- auto mb = val.toMemoryBlock();\r
+ const MemoryBlock mb (val.toMemoryBlock());\r
\r
if (CharPointer_UTF8::isValidString (static_cast<const char*> (mb.getData()), (int) mb.getSize()))\r
- xml = parseXML (mb.toString());\r
+ xml.reset (XmlDocument::parse (mb.toString()));\r
}\r
\r
return xml != nullptr ? *xml : XmlElement("key");\r
\r
for (int i = 0; i < localMachineNumbers.size(); ++i)\r
{\r
- auto localNumber = localMachineNumbers[i].trim();\r
+ String localNumber (localMachineNumbers[i].trim());\r
\r
if (localNumber.isNotEmpty())\r
{\r
if (result)\r
break;\r
}\r
-\r
- if (result)\r
- break;\r
}\r
}\r
\r
\r
String OnlineUnlockStatus::MachineIDUtilities::getEncodedIDString (const String& input)\r
{\r
- auto platform = String::charToString (static_cast<juce_wchar> (getPlatformPrefix()));\r
+ const String platform (String::charToString (static_cast<juce_wchar> (getPlatformPrefix())));\r
\r
return platform + MD5 ((input + "salt_1" + platform).toUTF8())\r
.toHexString().substring (0, 9).toUpperCase();\r
\r
bool OnlineUnlockStatus::MachineIDUtilities::addFileIDToList (StringArray& ids, const File& f)\r
{\r
- if (auto num = f.getFileIdentifier())\r
+ if (uint64 num = f.getFileIdentifier())\r
{\r
ids.add (getEncodedIDString (String::toHexString ((int64) num)));\r
return true;\r
\r
void OnlineUnlockStatus::MachineIDUtilities::addMACAddressesToList (StringArray& ids)\r
{\r
- for (auto& address : MACAddress::getAllAddresses())\r
- ids.add (getEncodedIDString (address.toString()));\r
+ Array<MACAddress> addresses;\r
+ MACAddress::findAllAddresses (addresses);\r
+\r
+ for (int i = 0; i < addresses.size(); ++i)\r
+ ids.add (getEncodedIDString (addresses.getReference(i).toString()));\r
}\r
\r
StringArray OnlineUnlockStatus::MachineIDUtilities::getLocalMachineIDs()\r
{\r
auto identifiers = SystemStats::getDeviceIdentifiers();\r
-\r
for (auto& identifier : identifiers)\r
identifier = getEncodedIDString (identifier);\r
\r
{\r
UnlockResult r;\r
\r
- if (auto keyNode = xml.getChildByName ("KEY"))\r
+ if (const XmlElement* keyNode = xml.getChildByName ("KEY"))\r
{\r
const String keyText (keyNode->getAllSubText().trim());\r
r.succeeded = keyText.length() > 10 && applyKeyFile (keyText);\r
r.urlToLaunch = xml.getStringAttribute ("url").trim();\r
\r
if (r.errorMessage.isEmpty() && r.informativeMessage.isEmpty() && r.urlToLaunch.isEmpty() && ! r.succeeded)\r
- r.errorMessage = getMessageForUnexpectedReply();\r
+ r.errorMessage = TRANS ("Unexpected or corrupted reply from XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n"\r
+ + TRANS("Please try again in a few minutes, and contact us for support if this message appears again.");\r
\r
return r;\r
}\r
{\r
UnlockResult r;\r
r.succeeded = false;\r
- r.errorMessage = getMessageForConnectionFailure (areMajorWebsitesAvailable());\r
- return r;\r
-}\r
\r
-String OnlineUnlockStatus::getMessageForConnectionFailure (bool isInternetConnectionWorking)\r
-{\r
- String message = TRANS("Couldn't connect to XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n";\r
+ r.errorMessage = TRANS("Couldn't connect to XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n";\r
\r
- if (isInternetConnectionWorking)\r
- message << TRANS("Your internet connection seems to be OK, but our webserver "\r
- "didn't respond... This is most likely a temporary problem, so try "\r
- "again in a few minutes, but if it persists, please contact us for support!");\r
+ if (areMajorWebsitesAvailable())\r
+ r.errorMessage << TRANS("Your internet connection seems to be OK, but our webserver "\r
+ "didn't respond... This is most likely a temporary problem, so try "\r
+ "again in a few minutes, but if it persists, please contact us for support!");\r
else\r
- message << TRANS("No internet sites seem to be accessible from your computer.. Before trying again, "\r
- "please check that your network is working correctly, and make sure "\r
- "that any firewall/security software installed on your machine isn't "\r
- "blocking your web connection.");\r
+ r.errorMessage << TRANS("No internet sites seem to be accessible from your computer.. Before trying again, "\r
+ "please check that your network is working correctly, and make sure "\r
+ "that any firewall/security software installed on your machine isn't "\r
+ "blocking your web connection.");\r
\r
- return message;\r
-}\r
-\r
-String OnlineUnlockStatus::getMessageForUnexpectedReply()\r
-{\r
- return TRANS ("Unexpected or corrupted reply from XYZ").replace ("XYZ", getWebsiteName()) + "...\n\n"\r
- + TRANS("Please try again in a few minutes, and contact us for support if this message appears again.");\r
+ return r;\r
}\r
\r
OnlineUnlockStatus::UnlockResult OnlineUnlockStatus::attemptWebserverUnlock (const String& email,\r
// This method will block while it contacts the server, so you must run it on a background thread!\r
jassert (! MessageManager::getInstance()->isThisTheMessageThread());\r
\r
- auto reply = readReplyFromWebserver (email, password);\r
+ String reply (readReplyFromWebserver (email, password));\r
\r
DBG ("Reply from server: " << reply);\r
\r
- if (auto xml = parseXML (reply))\r
+ std::unique_ptr<XmlElement> xml (XmlDocument::parse (reply));\r
+\r
+ if (xml != nullptr)\r
return handleXmlReply (*xml);\r
\r
return handleFailedConnection();\r
const String& machineNumbers,\r
const RSAKey& privateKey)\r
{\r
- auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach");\r
- auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers);\r
+ XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "mach"));\r
+ const String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers));\r
\r
return KeyFileUtils::createKeyFile (comment, xml, privateKey);\r
}\r
const Time expiryTime,\r
const RSAKey& privateKey)\r
{\r
- auto xml = KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach");\r
+ XmlElement xml (KeyFileUtils::createKeyFileContent (appName, userEmail, userName, machineNumbers, "expiring_mach"));\r
xml.setAttribute ("expiryTime", String::toHexString (expiryTime.toMilliseconds()));\r
\r
- auto comment = KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers);\r
+ String comment (KeyFileUtils::createKeyFileComment (appName, userEmail, userName, machineNumbers));\r
comment << newLine << "Expires: " << expiryTime.toString (true, true);\r
\r
return KeyFileUtils::createKeyFile (comment, xml, privateKey);\r
*/\r
virtual void userCancelled();\r
\r
- virtual String getMessageForConnectionFailure (bool isInternetConnectionWorking);\r
- virtual String getMessageForUnexpectedReply();\r
-\r
//==============================================================================\r
// The following methods can be called by your app:\r
\r
if (thread->threadShouldExit() || stream->isError() || (contentLength > 0 && downloaded < contentLength))\r
return {};\r
\r
- return { CharPointer_UTF8 (buffer.get()), static_cast<size_t> (downloaded) };\r
+ return { CharPointer_UTF8 (buffer.get()) };\r
}\r
\r
return {};\r
METHOD (consumePurchase, "consumePurchase", "(ILjava/lang/String;Ljava/lang/String;)I") \\r
METHOD (getPurchaseHistory, "getPurchaseHistory", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;")\r
\r
-DECLARE_JNI_CLASS (IInAppBillingService, "com/android/vending/billing/IInAppBillingService")\r
+DECLARE_JNI_CLASS (IInAppBillingService, "com/android/vending/billing/IInAppBillingService");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (asInterface, "asInterface", "(Landroid/os/IBinder;)Lcom/android/vending/billing/IInAppBillingService;") \\r
\r
-DECLARE_JNI_CLASS (IInAppBillingServiceStub, "com/android/vending/billing/IInAppBillingService$Stub")\r
+DECLARE_JNI_CLASS (IInAppBillingServiceStub, "com/android/vending/billing/IInAppBillingService$Stub");\r
#undef JNI_CLASS_MEMBERS\r
\r
//==============================================================================\r
auto* env = getEnv();\r
\r
auto responseCodeString = javaString ("RESPONSE_CODE");\r
- auto responseCode = env->CallIntMethod (buyIntentBundle.get(), AndroidBundle.getInt, responseCodeString.get());\r
+ auto responseCode = env->CallIntMethod (buyIntentBundle.get(), JavaBundle.getInt, responseCodeString.get());\r
\r
if (responseCode == 0)\r
{\r
auto buyIntentString = javaString ("BUY_INTENT");\r
- auto pendingIntent = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), AndroidBundle.getParcelable, buyIntentString.get()));\r
+ auto pendingIntent = LocalRef<jobject> (env->CallObjectMethod (buyIntentBundle.get(), JavaBundle.getParcelable, buyIntentString.get()));\r
\r
auto requestCode = 1001;\r
auto intentSender = LocalRef<jobject> (env->CallObjectMethod (pendingIntent.get(), AndroidPendingIntent.getIntentSender));\r
for (const auto& identifier : subscriptionIdentifiers)\r
env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (identifier).get());\r
\r
- auto extraParams = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+ auto extraParams = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
\r
if (extraParams.get() == 0)\r
{\r
auto skusToReplaceString = javaString ("skusToReplace");\r
auto replaceSkusProrationString = javaString ("replaceSkusProration");\r
\r
- env->CallVoidMethod (extraParams.get(), AndroidBundle.putStringArrayList, skusToReplaceString.get(), skuList.get());\r
- env->CallVoidMethod (extraParams.get(), AndroidBundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);\r
+ env->CallVoidMethod (extraParams.get(), JavaBundle.putStringArrayList, skusToReplaceString.get(), skuList.get());\r
+ env->CallVoidMethod (extraParams.get(), JavaBundle.putBoolean, replaceSkusProrationString.get(), creditForUnusedSubscription);\r
\r
return LocalRef<jobject> (inAppBillingService.callObjectMethod (IInAppBillingService.getBuyIntentExtraParams, 6,\r
getPackageName().get(), skuString.get(),\r
for (const auto& pi : productIdentifiersToQuery)\r
env->CallBooleanMethod (skuList.get(), JavaArrayList.add, javaString (pi).get());\r
\r
- auto querySkus = LocalRef<jobject> (env->NewObject (AndroidBundle, AndroidBundle.constructor));\r
+ auto querySkus = LocalRef<jobject> (env->NewObject (JavaBundle, JavaBundle.constructor));\r
\r
if (querySkus.get() == 0)\r
return LocalRef<jobject> (0);\r
\r
auto itemIdListString = javaString ("ITEM_ID_LIST");\r
\r
- env->CallVoidMethod (querySkus.get(), AndroidBundle.putStringArrayList, itemIdListString.get(), skuList.get());\r
+ env->CallVoidMethod (querySkus.get(), JavaBundle.putStringArrayList, itemIdListString.get(), skuList.get());\r
\r
auto productTypeString = javaString (productType);\r
\r
\r
auto responseCodeString = javaString ("RESPONSE_CODE");\r
\r
- auto responseCode = env->CallIntMethod (retrievedProducts.get(), AndroidBundle.getInt, responseCodeString.get());\r
+ auto responseCode = env->CallIntMethod (retrievedProducts.get(), JavaBundle.getInt, responseCodeString.get());\r
\r
if (responseCode == 0)\r
{\r
auto detailsListString = javaString ("DETAILS_LIST");\r
\r
- auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), AndroidBundle.getStringArrayList,\r
+ auto responseList = LocalRef<jobject> (env->CallObjectMethod (retrievedProducts.get(), JavaBundle.getStringArrayList,\r
detailsListString.get()));\r
\r
if (responseList != 0)\r
if (ownedItems.get() != 0)\r
{\r
auto responseCodeString = javaString ("RESPONSE_CODE");\r
- auto responseCode = env->CallIntMethod (ownedItems.get(), AndroidBundle.getInt, responseCodeString.get());\r
+ auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());\r
\r
if (responseCode == 0)\r
{\r
auto signatureListString = javaString ("INAPP_DATA_SIGNATURE_LIST");\r
auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");\r
\r
- auto ownedSkus = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, itemListString.get()));\r
- auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, dataListString.get()));\r
- auto signatureList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, signatureListString.get()));\r
- auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), AndroidBundle.getString, continuationTokenString.get()));\r
+ auto ownedSkus = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, itemListString.get()));\r
+ auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));\r
+ auto signatureList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, signatureListString.get()));\r
+ auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));\r
\r
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)\r
{\r
auto* env = getEnv();\r
\r
auto responseCodeString = javaString ("RESPONSE_CODE");\r
- auto responseCode = env->CallIntMethod (ownedItems.get(), AndroidBundle.getInt, responseCodeString.get());\r
+ auto responseCode = env->CallIntMethod (ownedItems.get(), JavaBundle.getInt, responseCodeString.get());\r
\r
if (responseCode == 0)\r
{\r
auto dataListString = javaString ("INAPP_PURCHASE_DATA_LIST");\r
auto continuationTokenString = javaString ("INAPP_CONTINUATION_TOKEN");\r
\r
- auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), AndroidBundle.getStringArrayList, dataListString.get()));\r
- auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), AndroidBundle.getString, continuationTokenString.get()));\r
+ auto purchaseDataList = LocalRef<jobject> (env->CallObjectMethod (ownedItems.get(), JavaBundle.getStringArrayList, dataListString.get()));\r
+ auto newContinuationToken = LocalRef<jstring> ((jstring) env->CallObjectMethod (ownedItems.get(), JavaBundle.getString, continuationTokenString.get()));\r
\r
for (auto i = 0; i < env->CallIntMethod (purchaseDataList.get(), JavaArrayList.size); ++i)\r
{\r
\r
void getProductsInformation (const StringArray& productIdentifiers)\r
{\r
- auto productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithArray: createNSArrayFromStringArray (productIdentifiers)]];\r
+ auto* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithArray: createNSArrayFromStringArray (productIdentifiers)]];\r
\r
pendingProductInfoRequests.add (new PendingProductInfoRequest { PendingProductInfoRequest::Type::query,\r
std::unique_ptr<SKProductsRequest, NSObjectDeleter> (productsRequest) });\r
return;\r
}\r
\r
- auto productIdentifiers = [NSArray arrayWithObject: juceStringToNS (productIdentifier)];\r
- auto productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];\r
+ auto* productIdentifiers = [NSArray arrayWithObject: juceStringToNS (productIdentifier)];\r
+ auto* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];\r
\r
pendingProductInfoRequests.add (new PendingProductInfoRequest { PendingProductInfoRequest::Type::purchase,\r
std::unique_ptr<SKProductsRequest, NSObjectDeleter> (productsRequest) });\r
}\r
else\r
{\r
- auto receiptRequest = [[SKReceiptRefreshRequest alloc] init];\r
+ auto* receiptRequest = [[SKReceiptRefreshRequest alloc] init];\r
\r
pendingReceiptRefreshRequests.add (new PendingReceiptRefreshRequest { subscriptionsSharedSecret,\r
std::unique_ptr<SKReceiptRefreshRequest, NSObjectDeleter> ([receiptRequest retain]) });\r
jassert ([products count] == 1);\r
\r
auto* product = products[0];\r
- auto payment = [SKPayment paymentWithProduct: product];\r
+ auto* payment = [SKPayment paymentWithProduct: product];\r
[[SKPaymentQueue defaultQueue] addPayment: payment];\r
}\r
else\r
//==============================================================================\r
void processReceiptRefreshResponseWithSubscriptionsSharedSecret (const String& secret)\r
{\r
- auto receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];\r
+ auto* receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];\r
\r
- if (auto receiptData = [NSData dataWithContentsOfURL: receiptURL])\r
+ if (auto* receiptData = [NSData dataWithContentsOfURL: receiptURL])\r
fetchReceiptDetailsFromAppStore (receiptData, secret);\r
else\r
owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Receipt fetch failed")); });\r
\r
void fetchReceiptDetailsFromAppStore (NSData* receiptData, const String& secret)\r
{\r
- auto requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
+ auto* requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
[requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: nsStringLiteral ("receipt-data")];\r
\r
if (secret.isNotEmpty())\r
[requestContents setObject: juceStringToNS (secret) forKey: nsStringLiteral ("password")];\r
\r
NSError* error;\r
- auto requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
- options: 0\r
- error: &error];\r
+ auto* requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
+ options: 0\r
+ error: &error];\r
if (requestData == nil)\r
{\r
sendReceiptFetchFail();\r
#endif\r
\r
// TODO: use juce URL here\r
- auto storeRequest = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: nsStringLiteral (storeURL)]];\r
+ auto* storeRequest = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: nsStringLiteral (storeURL)]];\r
[storeRequest setHTTPMethod: nsStringLiteral ("POST")];\r
[storeRequest setHTTPBody: requestData];\r
\r
- auto task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
- completionHandler:\r
- ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
- {\r
- if (connectionError != nil)\r
- {\r
- sendReceiptFetchFail();\r
- }\r
- else\r
- {\r
- NSError* err;\r
-\r
- if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
- processReceiptDetails (receiptDetails);\r
- else\r
- sendReceiptFetchFail();\r
- }\r
- }];\r
+ auto* task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
+ completionHandler:\r
+ ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
+ {\r
+ if (connectionError != nil)\r
+ {\r
+ sendReceiptFetchFail();\r
+ }\r
+ else\r
+ {\r
+ NSError* err;\r
+\r
+ if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
+ processReceiptDetails (receiptDetails);\r
+ else\r
+ sendReceiptFetchFail();\r
+ }\r
+ }];\r
\r
[task resume];\r
}\r
}\r
else if (auto dateAsString = getAs<NSString> (date))\r
{\r
- auto formatter = [[NSNumberFormatter alloc] init];\r
+ auto* formatter = [[NSNumberFormatter alloc] init];\r
[formatter setNumberStyle: NSNumberFormatterDecimalStyle];\r
dateAsNumber = [formatter numberFromString: dateAsString];\r
[formatter release];\r
\r
pendingOpen.device->pimpl->open ([this](const String& deviceId, const String& error)\r
{\r
- int cIndex = getCameraIndex (deviceId);\r
+ int index = getCameraIndex (deviceId);\r
\r
- if (cIndex == -1)\r
+ if (index == -1)\r
return;\r
\r
- auto& cameraPendingOpen = camerasToOpen.getReference (cIndex);\r
+ auto& pendingOpen = camerasToOpen.getReference (index);\r
\r
if (error.isEmpty())\r
- cameraPendingOpen.resultCallback (cameraPendingOpen.device.release(), error);\r
+ pendingOpen.resultCallback (pendingOpen.device.release(), error);\r
else\r
- cameraPendingOpen.resultCallback (nullptr, error);\r
+ pendingOpen.resultCallback (nullptr, error);\r
\r
- int id = cameraPendingOpen.requestId;\r
+ int id = pendingOpen.requestId;\r
\r
MessageManager::callAsync ([this, id]() { removeRequestWithId (id); });\r
});\r
/** Creates a component that can be used to display a preview of the\r
video from this camera.\r
\r
- Note: While you can change the size of the preview component, the actual\r
+ Note: while you can change the size of the preview component, the actual\r
preview display may be smaller than the size requested, because the correct\r
aspect ratio is maintained automatically.\r
*/\r
String name;\r
\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
struct ViewerComponent;\r
\r
ID: juce_video\r
vendor: juce\r
- version: 5.4.1\r
+ version: 5.3.2\r
name: JUCE video playback and capture classes\r
description: Classes for playing video and capturing camera input.\r
website: http://www.juce.com/juce\r
#undef JUCE_USE_CAMERA\r
#endif\r
\r
-//=============================================================================\r
-/** Config: JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- Enables synchronisation between video playback volume and OS media volume.\r
- Currently supported on Android only.\r
- */\r
-#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- #define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1\r
-#endif\r
-\r
-#ifndef JUCE_VIDEO_LOG_ENABLED\r
- #define JUCE_VIDEO_LOG_ENABLED 1\r
-#endif\r
-\r
-#if JUCE_VIDEO_LOG_ENABLED\r
- #define JUCE_VIDEO_LOG(x) DBG(x)\r
-#else\r
- #define JUCE_VIDEO_LOG(x) {}\r
-#endif\r
-\r
//=============================================================================\r
#include "playback/juce_VideoComponent.h"\r
#include "capture/juce_CameraDevice.h"\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICMETHOD (valueOf, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$CompressFormat;")\r
\r
-DECLARE_JNI_CLASS (AndroidBitmapCompressFormat, "android/graphics/Bitmap$CompressFormat")\r
+DECLARE_JNI_CLASS (AndroidBitmapCompressFormat, "android/graphics/Bitmap$CompressFormat");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (createCaptureRequest, "createCaptureRequest", "(I)Landroid/hardware/camera2/CaptureRequest$Builder;") \\r
METHOD (createCaptureSession, "createCaptureSession", "(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V")\r
\r
-DECLARE_JNI_CLASS (AndroidCameraDevice, "android/hardware/camera2/CameraDevice")\r
+DECLARE_JNI_CLASS (AndroidCameraDevice, "android/hardware/camera2/CameraDevice");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (close, "close", "()V") \\r
METHOD (getPlanes, "getPlanes", "()[Landroid/media/Image$Plane;")\r
\r
-DECLARE_JNI_CLASS (AndroidImage, "android/media/Image")\r
+DECLARE_JNI_CLASS (AndroidImage, "android/media/Image");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getBuffer, "getBuffer", "()Ljava/nio/ByteBuffer;")\r
\r
-DECLARE_JNI_CLASS (AndroidImagePlane, "android/media/Image$Plane")\r
+DECLARE_JNI_CLASS (AndroidImagePlane, "android/media/Image$Plane");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setOnImageAvailableListener, "setOnImageAvailableListener", "(Landroid/media/ImageReader$OnImageAvailableListener;Landroid/os/Handler;)V") \\r
STATICMETHOD (newInstance, "newInstance", "(IIII)Landroid/media/ImageReader;")\r
\r
-DECLARE_JNI_CLASS (AndroidImageReader, "android/media/ImageReader")\r
+DECLARE_JNI_CLASS (AndroidImageReader, "android/media/ImageReader");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (start, "start", "()V") \\r
METHOD (stop, "stop", "()V")\r
\r
-DECLARE_JNI_CLASS (AndroidMediaRecorder, "android/media/MediaRecorder")\r
+DECLARE_JNI_CLASS (AndroidMediaRecorder, "android/media/MediaRecorder");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setSurfaceTextureListener, "setSurfaceTextureListener", "(Landroid/view/TextureView$SurfaceTextureListener;)V") \\r
METHOD (setTransform, "setTransform", "(Landroid/graphics/Matrix;)V")\r
\r
-DECLARE_JNI_CLASS (AndroidTextureView, "android/view/TextureView")\r
+DECLARE_JNI_CLASS (AndroidTextureView, "android/view/TextureView");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(Landroid/graphics/SurfaceTexture;)V")\r
\r
-DECLARE_JNI_CLASS (AndroidSurface, "android/view/Surface")\r
+DECLARE_JNI_CLASS (AndroidSurface, "android/view/Surface");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (setDefaultBufferSize, "setDefaultBufferSize", "(II)V")\r
\r
-DECLARE_JNI_CLASS (AndroidSurfaceTexture, "android/graphics/SurfaceTexture")\r
+DECLARE_JNI_CLASS (AndroidSurfaceTexture, "android/graphics/SurfaceTexture");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (isOutputSupportedFor, "isOutputSupportedFor", "(I)Z") \\r
METHOD (isOutputSupportedForSurface, "isOutputSupportedFor", "(Landroid/view/Surface;)Z")\r
\r
-DECLARE_JNI_CLASS (AndroidStreamConfigurationMap, "android/hardware/camera2/params/StreamConfigurationMap")\r
+DECLARE_JNI_CLASS (AndroidStreamConfigurationMap, "android/hardware/camera2/params/StreamConfigurationMap");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (toByteArray, "toByteArray", "()[B") \\r
METHOD (size, "size", "()I")\r
\r
-DECLARE_JNI_CLASS (ByteArrayOutputStream, "java/io/ByteArrayOutputStream")\r
+DECLARE_JNI_CLASS (ByteArrayOutputStream, "java/io/ByteArrayOutputStream");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";JZ)V")\r
\r
-DECLARE_JNI_CLASS (CameraCaptureSessionCaptureCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionCaptureCallback")\r
+DECLARE_JNI_CLASS (CameraCaptureSessionCaptureCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionCaptureCallback");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
\r
-DECLARE_JNI_CLASS (CameraCaptureSessionStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionStateCallback")\r
+DECLARE_JNI_CLASS (CameraCaptureSessionStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraCaptureSessionStateCallback");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICFIELD (SCALER_STREAM_CONFIGURATION_MAP, "SCALER_STREAM_CONFIGURATION_MAP", "Landroid/hardware/camera2/CameraCharacteristics$Key;") \\r
STATICFIELD (SENSOR_ORIENTATION, "SENSOR_ORIENTATION", "Landroid/hardware/camera2/CameraCharacteristics$Key;")\r
\r
-DECLARE_JNI_CLASS (CameraCharacteristics, "android/hardware/camera2/CameraCharacteristics")\r
+DECLARE_JNI_CLASS (CameraCharacteristics, "android/hardware/camera2/CameraCharacteristics");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getName, "getName", "()Ljava/lang/String;")\r
\r
-DECLARE_JNI_CLASS (CameraCharacteristicsKey, "android/hardware/camera2/CameraCharacteristics$Key")\r
+DECLARE_JNI_CLASS (CameraCharacteristicsKey, "android/hardware/camera2/CameraCharacteristics$Key");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V")\r
\r
-DECLARE_JNI_CLASS (CameraDeviceStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraDeviceStateCallback")\r
+DECLARE_JNI_CLASS (CameraDeviceStateCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$CameraDeviceStateCallback");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (getCameraIdList, "getCameraIdList", "()[Ljava/lang/String;") \\r
METHOD (openCamera, "openCamera", "(Ljava/lang/String;Landroid/hardware/camera2/CameraDevice$StateCallback;Landroid/os/Handler;)V")\r
\r
-DECLARE_JNI_CLASS (CameraManager, "android/hardware/camera2/CameraManager")\r
+DECLARE_JNI_CLASS (CameraManager, "android/hardware/camera2/CameraManager");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICFIELD (CONTROL_AF_TRIGGER, "CONTROL_AF_TRIGGER", "Landroid/hardware/camera2/CaptureRequest$Key;") \\r
STATICFIELD (CONTROL_MODE, "CONTROL_MODE", "Landroid/hardware/camera2/CaptureRequest$Key;")\r
\r
-DECLARE_JNI_CLASS (CaptureRequest, "android/hardware/camera2/CaptureRequest")\r
+DECLARE_JNI_CLASS (CaptureRequest, "android/hardware/camera2/CaptureRequest");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (build, "build", "()Landroid/hardware/camera2/CaptureRequest;") \\r
METHOD (set, "set", "(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;)V")\r
\r
-DECLARE_JNI_CLASS (CaptureRequestBuilder, "android/hardware/camera2/CaptureRequest$Builder")\r
+DECLARE_JNI_CLASS (CaptureRequestBuilder, "android/hardware/camera2/CaptureRequest$Builder");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
STATICFIELD (CONTROL_AE_STATE, "CONTROL_AE_STATE", "Landroid/hardware/camera2/CaptureResult$Key;") \\r
STATICFIELD (CONTROL_AF_STATE, "CONTROL_AF_STATE", "Landroid/hardware/camera2/CaptureResult$Key;")\r
\r
-DECLARE_JNI_CLASS (CaptureResult, "android/hardware/camera2/CaptureResult")\r
+DECLARE_JNI_CLASS (CaptureResult, "android/hardware/camera2/CaptureResult");\r
#undef JNI_CLASS_MEMBERS\r
\r
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
METHOD (disable, "disable", "()V") \\r
METHOD (enable, "enable", "()V")\r
\r
-DECLARE_JNI_CLASS (OrientationEventListener, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceOrientationEventListener")\r
+DECLARE_JNI_CLASS (OrientationEventListener, JUCE_ANDROID_ACTIVITY_CLASSPATH "$JuceOrientationEventListener");\r
#undef JNI_CLASS_MEMBERS\r
#endif\r
\r
Owner& owner;\r
};\r
\r
+//==============================================================================\r
+class AppPausedResumedListener : public AndroidInterfaceImplementer\r
+{\r
+public:\r
+ struct Owner\r
+ {\r
+ virtual ~Owner() {}\r
+\r
+ virtual void appPaused() = 0;\r
+ virtual void appResumed() = 0;\r
+ };\r
+\r
+ AppPausedResumedListener (Owner& ownerToUse)\r
+ : owner (ownerToUse)\r
+ {}\r
+\r
+ jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
+ {\r
+ auto* env = getEnv();\r
+\r
+ auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
+\r
+ int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
+\r
+ if (methodName == "appPaused" && numArgs == 0)\r
+ {\r
+ owner.appPaused();\r
+ return nullptr;\r
+ }\r
+\r
+ if (methodName == "appResumed" && numArgs == 0)\r
+ {\r
+ owner.appResumed();\r
+ return nullptr;\r
+ }\r
+\r
+ return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
+ }\r
+\r
+private:\r
+ Owner& owner;\r
+};\r
+\r
//==============================================================================\r
struct CameraDevice::Pimpl\r
#if __ANDROID_API__ >= 21\r
appPausedResumedListener (*this),\r
appPausedResumedListenerNative (CreateJavaInterface (&appPausedResumedListener,\r
JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener").get()),\r
+\r
cameraManager (initialiseCameraManager()),\r
cameraCharacteristics (initialiseCameraCharacteristics (cameraManager, cameraId)),\r
streamConfigurationMap (cameraCharacteristics),\r
\r
JUCE_CAMERA_LOG ("Camera id: " + cameraId + ", characteristics keys num: " + String (size));\r
\r
- for (int ikey = 0; ikey < size; ++ikey)\r
+ for (int i = 0; i < size; ++i)\r
{\r
- auto key = LocalRef<jobject> (env->CallObjectMethod (keysList, JavaList.get, ikey));\r
+ auto key = LocalRef<jobject> (env->CallObjectMethod (keysList, JavaList.get, i));\r
auto jKeyName = LocalRef<jstring> ((jstring) env->CallObjectMethod (key, CameraCharacteristicsKey.getName));\r
auto keyName = juceString (jKeyName);\r
\r
}\r
else if (kvs.startsWith ("[Landroid.util.Range"))\r
{\r
- printRangeArrayElements (keyValue);\r
+ printRangeArrayElements (keyValue, keyName);\r
}\r
else\r
{\r
JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result);\r
}\r
\r
- static void printRangeArrayElements (const LocalRef<jobject>& rangeArray)\r
+ static void printRangeArrayElements (const LocalRef<jobject>& rangeArray, const String& keyName)\r
{\r
auto* env = getEnv();\r
\r
class StreamConfigurationMap\r
{\r
public:\r
- StreamConfigurationMap (const GlobalRef& characteristics)\r
- : scalerStreamConfigurationMap (getStreamConfigurationMap (characteristics)),\r
+ StreamConfigurationMap (const GlobalRef& cameraCharacteristics)\r
+ : scalerStreamConfigurationMap (getStreamConfigurationMap (cameraCharacteristics)),\r
supportedPreviewOutputSizes (retrieveOutputSizes (scalerStreamConfigurationMap,\r
getClassForName ("android.graphics.SurfaceTexture"),\r
-1)),\r
\r
bool isOutputSupportedForSurface (const LocalRef<jobject>& surface) const\r
{\r
- return getEnv()->CallBooleanMethod (scalerStreamConfigurationMap, AndroidStreamConfigurationMap.isOutputSupportedForSurface, surface.get()) != 0;\r
+ return getEnv()->CallBooleanMethod (scalerStreamConfigurationMap, AndroidStreamConfigurationMap.isOutputSupportedForSurface, surface.get());\r
}\r
\r
static constexpr int jpegImageFormat = 256;\r
Array<Rectangle<int>> supportedVideoRecordingOutputSizes;\r
Rectangle<int> defaultPreviewSize, previewBufferSize;\r
\r
- GlobalRef getStreamConfigurationMap (const GlobalRef& characteristics)\r
+ GlobalRef getStreamConfigurationMap (const GlobalRef& cameraCharacteristics)\r
{\r
auto* env = getEnv();\r
\r
auto scalerStreamConfigurationMapKey = LocalRef<jobject> (env->GetStaticObjectField (CameraCharacteristics,\r
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP));\r
\r
- return GlobalRef (LocalRef<jobject> (env->CallObjectMethod (characteristics,\r
+ return GlobalRef (LocalRef<jobject> (env->CallObjectMethod (cameraCharacteristics,\r
CameraCharacteristics.get,\r
scalerStreamConfigurationMapKey.get())));\r
}\r
auto byteArray = LocalRef<jbyteArray> (env->NewByteArray (bufferSize));\r
env->CallObjectMethod (imagePlaneBuffer, JavaByteBuffer.get, byteArray.get());\r
\r
+ auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
auto rotationAngle = getRotationAngle (deviceOrientationFromAccelerometerSensor, targetOrientation,\r
cameraLensFrontFacing, cameraSensorOrientation);\r
\r
bool cameraLensFrontFacing,\r
int cameraSensorOrientation)\r
{\r
+ auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
auto isSensorOrientationHorizontal = deviceOrientationFromAccelerometerSensor == Desktop::rotatedAntiClockwise\r
|| deviceOrientationFromAccelerometerSensor == Desktop::rotatedClockwise;\r
\r
auto origBitmapWidth = env->CallIntMethod (origBitmap, AndroidBitmap.getWidth);\r
auto origBitmapHeight = env->CallIntMethod (origBitmap, AndroidBitmap.getHeight);\r
\r
+ auto orientationsEnabled = Desktop::getInstance().getOrientationsEnabled() & ~Desktop::upsideDown;\r
+\r
auto matrix = LocalRef<jobject> (env->NewObject (AndroidMatrix, AndroidMatrix.constructor));\r
env->CallBooleanMethod (matrix, AndroidMatrix.postRotate, (jfloat) rotationAngle, (jfloat) 0, (jfloat) 0);\r
\r
\r
// ... ignore RuntimeException that can be thrown if stop() was called after recording\r
// has started but before any frame was written to a file. This is not an error.\r
- jniCheckHasExceptionOccurredAndClear();\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
+ env->ExceptionClear();\r
\r
unlockScreenOrientation();\r
}\r
}\r
}\r
\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
// When exception occurs, CameraCaptureSession.close will never finish, so\r
// we should not wait for it. For fatal error an exception does occur, but\r
// it is catched internally in Java...\r
- if (jniCheckHasExceptionOccurredAndClear() || scopedCameraDevice.fatalErrorOccurred.get())\r
+ if (exception != 0 || scopedCameraDevice.fatalErrorOccurred.get())\r
{\r
JUCE_CAMERA_LOG ("Exception or fatal error occurred while closing Capture Session, closing by force");\r
+\r
+ env->ExceptionClear();\r
}\r
else if (calledClose)\r
{\r
\r
void lockFocus()\r
{\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
JUCE_CAMERA_LOG ("Performing auto-focus if possible...");\r
// IllegalStateException can be thrown when accessing CaptureSession,\r
// claiming that capture session was already closed but we may not\r
// get relevant callback yet, so check for this and bailout when needed.\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
+ auto* env = getEnv();\r
+\r
switch (currentState)\r
{\r
case State::pendingFocusLock:\r
\r
void captureStillPictureDelayed()\r
{\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
JUCE_CAMERA_LOG ("Still picture capture, device ready, capturing now...");\r
\r
env->CallVoidMethod (captureSession, CameraCaptureSession.stopRepeating);\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
env->CallVoidMethod (captureSession, CameraCaptureSession.abortCaptures);\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
// Delay still picture capture for devices that can't handle it right after\r
\r
void runPrecaptureSequence()\r
{\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
auto* env = getEnv();\r
\r
void unlockFocus()\r
{\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
JUCE_CAMERA_LOG ("Unlocking focus...");\r
env->CallIntMethod (captureSession, CameraCaptureSession.capture, resetAutoFocusRequest.get(),\r
nullptr, handler.get());\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
// NB: for preview, using preview capture request again\r
\r
// If something went wrong we will be pinged in cameraDeviceStateError()\r
// callback, silence the redundant exception.\r
- jniCheckHasExceptionOccurredAndClear();\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
+ env->ExceptionClear();\r
}\r
\r
void close()\r
\r
env->CallVoidMethod (session, CameraCaptureSession.stopRepeating);\r
\r
- if (jniCheckHasExceptionOccurredAndClear())\r
+ if (Pimpl::checkHasExceptionOccurred())\r
return;\r
\r
env->CallVoidMethod (session, CameraCaptureSession.abortCaptures);\r
\r
- jniCheckHasExceptionOccurredAndClear();\r
+ Pimpl::checkHasExceptionOccurred();\r
}\r
}\r
\r
env->CallBooleanMethod (handlerThread, AndroidHandlerThread.quitSafely);\r
env->CallVoidMethod (handlerThread, AndroidHandlerThread.join);\r
\r
- jniCheckHasExceptionOccurredAndClear();\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
+ env->ExceptionClear();\r
\r
handlerThread.clear();\r
handler.clear();\r
}\r
+\r
+ static bool checkHasExceptionOccurred()\r
+ {\r
+ auto* env = getEnv();\r
+\r
+ auto exception = LocalRef<jobject> (env->ExceptionOccurred());\r
+\r
+ if (exception != 0)\r
+ {\r
+ env->ExceptionClear();\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
#endif\r
\r
friend struct CameraDevice::ViewerComponent;\r
+++ /dev/null
-/*\r
- ==============================================================================\r
-\r
- This file is part of the JUCE library.\r
- Copyright (c) 2018 - ROLI Ltd.\r
-\r
- Permission is granted to use this software under the terms of either:\r
- a) the GPL v2 (or any later version)\r
- b) the Affero GPL v3\r
-\r
- Details of these licenses can be found at: www.gnu.org/licenses\r
-\r
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY\r
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR\r
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r
-\r
- ------------------------------------------------------------------------------\r
-\r
- To release a closed-source product which uses JUCE, commercial licenses are\r
- available: visit www.juce.com for more information.\r
-\r
- ==============================================================================\r
-*/\r
-\r
-#if __ANDROID_API__ >= 21\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getPlaybackInfo, "getPlaybackInfo", "()Landroid/media/session/MediaController$PlaybackInfo;") \\r
- METHOD (getPlaybackState, "getPlaybackState", "()Landroid/media/session/PlaybackState;") \\r
- METHOD (getTransportControls, "getTransportControls", "()Landroid/media/session/MediaController$TransportControls;") \\r
- METHOD (registerCallback, "registerCallback", "(Landroid/media/session/MediaController$Callback;)V") \\r
- METHOD (setVolumeTo, "setVolumeTo", "(II)V") \\r
- METHOD (unregisterCallback, "unregisterCallback", "(Landroid/media/session/MediaController$Callback;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaController, "android/media/session/MediaController")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$MediaControllerCallback")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getAudioAttributes, "getAudioAttributes", "()Landroid/media/AudioAttributes;") \\r
- METHOD (getCurrentVolume, "getCurrentVolume", "()I") \\r
- METHOD (getMaxVolume, "getMaxVolume", "()I")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerPlaybackInfo, "android/media/session/MediaController$PlaybackInfo")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (pause, "pause", "()V") \\r
- METHOD (play, "play", "()V") \\r
- METHOD (playFromMediaId, "playFromMediaId", "(Ljava/lang/String;Landroid/os/Bundle;)V") \\r
- METHOD (seekTo, "seekTo", "(J)V") \\r
- METHOD (stop, "stop", "()V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaControllerTransportControls, "android/media/session/MediaController$TransportControls")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "()V") \\r
- METHOD (getCurrentPosition, "getCurrentPosition", "()I") \\r
- METHOD (getDuration, "getDuration", "()I") \\r
- METHOD (getPlaybackParams, "getPlaybackParams", "()Landroid/media/PlaybackParams;") \\r
- METHOD (getVideoHeight, "getVideoHeight", "()I") \\r
- METHOD (getVideoWidth, "getVideoWidth", "()I") \\r
- METHOD (isPlaying, "isPlaying", "()Z") \\r
- METHOD (pause, "pause", "()V") \\r
- METHOD (prepareAsync, "prepareAsync", "()V") \\r
- METHOD (release, "release", "()V") \\r
- METHOD (seekTo, "seekTo", "(I)V") \\r
- METHOD (setAudioAttributes, "setAudioAttributes", "(Landroid/media/AudioAttributes;)V") \\r
- METHOD (setDataSource, "setDataSource", "(Landroid/content/Context;Landroid/net/Uri;)V") \\r
- METHOD (setDisplay, "setDisplay", "(Landroid/view/SurfaceHolder;)V") \\r
- METHOD (setOnBufferingUpdateListener, "setOnBufferingUpdateListener", "(Landroid/media/MediaPlayer$OnBufferingUpdateListener;)V") \\r
- METHOD (setOnCompletionListener, "setOnCompletionListener", "(Landroid/media/MediaPlayer$OnCompletionListener;)V") \\r
- METHOD (setOnErrorListener, "setOnErrorListener", "(Landroid/media/MediaPlayer$OnErrorListener;)V") \\r
- METHOD (setOnInfoListener, "setOnInfoListener", "(Landroid/media/MediaPlayer$OnInfoListener;)V") \\r
- METHOD (setOnPreparedListener, "setOnPreparedListener", "(Landroid/media/MediaPlayer$OnPreparedListener;)V") \\r
- METHOD (setOnSeekCompleteListener, "setOnSeekCompleteListener", "(Landroid/media/MediaPlayer$OnSeekCompleteListener;)V") \\r
- METHOD (setPlaybackParams, "setPlaybackParams", "(Landroid/media/PlaybackParams;)V") \\r
- METHOD (setVolume, "setVolume", "(FF)V") \\r
- METHOD (start, "start", "()V") \\r
- METHOD (stop, "stop", "()V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaPlayer, "android/media/MediaPlayer")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(Landroid/content/Context;Ljava/lang/String;)V") \\r
- METHOD (getController, "getController", "()Landroid/media/session/MediaController;") \\r
- METHOD (release, "release", "()V") \\r
- METHOD (setActive, "setActive", "(Z)V") \\r
- METHOD (setCallback, "setCallback", "(Landroid/media/session/MediaSession$Callback;)V") \\r
- METHOD (setFlags, "setFlags", "(I)V") \\r
- METHOD (setMediaButtonReceiver, "setMediaButtonReceiver", "(Landroid/app/PendingIntent;)V") \\r
- METHOD (setMetadata, "setMetadata", "(Landroid/media/MediaMetadata;)V") \\r
- METHOD (setPlaybackState, "setPlaybackState", "(Landroid/media/session/PlaybackState;)V") \\r
- METHOD (setPlaybackToLocal, "setPlaybackToLocal", "(Landroid/media/AudioAttributes;)V")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaSession, "android/media/session/MediaSession")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";J)V") \\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaSessionCallback, JUCE_ANDROID_ACTIVITY_CLASSPATH "$MediaSessionCallback")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (build, "build", "()Landroid/media/MediaMetadata;") \\r
- METHOD (constructor, "<init>", "()V") \\r
- METHOD (putLong, "putLong", "(Ljava/lang/String;J)Landroid/media/MediaMetadata$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidMediaMetadataBuilder, "android/media/MediaMetadata$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getSpeed, "getSpeed", "()F") \\r
- METHOD (setSpeed, "setSpeed", "(F)Landroid/media/PlaybackParams;")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackParams, "android/media/PlaybackParams")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (getActions, "getActions", "()J") \\r
- METHOD (getErrorMessage, "getErrorMessage", "()Ljava/lang/CharSequence;") \\r
- METHOD (getPlaybackSpeed, "getPlaybackSpeed", "()F") \\r
- METHOD (getPosition, "getPosition", "()J") \\r
- METHOD (getState, "getState", "()I")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackState, "android/media/session/PlaybackState")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (build, "build", "()Landroid/media/session/PlaybackState;") \\r
- METHOD (constructor, "<init>", "()V") \\r
- METHOD (setActions, "setActions", "(J)Landroid/media/session/PlaybackState$Builder;") \\r
- METHOD (setErrorMessage, "setErrorMessage", "(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;") \\r
- METHOD (setState, "setState", "(IJF)Landroid/media/session/PlaybackState$Builder;")\r
-\r
-DECLARE_JNI_CLASS (AndroidPlaybackStateBuilder, "android/media/session/PlaybackState$Builder")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \\r
- METHOD (constructor, "<init>", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH ";Landroid/app/Activity;J)V") \\r
- METHOD (setEnabled, "setEnabled", "(Z)V")\r
-\r
-DECLARE_JNI_CLASS (SystemVolumeObserver, JUCE_ANDROID_ACTIVITY_CLASSPATH "$SystemVolumeObserver")\r
-#undef JNI_CLASS_MEMBERS\r
-\r
-#endif\r
-\r
-//==============================================================================\r
-class MediaPlayerListener : public AndroidInterfaceImplementer\r
-{\r
-public:\r
- struct Owner\r
- {\r
- virtual ~Owner() {}\r
-\r
- virtual void onPrepared (LocalRef<jobject>& mediaPlayer) = 0;\r
- virtual void onBufferingUpdate (LocalRef<jobject>& mediaPlayer, int progress) = 0;\r
- virtual void onSeekComplete (LocalRef<jobject>& mediaPlayer) = 0;\r
- virtual void onCompletion (LocalRef<jobject>& mediaPlayer) = 0;\r
- virtual bool onInfo (LocalRef<jobject>& mediaPlayer, int what, int extra) = 0;\r
- virtual bool onError (LocalRef<jobject>& mediaPlayer, int what, int extra) = 0;\r
- };\r
-\r
- MediaPlayerListener (Owner& ownerToUse) : owner (ownerToUse) {}\r
-\r
-private:\r
- Owner& owner;\r
-\r
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
- {\r
- auto* env = getEnv();\r
- auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
- int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
- if (methodName == "onPrepared" && numArgs == 1)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
- owner.onPrepared (mediaPlayer);\r
- return nullptr;\r
- }\r
-\r
- if (methodName == "onCompletion" && numArgs == 1)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
- owner.onCompletion (mediaPlayer);\r
- return nullptr;\r
- }\r
-\r
- if (methodName == "onInfo" && numArgs == 3)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
- auto what = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
- auto extra = LocalRef<jobject> (env->GetObjectArrayElement (args, 2));\r
-\r
- auto whatInt = (int) env->CallIntMethod (what, JavaInteger.intValue);\r
- auto extraInt = (int) env->CallIntMethod (extra, JavaInteger.intValue);\r
-\r
- auto res = owner.onInfo (mediaPlayer, whatInt, extraInt);\r
- return env->CallStaticObjectMethod (JavaBoolean, JavaBoolean.valueOf, (jboolean) res);\r
- }\r
-\r
- if (methodName == "onError" && numArgs == 3)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
- auto what = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
- auto extra = LocalRef<jobject> (env->GetObjectArrayElement (args, 2));\r
-\r
- auto whatInt = (int) env->CallIntMethod (what, JavaInteger.intValue);\r
- auto extraInt = (int) env->CallIntMethod (extra, JavaInteger.intValue);\r
-\r
- auto res = owner.onError (mediaPlayer, whatInt, extraInt);\r
- return env->CallStaticObjectMethod (JavaBoolean, JavaBoolean.valueOf, (jboolean) res);\r
- }\r
-\r
- if (methodName == "onSeekComplete" && numArgs == 1)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
- owner.onSeekComplete (mediaPlayer);\r
- return nullptr;\r
- }\r
-\r
- if (methodName == "onBufferingUpdate" && numArgs == 2)\r
- {\r
- auto mediaPlayer = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
- auto progress = LocalRef<jobject> (env->GetObjectArrayElement (args, 1));\r
- auto progressInt = (int) env->CallIntMethod (progress, JavaInteger.intValue);\r
-\r
- owner.onBufferingUpdate (mediaPlayer, progressInt);\r
-\r
- return nullptr;\r
- }\r
-\r
- return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
- }\r
-};\r
-\r
-//==============================================================================\r
-class AudioManagerOnAudioFocusChangeListener : public AndroidInterfaceImplementer\r
-{\r
-public:\r
- struct Owner\r
- {\r
- virtual ~Owner() {}\r
-\r
- virtual void onAudioFocusChange (int changeType) = 0;\r
- };\r
-\r
- AudioManagerOnAudioFocusChangeListener (Owner& ownerToUse) : owner (ownerToUse) {}\r
-\r
-private:\r
- Owner& owner;\r
-\r
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override\r
- {\r
- auto* env = getEnv();\r
- auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));\r
-\r
- int numArgs = args != nullptr ? env->GetArrayLength (args) : 0;\r
-\r
- if (methodName == "onAudioFocusChange" && numArgs == 1)\r
- {\r
- auto changeType = LocalRef<jobject> (env->GetObjectArrayElement (args, 0));\r
-\r
- auto changeTypeInt = (int) env->CallIntMethod (changeType, JavaInteger.intValue);\r
-\r
- owner.onAudioFocusChange (changeTypeInt);\r
- return nullptr;\r
- }\r
-\r
- return AndroidInterfaceImplementer::invoke (proxy, method, args);\r
- }\r
-};\r
-\r
-//==============================================================================\r
-struct VideoComponent::Pimpl\r
- : public AndroidViewComponent\r
-#if __ANDROID_API__ >= 21\r
- , private AppPausedResumedListener::Owner\r
-#endif\r
-{\r
- Pimpl (VideoComponent& ownerToUse, bool)\r
- #if __ANDROID_API__ >= 21\r
- : owner (ownerToUse),\r
- mediaSession (*this),\r
- appPausedResumedListener (*this),\r
- appPausedResumedListenerNative (CreateJavaInterface (&appPausedResumedListener,\r
- JUCE_ANDROID_ACTIVITY_CLASSPATH "$AppPausedResumedListener").get())\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- , systemVolumeListener (*this)\r
- #endif\r
- #endif\r
- {\r
- #if __ANDROID_API__ >= 21\r
- setVisible (true);\r
-\r
- auto* env = getEnv();\r
-\r
- setView (LocalRef<jobject> (env->CallObjectMethod (android.activity.get(),\r
- JuceAppActivity.createNativeSurfaceView,\r
- reinterpret_cast<jlong> (this),\r
- true)));\r
-\r
- env->CallVoidMethod (android.activity, JuceAppActivity.addAppPausedResumedListener,\r
- appPausedResumedListenerNative.get(), reinterpret_cast<jlong> (this));\r
- #endif\r
- }\r
-\r
- ~Pimpl()\r
- {\r
- #if __ANDROID_API__ >= 21\r
- getEnv()->CallVoidMethod (android.activity, JuceAppActivity.removeAppPausedResumedListener,\r
- appPausedResumedListenerNative.get(), reinterpret_cast<jlong>(this));\r
- #endif\r
- }\r
-\r
- #if __ANDROID_API__ < 21\r
- // Dummy implementations for unsupported API levels.\r
- void loadAsync (const URL&, std::function<void (const URL&, Result)>) {}\r
- void close() {}\r
- bool isOpen() const noexcept { return false; }\r
- bool isPlaying() const noexcept { return false; }\r
- void play() {}\r
- void stop() {}\r
- void setPosition (double) {}\r
- void setSpeed (double) {}\r
- void setVolume (float) {}\r
- float getVolume() const { return 0.0f; }\r
- double getPosition() const { return 0.0; }\r
- double getSpeed() const { return 0.0; }\r
- Rectangle<int> getNativeSize() const { return {}; }\r
- double getDuration() const { return 0.0; }\r
-\r
- File currentFile;\r
- URL currentURL;\r
- #else\r
- void loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
- {\r
- close();\r
- wasOpen = false;\r
-\r
- if (url.isEmpty())\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- if (! url.isLocalFile())\r
- {\r
- auto granted = android.activity.callBooleanMethod (JuceAppActivity.isPermissionDeclaredInManifestString,\r
- javaString ("android.permission.INTERNET").get()) != 0;\r
-\r
- if (! granted)\r
- {\r
- // In order to access videos from the Internet, the Internet permission has to be specified in\r
- // Android Manifest.\r
- jassertfalse;\r
- return;\r
- }\r
- }\r
-\r
- currentURL = url;\r
-\r
- jassert (callback != nullptr);\r
-\r
- loadFinishedCallback = std::move (callback);\r
-\r
- static constexpr jint visible = 0;\r
- getEnv()->CallVoidMethod ((jobject) getView(), AndroidView.setVisibility, visible);\r
-\r
- mediaSession.load (url);\r
- }\r
-\r
- void close()\r
- {\r
- if (! isOpen())\r
- return;\r
-\r
- mediaSession.closeVideo();\r
-\r
- static constexpr jint invisible = 4;\r
- getEnv()->CallVoidMethod ((jobject) getView(), AndroidView.setVisibility, invisible);\r
- }\r
-\r
- bool isOpen() const noexcept { return mediaSession.isVideoOpen(); }\r
- bool isPlaying() const noexcept { return mediaSession.isPlaying(); }\r
-\r
- void play() { mediaSession.play(); }\r
- void stop() { mediaSession.stop(); }\r
-\r
- void setPosition (double newPosition) { mediaSession.setPosition (newPosition); }\r
- double getPosition() const { return mediaSession.getPosition(); }\r
-\r
- void setSpeed (double newSpeed) { mediaSession.setSpeed (newSpeed); }\r
- double getSpeed() const { return mediaSession.getSpeed(); }\r
-\r
- Rectangle<int> getNativeSize() const { return mediaSession.getNativeSize(); }\r
-\r
- double getDuration() const { return mediaSession.getDuration(); }\r
-\r
- void setVolume (float newVolume) { mediaSession.setVolume (newVolume); }\r
- float getVolume() const { return mediaSession.getVolume(); }\r
-\r
- File currentFile;\r
- URL currentURL;\r
-\r
-private:\r
- //==============================================================================\r
- class MediaSession : private AudioManagerOnAudioFocusChangeListener::Owner\r
- {\r
- public:\r
- MediaSession (Pimpl& ownerToUse)\r
- : owner (ownerToUse),\r
- sdkVersion (getEnv()->CallStaticIntMethod (JuceAppActivity, JuceAppActivity.getAndroidSDKVersion)),\r
- audioAttributes (getAudioAttributes()),\r
- nativeMediaSession (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaSession,\r
- AndroidMediaSession.constructor,\r
- android.activity.get(),\r
- javaString ("JuceVideoMediaSession").get()))),\r
- mediaSessionCallback (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaSessionCallback,\r
- AndroidMediaSessionCallback.constructor,\r
- android.activity.get(),\r
- reinterpret_cast<jlong> (this)))),\r
- playbackStateBuilder (LocalRef<jobject> (getEnv()->NewObject (AndroidPlaybackStateBuilder,\r
- AndroidPlaybackStateBuilder.constructor))),\r
- controller (*this, getEnv()->CallObjectMethod (nativeMediaSession,\r
- AndroidMediaSession.getController)),\r
- player (*this),\r
- audioManager (android.activity.callObjectMethod (JuceAppActivity.getSystemService, javaString ("audio").get())),\r
- audioFocusChangeListener (*this),\r
- nativeAudioFocusChangeListener (GlobalRef (CreateJavaInterface (&audioFocusChangeListener,\r
- "android/media/AudioManager$OnAudioFocusChangeListener").get())),\r
- audioFocusRequest (createAudioFocusRequestIfNecessary (sdkVersion, audioAttributes,\r
- nativeAudioFocusChangeListener))\r
- {\r
- auto* env = getEnv();\r
-\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackToLocal, audioAttributes.get());\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setMediaButtonReceiver, nullptr);\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setCallback, mediaSessionCallback.get());\r
- }\r
-\r
- ~MediaSession()\r
- {\r
- auto* env = getEnv();\r
-\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setCallback, nullptr);\r
-\r
- controller.stop();\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.release);\r
- }\r
-\r
- bool isVideoOpen() const { return player.isVideoOpen(); }\r
- bool isPlaying() const { return player.isPlaying(); }\r
-\r
- void load (const URL& url) { controller.load (url); }\r
-\r
- void closeVideo()\r
- {\r
- resetState();\r
- controller.closeVideo();\r
- }\r
-\r
- void setDisplay (jobject surfaceHolder) { player.setDisplay (surfaceHolder); }\r
-\r
- void play() { controller.play(); }\r
- void stop() { controller.stop(); }\r
-\r
- void setPosition (double newPosition) { controller.setPosition (newPosition); }\r
- double getPosition() const { return controller.getPosition(); }\r
-\r
- void setSpeed (double newSpeed)\r
- {\r
- playSpeedMult = newSpeed;\r
-\r
- // Calling non 0.0 speed on a paused player would start it...\r
- if (player.isPlaying())\r
- {\r
- player.setPlaySpeed (playSpeedMult);\r
- updatePlaybackState();\r
- }\r
- }\r
-\r
- double getSpeed() const { return controller.getPlaySpeed(); }\r
- Rectangle<int> getNativeSize() const { return player.getVideoNativeSize(); }\r
- double getDuration() const { return player.getVideoDuration() / 1000.0; }\r
-\r
- void setVolume (float newVolume)\r
- {\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- controller.setVolume (newVolume);\r
- #else\r
- player.setAudioVolume (newVolume);\r
- #endif\r
- }\r
-\r
- float getVolume() const\r
- {\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- return controller.getVolume();\r
- #else\r
- return player.getAudioVolume();\r
- #endif\r
- }\r
-\r
- void storeState()\r
- {\r
- storedPlaybackState.clear();\r
- storedPlaybackState = GlobalRef (getCurrentPlaybackState());\r
- }\r
-\r
- void restoreState()\r
- {\r
- if (storedPlaybackState.get() == nullptr)\r
- return;\r
-\r
- auto* env = getEnv();\r
-\r
- auto pos = env->CallLongMethod (storedPlaybackState, AndroidPlaybackState.getPosition);\r
- setPosition (pos / 1000.0);\r
-\r
- setSpeed (playSpeedMult);\r
-\r
- auto state = env->CallIntMethod (storedPlaybackState, AndroidPlaybackState.getState);\r
-\r
- if (state != PlaybackState::STATE_NONE && state != PlaybackState::STATE_STOPPED\r
- && state != PlaybackState::STATE_PAUSED && state != PlaybackState::STATE_ERROR)\r
- {\r
- play();\r
- }\r
- }\r
-\r
- private:\r
- struct PlaybackState\r
- {\r
- enum\r
- {\r
- STATE_NONE = 0,\r
- STATE_STOPPED = 1,\r
- STATE_PAUSED = 2,\r
- STATE_PLAYING = 3,\r
- STATE_FAST_FORWARDING = 4,\r
- STATE_REWINDING = 5,\r
- STATE_BUFFERING = 6,\r
- STATE_ERROR = 7,\r
- STATE_CONNECTING = 8,\r
- STATE_SKIPPING_TO_PREVIOUS = 9,\r
- STATE_SKIPPING_TO_NEXT = 10,\r
- STATE_SKIPPING_TO_QUEUE_ITEM = 11,\r
- };\r
-\r
- enum\r
- {\r
- ACTION_PAUSE = 0x2,\r
- ACTION_PLAY = 0x4,\r
- ACTION_PLAY_FROM_MEDIA_ID = 0x8000,\r
- ACTION_PLAY_PAUSE = 0x200,\r
- ACTION_SEEK_TO = 0x100,\r
- ACTION_STOP = 0x1,\r
- };\r
- };\r
-\r
- //==============================================================================\r
- class Controller\r
- {\r
- public:\r
- Controller (MediaSession& ownerToUse, jobject nativeControllerToUse)\r
- : owner (ownerToUse),\r
- nativeController (GlobalRef (nativeControllerToUse)),\r
- controllerTransportControls (LocalRef<jobject> (getEnv()->CallObjectMethod (nativeController,\r
- AndroidMediaController.getTransportControls))),\r
- controllerCallback (LocalRef<jobject> (getEnv()->NewObject (AndroidMediaControllerCallback,\r
- AndroidMediaControllerCallback.constructor,\r
- android.activity.get(),\r
- reinterpret_cast<jlong> (this))))\r
- {\r
- auto* env = getEnv();\r
-\r
- env->CallVoidMethod (nativeController, AndroidMediaController.registerCallback, controllerCallback.get());\r
- }\r
-\r
- ~Controller()\r
- {\r
- auto* env = getEnv();\r
- env->CallVoidMethod (nativeController, AndroidMediaController.unregisterCallback, controllerCallback.get());\r
- }\r
-\r
- void load (const URL& url)\r
- {\r
- // NB: would use playFromUri, but it was only introduced in API 23...\r
- getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.playFromMediaId,\r
- javaString (url.toString (true)).get(), nullptr);\r
- }\r
-\r
- void closeVideo()\r
- {\r
- getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.stop);\r
- }\r
-\r
- void play()\r
- {\r
- getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.play);\r
- }\r
-\r
- void stop()\r
- {\r
- // NB: calling pause, rather than stop, because after calling stop, we would have to call load() again.\r
- getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.pause);\r
- }\r
-\r
- void setPosition (double newPosition)\r
- {\r
- auto seekPos = static_cast<jlong> (newPosition * 1000);\r
-\r
- getEnv()->CallVoidMethod (controllerTransportControls, AndroidMediaControllerTransportControls.seekTo, seekPos);\r
- }\r
-\r
- double getPosition() const\r
- {\r
- auto* env = getEnv();\r
-\r
- auto playbackState = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackState));\r
-\r
- if (playbackState != nullptr)\r
- return env->CallLongMethod (playbackState, AndroidPlaybackState.getPosition) / 1000.0;\r
-\r
- return 0.0;\r
- }\r
-\r
- double getPlaySpeed() const\r
- {\r
- auto* env = getEnv();\r
-\r
- auto playbackState = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackState));\r
-\r
- if (playbackState != nullptr)\r
- return (double) env->CallFloatMethod (playbackState, AndroidPlaybackState.getPlaybackSpeed);\r
-\r
- return 1.0;\r
- }\r
-\r
- void setVolume (float newVolume)\r
- {\r
- auto* env = getEnv();\r
-\r
- auto playbackInfo = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackInfo));\r
-\r
- auto maxVolume = env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getMaxVolume);\r
-\r
- auto targetVolume = jmin (jint (maxVolume * newVolume), maxVolume);\r
-\r
- static constexpr jint flagShowUI = 1;\r
- env->CallVoidMethod (nativeController, AndroidMediaController.setVolumeTo, targetVolume, flagShowUI);\r
- }\r
-\r
- float getVolume() const\r
- {\r
- auto* env = getEnv();\r
-\r
- auto playbackInfo = LocalRef<jobject> (env->CallObjectMethod (nativeController, AndroidMediaController.getPlaybackInfo));\r
-\r
- auto maxVolume = (int) (env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getMaxVolume));\r
- auto curVolume = (int) (env->CallIntMethod (playbackInfo, AndroidMediaControllerPlaybackInfo.getCurrentVolume));\r
-\r
- return static_cast<float> (curVolume) / maxVolume;\r
- }\r
-\r
- private:\r
- MediaSession& owner;\r
-\r
- GlobalRef nativeController;\r
- GlobalRef controllerTransportControls;\r
- GlobalRef controllerCallback;\r
- bool wasPlaying = false;\r
- bool wasPaused = true;\r
-\r
- //==============================================================================\r
- // MediaSessionController callbacks\r
-\r
- void audioInfoChanged (jobject info)\r
- {\r
- JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()");\r
- ignoreUnused (info);\r
- }\r
-\r
- void metadataChanged (jobject metadata)\r
- {\r
- JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()");\r
- ignoreUnused (metadata);\r
- }\r
-\r
- void playbackStateChanged (jobject playbackState)\r
- {\r
- JUCE_VIDEO_LOG ("MediaSessionController::playbackStateChanged()");\r
-\r
- if (playbackState == nullptr)\r
- return;\r
-\r
- auto state = getEnv()->CallIntMethod (playbackState, AndroidPlaybackState.getState);\r
-\r
- static constexpr jint statePaused = 2;\r
- static constexpr jint statePlaying = 3;\r
-\r
- if (wasPlaying == false && state == statePlaying)\r
- owner.playbackStarted();\r
- else if (wasPaused == false && state == statePaused)\r
- owner.playbackStopped();\r
-\r
- wasPlaying = state == statePlaying;\r
- wasPaused = state == statePaused;\r
- }\r
-\r
- void sessionDestroyed()\r
- {\r
- JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()");\r
- }\r
-\r
- friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
- friend void juce_mediaControllerMetadataChanged (int64, void*);\r
- friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
- friend void juce_mediaControllerSessionDestroyed (int64);\r
- };\r
-\r
- //==============================================================================\r
- class Player : private MediaPlayerListener::Owner\r
- {\r
- public:\r
- Player (MediaSession& ownerToUse)\r
- : owner (ownerToUse),\r
- mediaPlayerListener (*this),\r
- nativeMediaPlayerListener (GlobalRef (CreateJavaInterface (&mediaPlayerListener,\r
- getNativeMediaPlayerListenerInterfaces())))\r
-\r
- {}\r
-\r
- void setDisplay (jobject surfaceHolder)\r
- {\r
- if (surfaceHolder == nullptr)\r
- {\r
- videoSurfaceHolder.clear();\r
-\r
- if (nativeMediaPlayer.get() != nullptr)\r
- getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, nullptr);\r
-\r
- return;\r
- }\r
-\r
- videoSurfaceHolder = GlobalRef (surfaceHolder);\r
-\r
- if (nativeMediaPlayer.get() != nullptr)\r
- getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get());\r
- }\r
-\r
- void load (jstring mediaId, jobject extras)\r
- {\r
- ignoreUnused (extras);\r
-\r
- closeVideo();\r
-\r
- auto* env = getEnv();\r
-\r
- nativeMediaPlayer = GlobalRef (LocalRef<jobject> (env->NewObject (AndroidMediaPlayer, AndroidMediaPlayer.constructor)));\r
-\r
- currentState = State::idle;\r
-\r
- auto uri = LocalRef<jobject> (env->CallStaticObjectMethod (AndroidUri, AndroidUri.parse, mediaId));\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDataSource, android.activity.get(), uri.get());\r
-\r
- if (jniCheckHasExceptionOccurredAndClear())\r
- {\r
- owner.errorOccurred ("Could not find video under path provided (" + juceString (mediaId) + ")");\r
- return;\r
- }\r
-\r
- currentState = State::initialised;\r
-\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnBufferingUpdateListener, nativeMediaPlayerListener.get());\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnCompletionListener, nativeMediaPlayerListener.get());\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnErrorListener, nativeMediaPlayerListener.get());\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnInfoListener, nativeMediaPlayerListener.get());\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnPreparedListener, nativeMediaPlayerListener.get());\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setOnSeekCompleteListener, nativeMediaPlayerListener.get());\r
-\r
- if (videoSurfaceHolder != nullptr)\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get());\r
-\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.prepareAsync);\r
-\r
- currentState = State::preparing;\r
- }\r
-\r
- void closeVideo()\r
- {\r
- if (nativeMediaPlayer.get() == nullptr)\r
- return;\r
-\r
- auto* env = getEnv();\r
-\r
- if (getCurrentStateInfo().canCallStop)\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.stop);\r
-\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.release);\r
- nativeMediaPlayer.clear();\r
-\r
- currentState = State::end;\r
- }\r
-\r
- bool isVideoOpen() const noexcept\r
- {\r
- return currentState == State::prepared || currentState == State::started\r
- || currentState == State::paused || currentState == State::complete;\r
- }\r
-\r
- int getPlaybackStateFlag() const noexcept { return getCurrentStateInfo().playbackStateFlag; }\r
- int getAllowedActions() const noexcept { return getCurrentStateInfo().allowedActions; }\r
-\r
- jlong getVideoDuration() const\r
- {\r
- if (! getCurrentStateInfo().canCallGetVideoDuration)\r
- return 0;\r
-\r
- return getEnv()->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getDuration);\r
- }\r
-\r
- Rectangle<int> getVideoNativeSize() const\r
- {\r
- if (! getCurrentStateInfo().canCallGetVideoHeight)\r
- {\r
- jassertfalse;\r
- return {};\r
- }\r
-\r
- auto* env = getEnv();\r
-\r
- auto width = (int) env->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getVideoWidth);\r
- auto height = (int) env->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getVideoHeight);\r
-\r
- return Rectangle<int> (0, 0, width, height);\r
- }\r
-\r
- void play()\r
- {\r
- if (! getCurrentStateInfo().canCallStart)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- auto* env = getEnv();\r
-\r
- // Perform a potentially pending volume setting\r
- if (lastAudioVolume != std::numeric_limits<float>::min())\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setVolume, (jfloat) lastAudioVolume, (jfloat) lastAudioVolume);\r
-\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.start);\r
-\r
- currentState = State::started;\r
- }\r
-\r
- void pause()\r
- {\r
- if (! getCurrentStateInfo().canCallPause)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.pause);\r
-\r
- currentState = State::paused;\r
- }\r
-\r
- bool isPlaying() const\r
- {\r
- return getCurrentStateInfo().isPlaying;\r
- }\r
-\r
- void setPlayPosition (jint newPositionMs)\r
- {\r
- if (! getCurrentStateInfo().canCallSeekTo)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.seekTo, (jint) newPositionMs);\r
- }\r
-\r
- jint getPlayPosition() const\r
- {\r
- if (! getCurrentStateInfo().canCallGetCurrentPosition)\r
- return 0.0;\r
-\r
- return getEnv()->CallIntMethod (nativeMediaPlayer, AndroidMediaPlayer.getCurrentPosition);\r
- }\r
-\r
- void setPlaySpeed (double newSpeed)\r
- {\r
- if (! getCurrentStateInfo().canCallSetPlaybackParams)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- auto* env = getEnv();\r
-\r
- auto playbackParams = LocalRef<jobject> (env->CallObjectMethod (nativeMediaPlayer, AndroidMediaPlayer.getPlaybackParams));\r
- LocalRef<jobject> (env->CallObjectMethod (playbackParams, AndroidPlaybackParams.setSpeed, (jfloat) newSpeed));\r
- env->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setPlaybackParams, playbackParams.get());\r
-\r
- if (jniCheckHasExceptionOccurredAndClear())\r
- {\r
- // MediaPlayer can't handle speed provided!\r
- jassertfalse;\r
- }\r
- }\r
-\r
- double getPlaySpeed() const\r
- {\r
- if (! getCurrentStateInfo().canCallGetPlaybackParams)\r
- return 0.0;\r
-\r
- auto* env = getEnv();\r
-\r
- auto playbackParams = LocalRef<jobject> (env->CallObjectMethod (nativeMediaPlayer, AndroidMediaPlayer.getPlaybackParams));\r
- return (double) env->CallFloatMethod (playbackParams, AndroidPlaybackParams.getSpeed);\r
- }\r
-\r
- void setAudioVolume (float newVolume)\r
- {\r
- if (! getCurrentStateInfo().canCallSetVolume)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- lastAudioVolume = jlimit (0.0f, 1.0f, newVolume);\r
-\r
- if (nativeMediaPlayer.get() != nullptr)\r
- getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setVolume, (jfloat) lastAudioVolume, (jfloat) lastAudioVolume);\r
- }\r
-\r
- float getAudioVolume() const\r
- {\r
- // There is NO getVolume() in MediaPlayer, so the value returned here can be incorrect!\r
- return lastAudioVolume;\r
- }\r
-\r
- private:\r
- //=============================================================================\r
- struct StateInfo\r
- {\r
- int playbackStateFlag = 0, allowedActions = 0;\r
-\r
- bool isPlaying, canCallGetCurrentPosition, canCallGetVideoDuration,\r
- canCallGetVideoHeight, canCallGetVideoWidth, canCallGetPlaybackParams,\r
- canCallPause, canCallPrepare, canCallSeekTo, canCallSetAudioAttributes,\r
- canCallSetDataSource, canCallSetPlaybackParams, canCallSetVolume,\r
- canCallStart, canCallStop;\r
- };\r
-\r
- enum class State\r
- {\r
- idle, initialised, preparing, prepared, started, paused, stopped, complete, error, end\r
- };\r
-\r
- static constexpr StateInfo stateInfos[] = {\r
- /* idle */\r
- {PlaybackState::STATE_NONE, PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, true, false, true, true, false, false, false, false, true,\r
- true, false, true, false, false},\r
- /* initialised */\r
- {PlaybackState::STATE_NONE, 0, // NB: could use action prepare, but that's API 24 onwards only\r
- false, true, false, true, true, true, false, true, false, true,\r
- false, true, true, false, false},\r
- /* preparing */\r
- {PlaybackState::STATE_BUFFERING, 0,\r
- false, false, false, false, false, true, false, false, false, false,\r
- false, false, false, false, false},\r
- /* prepared */\r
- {PlaybackState::STATE_PAUSED,\r
- PlaybackState::ACTION_PLAY | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID | PlaybackState::ACTION_STOP | PlaybackState::ACTION_SEEK_TO,\r
- false, true, true, true, true, true, false, false, true, true,\r
- false, true, true, true, true},\r
- /* started */\r
- {PlaybackState::STATE_PLAYING,\r
- PlaybackState::ACTION_PAUSE | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- true, true, true, true, true, true, true, false, true, true,\r
- false, true, true, true, true},\r
- /* paused */\r
- {PlaybackState::STATE_PAUSED,\r
- PlaybackState::ACTION_PLAY | PlaybackState::ACTION_PLAY_PAUSE | PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, true, true, true, true, true, true, false, true, true,\r
- false, true, true, true, true},\r
- /* stopped */\r
- {PlaybackState::STATE_STOPPED,\r
- PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, true, true, true, true, true, false, true, false, true,\r
- false, false, true, false, true},\r
- /* complete */\r
- {PlaybackState::STATE_PAUSED,\r
- PlaybackState::ACTION_SEEK_TO | PlaybackState::ACTION_STOP | PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, true, true, true, true, true, true, false, true, true,\r
- false, true, true, true, true},\r
- /* error */\r
- {PlaybackState::STATE_ERROR,\r
- PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, false, false, false, false, false, false, false, false, false,\r
- false, false, false, false, false},\r
- /* end */\r
- {PlaybackState::STATE_NONE,\r
- PlaybackState::ACTION_PLAY_FROM_MEDIA_ID,\r
- false, false, false, false, false, false, false, false, false, false,\r
- false, false, false, false, false}\r
- };\r
-\r
- StateInfo getCurrentStateInfo() const noexcept { return stateInfos[static_cast<int> (currentState)]; }\r
-\r
- //==============================================================================\r
- MediaSession& owner;\r
- GlobalRef nativeMediaPlayer;\r
-\r
- MediaPlayerListener mediaPlayerListener;\r
- GlobalRef nativeMediaPlayerListener;\r
-\r
- float lastAudioVolume = std::numeric_limits<float>::min();\r
-\r
- GlobalRef videoSurfaceHolder;\r
-\r
- State currentState = State::idle;\r
-\r
- //==============================================================================\r
- void onPrepared (LocalRef<jobject>& mediaPlayer) override\r
- {\r
- JUCE_VIDEO_LOG ("MediaPlayer::onPrepared()");\r
-\r
- ignoreUnused (mediaPlayer);\r
-\r
- currentState = State::prepared;\r
-\r
- owner.playerPrepared();\r
- }\r
-\r
- void onBufferingUpdate (LocalRef<jobject>& mediaPlayer, int progress) override\r
- {\r
- ignoreUnused (mediaPlayer);\r
-\r
- owner.playerBufferingUpdated (progress);\r
- }\r
-\r
- void onSeekComplete (LocalRef<jobject>& mediaPlayer) override\r
- {\r
- JUCE_VIDEO_LOG ("MediaPlayer::onSeekComplete()");\r
-\r
- ignoreUnused (mediaPlayer);\r
-\r
- owner.playerSeekCompleted();\r
- }\r
-\r
- void onCompletion (LocalRef<jobject>& mediaPlayer) override\r
- {\r
- JUCE_VIDEO_LOG ("MediaPlayer::onCompletion()");\r
-\r
- ignoreUnused (mediaPlayer);\r
-\r
- currentState = State::complete;\r
-\r
- owner.playerPlaybackCompleted();\r
- }\r
-\r
- enum\r
- {\r
- MEDIA_INFO_UNKNOWN = 1,\r
- MEDIA_INFO_VIDEO_RENDERING_START = 3,\r
- MEDIA_INFO_VIDEO_TRACK_LAGGING = 700,\r
- MEDIA_INFO_BUFFERING_START = 701,\r
- MEDIA_INFO_BUFFERING_END = 702,\r
- MEDIA_INFO_NETWORK_BANDWIDTH = 703,\r
- MEDIA_INFO_BAD_INTERLEAVING = 800,\r
- MEDIA_INFO_NOT_SEEKABLE = 801,\r
- MEDIA_INFO_METADATA_UPDATE = 802,\r
- MEDIA_INFO_AUDIO_NOT_PLAYING = 804,\r
- MEDIA_INFO_VIDEO_NOT_PLAYING = 805,\r
- MEDIA_INFO_UNSUPPORTED_SUBTITE = 901,\r
- MEDIA_INFO_SUBTITLE_TIMED_OUT = 902\r
- };\r
-\r
- bool onInfo (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
- {\r
- JUCE_VIDEO_LOG ("MediaPlayer::onInfo(), infoCode: " + String (what) + " (" + infoCodeToString (what) + ")"\r
- + ", extraCode: " + String (extra));\r
-\r
- ignoreUnused (mediaPlayer, extra);\r
-\r
- if (what == MEDIA_INFO_BUFFERING_START)\r
- owner.playerBufferingStarted();\r
- else if (what == MEDIA_INFO_BUFFERING_END)\r
- owner.playerBufferingEnded();\r
-\r
- return true;\r
- }\r
-\r
- static String infoCodeToString (int code)\r
- {\r
- switch (code)\r
- {\r
- case MEDIA_INFO_UNKNOWN: return "Unknown";\r
- case MEDIA_INFO_VIDEO_RENDERING_START: return "Rendering start";\r
- case MEDIA_INFO_VIDEO_TRACK_LAGGING: return "Video track lagging";\r
- case MEDIA_INFO_BUFFERING_START: return "Buffering start";\r
- case MEDIA_INFO_BUFFERING_END: return "Buffering end";\r
- case MEDIA_INFO_NETWORK_BANDWIDTH: return "Network bandwidth info available";\r
- case MEDIA_INFO_BAD_INTERLEAVING: return "Bad interleaving";\r
- case MEDIA_INFO_NOT_SEEKABLE: return "Video not seekable";\r
- case MEDIA_INFO_METADATA_UPDATE: return "Metadata updated";\r
- case MEDIA_INFO_AUDIO_NOT_PLAYING: return "Audio not playing";\r
- case MEDIA_INFO_VIDEO_NOT_PLAYING: return "Video not playing";\r
- case MEDIA_INFO_UNSUPPORTED_SUBTITE: return "Unsupported subtitle";\r
- case MEDIA_INFO_SUBTITLE_TIMED_OUT: return "Subtitle timed out";\r
- default: return "";\r
- }\r
- }\r
-\r
- bool onError (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
- {\r
- auto errorMessage = errorCodeToString (what);\r
- auto extraMessage = errorCodeToString (extra);\r
-\r
- if (extraMessage.isNotEmpty())\r
- errorMessage << ", " << extraMessage;\r
-\r
- JUCE_VIDEO_LOG ("MediaPlayer::onError(), errorCode: " + String (what) + " (" + errorMessage + ")"\r
- + ", extraCode: " + String (extra) + " (" + extraMessage + ")");\r
-\r
- ignoreUnused (mediaPlayer);\r
-\r
- currentState = State::error;\r
-\r
- owner.errorOccurred (errorMessage);\r
- return true;\r
- }\r
-\r
- static String errorCodeToString (int code)\r
- {\r
- enum\r
- {\r
- MEDIA_ERROR_UNSUPPORTED = -1010,\r
- MEDIA_ERROR_MALFORMED = -1007,\r
- MEDIA_ERROR_IO = -1004,\r
- MEDIA_ERROR_TIMED_OUT = -110,\r
- MEDIA_ERROR_UNKNOWN = 1,\r
- MEDIA_ERROR_SERVER_DIED = 100,\r
- MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200\r
- };\r
-\r
- switch (code)\r
- {\r
- case MEDIA_ERROR_UNSUPPORTED: return "Unsupported bitstream";\r
- case MEDIA_ERROR_MALFORMED: return "Malformed bitstream";\r
- case MEDIA_ERROR_IO: return "File/Network I/O error";\r
- case MEDIA_ERROR_TIMED_OUT: return "Timed out";\r
- case MEDIA_ERROR_UNKNOWN: return "Unknown error";\r
- case MEDIA_ERROR_SERVER_DIED: return "Media server died (playback restart required)";\r
- case MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: return "Video container not valid for progressive playback";\r
- default: return "";\r
- }\r
- }\r
-\r
- //==============================================================================\r
- static StringArray getNativeMediaPlayerListenerInterfaces()\r
- {\r
- #define IFPREFIX "android/media/MediaPlayer$"\r
-\r
- return { IFPREFIX "OnCompletionListener", IFPREFIX "OnErrorListener",\r
- IFPREFIX "OnInfoListener", IFPREFIX "OnPreparedListener",\r
- IFPREFIX "OnBufferingUpdateListener", IFPREFIX "OnSeekCompleteListener"\r
- };\r
-\r
- #undef IFPREFIX\r
- }\r
- };\r
-\r
- //==============================================================================\r
- Pimpl& owner;\r
-\r
- int sdkVersion;\r
-\r
- GlobalRef audioAttributes;\r
- GlobalRef nativeMediaSession;\r
- GlobalRef mediaSessionCallback;\r
- GlobalRef playbackStateBuilder;\r
-\r
- Controller controller;\r
- Player player;\r
-\r
- GlobalRef audioManager;\r
- AudioManagerOnAudioFocusChangeListener audioFocusChangeListener;\r
- GlobalRef nativeAudioFocusChangeListener;\r
- GlobalRef audioFocusRequest;\r
-\r
- GlobalRef storedPlaybackState;\r
-\r
- bool pendingSeekRequest = false;\r
-\r
- bool playerBufferingInProgress = false;\r
- bool usesBuffering = false;\r
- SparseSet<int> bufferedRegions;\r
-\r
- double playSpeedMult = 1.0;\r
- bool hasAudioFocus = false;\r
-\r
- //==============================================================================\r
- // MediaSession callbacks\r
-\r
- void pauseCallback()\r
- {\r
- JUCE_VIDEO_LOG ("MediaSession::pauseCallback()");\r
-\r
- player.pause();\r
- updatePlaybackState();\r
-\r
- abandonAudioFocus();\r
- }\r
-\r
- void playCallback()\r
- {\r
- JUCE_VIDEO_LOG ("MediaSession::playCallback()");\r
-\r
- requestAudioFocus();\r
-\r
- if (! hasAudioFocus)\r
- {\r
- errorOccurred ("Application has been denied audio focus. Try again later.");\r
- return;\r
- }\r
-\r
- getEnv()->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setActive, true);\r
-\r
- player.play();\r
- setSpeed (playSpeedMult);\r
- updatePlaybackState();\r
- }\r
-\r
- void playFromMediaIdCallback (jstring mediaId, jobject extras)\r
- {\r
- JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()");\r
-\r
- player.load (mediaId, extras);\r
- updatePlaybackState();\r
- }\r
-\r
- void seekToCallback (jlong pos)\r
- {\r
- JUCE_VIDEO_LOG ("MediaSession::seekToCallback()");\r
-\r
- pendingSeekRequest = true;\r
- player.setPlayPosition ((jint) pos);\r
- updatePlaybackState();\r
- }\r
-\r
- void stopCallback()\r
- {\r
- JUCE_VIDEO_LOG ("MediaSession::stopCallback()");\r
-\r
- auto* env = getEnv();\r
-\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setActive, false);\r
-\r
- player.closeVideo();\r
- updatePlaybackState();\r
-\r
- abandonAudioFocus();\r
-\r
- owner.closeVideoFinished();\r
- }\r
-\r
- //==============================================================================\r
- bool isSeekInProgress() const noexcept\r
- {\r
- if (pendingSeekRequest)\r
- return true;\r
-\r
- if (! usesBuffering)\r
- return false;\r
-\r
- // NB: player sometimes notifies us about buffering, but only for regions that\r
- // were previously buffered already. For buffering happening for the first time,\r
- // we don't get such notification...\r
- if (playerBufferingInProgress)\r
- return true;\r
-\r
- auto playPos = player.getPlayPosition();\r
- auto durationMs = player.getVideoDuration();\r
- auto playPosPercent = (int) (100 * playPos / static_cast<double> (durationMs));\r
-\r
- // NB: assuming the playback will start roughly when there is 5% of content loaded...\r
- return ! bufferedRegions.containsRange (Range<int> (playPosPercent, jmin (101, playPosPercent + 5)));\r
- }\r
-\r
- void updatePlaybackState()\r
- {\r
- getEnv()->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackState, getCurrentPlaybackState());\r
- }\r
-\r
- jobject getCurrentPlaybackState()\r
- {\r
- static constexpr int bufferingState = 6;\r
-\r
- auto playbackStateFlag = isSeekInProgress() ? bufferingState : player.getPlaybackStateFlag();\r
- auto playPos = player.getPlayPosition();\r
- auto playSpeed = player.getPlaySpeed();\r
- auto allowedActions = player.getAllowedActions();\r
-\r
- auto* env = getEnv();\r
-\r
- LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setState,\r
- (jint) playbackStateFlag, (jlong) playPos, (jfloat) playSpeed));\r
-\r
- LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setActions, (jint) allowedActions));\r
-\r
- return env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.build);\r
- }\r
-\r
- //==============================================================================\r
- void playerPrepared()\r
- {\r
- resetState();\r
-\r
- updateMetadata();\r
-\r
- owner.loadFinished();\r
- }\r
-\r
- void playerBufferingStarted() { playerBufferingInProgress = true; }\r
- void playerBufferingEnded() { playerBufferingInProgress = false; }\r
-\r
- void playerBufferingUpdated (int progress)\r
- {\r
- usesBuffering = true;\r
-\r
- updatePlaybackState();\r
-\r
- auto playPos = player.getPlayPosition();\r
- auto durationMs = player.getVideoDuration();\r
- auto playPosPercent = (int) (100 * playPos / static_cast<double> (durationMs));\r
-\r
- bufferedRegions.addRange (Range<int> (playPosPercent, progress + 1));\r
-\r
- String ranges;\r
-\r
- for (auto& r : bufferedRegions.getRanges())\r
- ranges << "[" << r.getStart() << "%, " << r.getEnd() - 1 << "%] ";\r
-\r
- JUCE_VIDEO_LOG ("Buffering status update, seek pos: " + String (playPosPercent) + "%, buffered regions: " + ranges);\r
- }\r
-\r
- void playerSeekCompleted()\r
- {\r
- pendingSeekRequest = false;\r
- updatePlaybackState();\r
- }\r
-\r
- void playerPlaybackCompleted()\r
- {\r
- pauseCallback();\r
- seekToCallback ((jlong) 0);\r
- }\r
-\r
- void updateMetadata()\r
- {\r
- auto* env = getEnv();\r
-\r
- auto metadataBuilder = LocalRef<jobject> (env->NewObject (AndroidMediaMetadataBuilder,\r
- AndroidMediaMetadataBuilder.constructor));\r
-\r
- auto durationMs = player.getVideoDuration();\r
-\r
- auto jDurationKey = javaString ("android.media.metadata.DURATION");\r
- LocalRef<jobject> (env->CallObjectMethod (metadataBuilder,\r
- AndroidMediaMetadataBuilder.putLong,\r
- jDurationKey.get(),\r
- (jlong) durationMs));\r
-\r
- auto jNumTracksKey = javaString ("android.media.metadata.NUM_TRACKS");\r
- LocalRef<jobject> (env->CallObjectMethod (metadataBuilder,\r
- AndroidMediaMetadataBuilder.putLong,\r
- jNumTracksKey.get(),\r
- (jlong) 1));\r
-\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setMetadata,\r
- env->CallObjectMethod (metadataBuilder, AndroidMediaMetadataBuilder.build));\r
- }\r
-\r
- void errorOccurred (const String& errorMessage)\r
- {\r
- auto* env = getEnv();\r
-\r
- // Propagate error to session controller(s) and ...\r
- LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.setErrorMessage,\r
- javaString (errorMessage).get()));\r
-\r
- auto state = LocalRef<jobject> (env->CallObjectMethod (playbackStateBuilder, AndroidPlaybackStateBuilder.build));\r
- env->CallVoidMethod (nativeMediaSession, AndroidMediaSession.setPlaybackState, state.get());\r
-\r
- // ...also notify JUCE side client\r
- owner.errorOccurred (errorMessage);\r
- }\r
-\r
- //==============================================================================\r
- static jobject createAudioFocusRequestIfNecessary (int sdkVersion, const GlobalRef& audioAttributes,\r
- const GlobalRef& nativeAudioFocusChangeListener)\r
- {\r
- if (sdkVersion < 26)\r
- return nullptr;\r
-\r
- auto* env = getEnv();\r
-\r
- auto requestBuilderClass = LocalRef<jclass> (env->FindClass ("android/media/AudioFocusRequest$Builder"));\r
-\r
- static jmethodID constructor = env->GetMethodID (requestBuilderClass, "<init>", "(I)V");\r
- static jmethodID buildMethod = env->GetMethodID (requestBuilderClass, "build", "()Landroid/media/AudioFocusRequest;");\r
- static jmethodID setAudioAttributesMethod = env->GetMethodID (requestBuilderClass, "setAudioAttributes",\r
- "(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;");\r
- static jmethodID setOnAudioFocusChangeListenerMethod = env->GetMethodID (requestBuilderClass, "setOnAudioFocusChangeListener",\r
- "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder;");\r
-\r
- static constexpr jint audioFocusGain = 1;\r
-\r
- auto requestBuilder = LocalRef<jobject> (env->NewObject (requestBuilderClass, constructor, audioFocusGain));\r
- LocalRef<jobject> (env->CallObjectMethod (requestBuilder, setAudioAttributesMethod, audioAttributes.get()));\r
- LocalRef<jobject> (env->CallObjectMethod (requestBuilder, setOnAudioFocusChangeListenerMethod, nativeAudioFocusChangeListener.get()));\r
-\r
- return env->CallObjectMethod (requestBuilder, buildMethod);\r
- }\r
-\r
- void requestAudioFocus()\r
- {\r
- static constexpr jint audioFocusGain = 1;\r
- static constexpr jint streamMusic = 3;\r
- static constexpr jint audioFocusRequestGranted = 1;\r
-\r
- jint result = audioFocusRequestGranted;\r
-\r
- if (sdkVersion >= 26)\r
- {\r
- static jmethodID requestAudioFocusMethod = getEnv()->GetMethodID (AndroidAudioManager, "requestAudioFocus",\r
- "(Landroid/media/AudioFocusRequest;)I");\r
-\r
- result = getEnv()->CallIntMethod (audioManager, requestAudioFocusMethod, audioFocusRequest.get());\r
- }\r
- else\r
- {\r
- result = getEnv()->CallIntMethod (audioManager, AndroidAudioManager.requestAudioFocus,\r
- nativeAudioFocusChangeListener.get(), streamMusic, audioFocusGain);\r
- }\r
-\r
- hasAudioFocus = result == audioFocusRequestGranted;\r
- }\r
-\r
- void abandonAudioFocus()\r
- {\r
- if (! hasAudioFocus)\r
- return;\r
-\r
- static constexpr jint audioFocusRequestGranted = 1;\r
-\r
- jint result = audioFocusRequestGranted;\r
-\r
- if (sdkVersion >= 26)\r
- {\r
- static jmethodID abandonAudioFocusMethod = getEnv()->GetMethodID (AndroidAudioManager, "abandonAudioFocusRequest",\r
- "(Landroid/media/AudioFocusRequest;)I");\r
-\r
- result = getEnv()->CallIntMethod (audioManager, abandonAudioFocusMethod, audioFocusRequest.get());\r
- }\r
- else\r
- {\r
- result = getEnv()->CallIntMethod (audioManager, AndroidAudioManager.abandonAudioFocus,\r
- nativeAudioFocusChangeListener.get());\r
- }\r
-\r
- // NB: granted in this case means "granted to change the focus to abandoned"...\r
- hasAudioFocus = result != audioFocusRequestGranted;\r
- }\r
-\r
- void onAudioFocusChange (int changeType) override\r
- {\r
- static constexpr jint audioFocusGain = 1;\r
-\r
- if (changeType == audioFocusGain)\r
- JUCE_VIDEO_LOG ("Audio focus gained");\r
- else\r
- JUCE_VIDEO_LOG ("Audio focus lost");\r
-\r
- if (changeType != audioFocusGain)\r
- {\r
- if (isPlaying())\r
- {\r
- JUCE_VIDEO_LOG ("Received a request to abandon audio focus. Stopping playback...");\r
- stop();\r
- }\r
-\r
- abandonAudioFocus();\r
- }\r
- }\r
-\r
- //==============================================================================\r
- void playbackStarted()\r
- {\r
- owner.playbackStarted();\r
- }\r
-\r
- void playbackStopped()\r
- {\r
- owner.playbackStopped();\r
- }\r
-\r
- //==============================================================================\r
- void resetState()\r
- {\r
- usesBuffering = false;\r
- bufferedRegions.clear();\r
- playerBufferingInProgress = false;\r
-\r
- pendingSeekRequest = false;\r
-\r
- playSpeedMult = 1.0;\r
- hasAudioFocus = false;\r
- }\r
-\r
- //==============================================================================\r
- static jobject getAudioAttributes()\r
- {\r
- auto* env = getEnv();\r
-\r
- auto audioAttribsBuilder = LocalRef<jobject> (env->NewObject (AndroidAudioAttributesBuilder,\r
- AndroidAudioAttributesBuilder.constructor));\r
- static constexpr jint contentTypeMovie = 3;\r
- static constexpr jint usageMedia = 1;\r
-\r
- LocalRef<jobject> (env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.setContentType, contentTypeMovie));\r
- LocalRef<jobject> (env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.setUsage, usageMedia));\r
-\r
- return env->CallObjectMethod (audioAttribsBuilder, AndroidAudioAttributesBuilder.build);\r
- }\r
-\r
- friend void juce_mediaSessionPause (int64);\r
- friend void juce_mediaSessionPlay (int64);\r
- friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
- friend void juce_mediaSessionSeekTo (int64, int64);\r
- friend void juce_mediaSessionStop (int64);\r
-\r
- friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
- friend void juce_mediaControllerMetadataChanged (int64, void*);\r
- friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
- friend void juce_mediaControllerSessionDestroyed (int64);\r
- };\r
-\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- //==============================================================================\r
- class SystemVolumeListener\r
- {\r
- public:\r
- SystemVolumeListener (Pimpl& ownerToUse)\r
- : owner (ownerToUse),\r
- nativeObserver (LocalRef<jobject> (getEnv()->NewObject (SystemVolumeObserver,\r
- SystemVolumeObserver.constructor,\r
- android.activity.get(),\r
- android.activity.get(),\r
- reinterpret_cast<jlong> (this))))\r
- {\r
- setEnabled (true);\r
- }\r
-\r
- ~SystemVolumeListener()\r
- {\r
- setEnabled (false);\r
- }\r
-\r
- void setEnabled (bool shouldBeEnabled)\r
- {\r
- getEnv()->CallVoidMethod (nativeObserver, SystemVolumeObserver.setEnabled, shouldBeEnabled);\r
-\r
- // Send first notification instantly to ensure sync.\r
- if (shouldBeEnabled)\r
- systemVolumeChanged();\r
- }\r
-\r
- private:\r
- Pimpl& owner;\r
- GlobalRef nativeObserver;\r
-\r
- void systemVolumeChanged()\r
- {\r
- WeakReference<SystemVolumeListener> weakThis (this);\r
-\r
- MessageManager::callAsync ([weakThis]() mutable\r
- {\r
- if (weakThis == nullptr)\r
- return;\r
-\r
- if (weakThis->owner.owner.onGlobalMediaVolumeChanged != nullptr)\r
- weakThis->owner.owner.onGlobalMediaVolumeChanged();\r
- });\r
- }\r
-\r
- friend void juce_mediaSessionSystemVolumeChanged (int64);\r
-\r
- JUCE_DECLARE_WEAK_REFERENCEABLE (SystemVolumeListener)\r
- };\r
- #endif\r
-\r
- //==============================================================================\r
- VideoComponent& owner;\r
-\r
- MediaSession mediaSession;\r
- AppPausedResumedListener appPausedResumedListener;\r
- GlobalRef appPausedResumedListenerNative;\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- SystemVolumeListener systemVolumeListener;\r
- #endif\r
-\r
- std::function<void (const URL&, Result)> loadFinishedCallback;\r
-\r
- bool wasOpen = false;\r
-\r
- //==============================================================================\r
- void loadFinished()\r
- {\r
- owner.resized();\r
-\r
- if (loadFinishedCallback != nullptr)\r
- {\r
- loadFinishedCallback (currentURL, Result::ok());\r
- loadFinishedCallback = nullptr;\r
- }\r
- }\r
-\r
- void closeVideoFinished()\r
- {\r
- owner.resized();\r
- }\r
-\r
- void errorOccurred (const String& errorMessage)\r
- {\r
- if (owner.onErrorOccurred != nullptr)\r
- owner.onErrorOccurred (errorMessage);\r
- }\r
-\r
- void playbackStarted()\r
- {\r
- if (owner.onPlaybackStarted != nullptr)\r
- owner.onPlaybackStarted();\r
- }\r
-\r
- void playbackStopped()\r
- {\r
- if (owner.onPlaybackStopped != nullptr)\r
- owner.onPlaybackStopped();\r
- }\r
-\r
- void videoSurfaceChanged (jobject surfaceHolder)\r
- {\r
- mediaSession.setDisplay (surfaceHolder);\r
- }\r
-\r
- void videoSurfaceDestroyed (jobject /*surfaceHolder*/)\r
- {\r
- mediaSession.setDisplay (nullptr);\r
- }\r
-\r
- //==============================================================================\r
- void appPaused() override\r
- {\r
- wasOpen = isOpen();\r
-\r
- if (! wasOpen)\r
- return;\r
-\r
- JUCE_VIDEO_LOG ("App paused, releasing media player...");\r
-\r
- mediaSession.storeState();\r
- mediaSession.closeVideo();\r
-\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- systemVolumeListener.setEnabled (false);\r
- #endif\r
- }\r
-\r
- void appResumed() override\r
- {\r
- if (! wasOpen)\r
- return;\r
-\r
- JUCE_VIDEO_LOG ("App resumed, restoring media player...");\r
-\r
- loadAsync (currentURL, [this](const URL&, Result r)\r
- {\r
- if (r.wasOk())\r
- mediaSession.restoreState();\r
- });\r
-\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- systemVolumeListener.setEnabled (true);\r
- #endif\r
- }\r
-\r
- //==============================================================================\r
- friend void juce_surfaceChangedNativeVideo (int64, void*);\r
- friend void juce_surfaceDestroyedNativeVideo (int64, void*);\r
-\r
- friend void juce_mediaSessionPause (int64);\r
- friend void juce_mediaSessionPlay (int64);\r
- friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
- friend void juce_mediaSessionSeekTo (int64, int64);\r
- friend void juce_mediaSessionStop (int64);\r
-\r
- friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
- friend void juce_mediaControllerMetadataChanged (int64, void*);\r
- friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
- friend void juce_mediaControllerSessionDestroyed (int64);\r
-\r
- friend void juce_mediaSessionSystemVolumeChanged (int64);\r
- #endif\r
-\r
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
-};\r
-\r
-#if __ANDROID_API__ >= 21\r
-//==============================================================================\r
-void juce_surfaceChangedNativeVideo (int64 host, void* surfaceHolder)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl*> (host)->videoSurfaceChanged (static_cast<jobject> (surfaceHolder));\r
-}\r
-\r
-void juce_surfaceDestroyedNativeVideo (int64 host, void* surfaceHolder)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl*> (host)->videoSurfaceDestroyed (static_cast<jobject> (surfaceHolder));\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), dispatchDrawNativeVideo,\r
- void, (JNIEnv* env, jobject nativeView, jlong host, jobject canvas))\r
-{\r
- ignoreUnused (nativeView, host, canvas);\r
- setEnv (env);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceChangedNativeVideo,\r
- void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder, jint format, jint width, jint height))\r
-{\r
- ignoreUnused (nativeView, format, width, height);\r
- setEnv (env);\r
-\r
- JUCE_VIDEO_LOG ("video surface changed");\r
-\r
- juce_surfaceChangedNativeVideo (host, holder);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceCreatedNativeVideo,\r
- void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder))\r
-{\r
- ignoreUnused (nativeView, host, holder);\r
- setEnv (env);\r
-\r
- JUCE_VIDEO_LOG ("video surface created");\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024NativeSurfaceView), surfaceDestroyedNativeVideo,\r
- void, (JNIEnv* env, jobject nativeView, jlong host, jobject holder))\r
-{\r
- ignoreUnused (nativeView, host, holder);\r
- setEnv (env);\r
-\r
- JUCE_VIDEO_LOG ("video surface destroyed");\r
- juce_surfaceDestroyedNativeVideo (host, holder);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaSessionPause (int64 host)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->pauseCallback();\r
-}\r
-\r
-void juce_mediaSessionPlay (int64 host)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->playCallback();\r
-}\r
-\r
-void juce_mediaSessionPlayFromMediaId (int64 host, void* mediaId, void* extras)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->playFromMediaIdCallback ((jstring) mediaId, (jobject) extras);\r
-}\r
-\r
-void juce_mediaSessionSeekTo (int64 host, int64 pos)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->seekToCallback (pos);\r
-}\r
-\r
-void juce_mediaSessionStop (int64 host)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host)->stopCallback();\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPause,\r
- void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionPause (host);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPlay,\r
- void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionPlay (host);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionPlayFromMediaId,\r
- void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host, jobject mediaId, jobject extras))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionPlayFromMediaId (host, mediaId, extras);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionSeekTo,\r
- void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host, jlong pos))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionSeekTo (host, pos);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaSessionCallback), mediaSessionStop,\r
- void, (JNIEnv* env, jobject /*mediaSessionCallback*/, jlong host))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionStop (host);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaControllerAudioInfoChanged (int64 host, void* info)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->audioInfoChanged ((jobject) info);\r
-}\r
-\r
-void juce_mediaControllerMetadataChanged (int64 host, void* metadata)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->metadataChanged ((jobject) metadata);\r
-}\r
-\r
-void juce_mediaControllerPlaybackStateChanged (int64 host, void* state)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->playbackStateChanged ((jobject) state);\r
-}\r
-\r
-void juce_mediaControllerSessionDestroyed (int64 host)\r
-{\r
- reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host)->sessionDestroyed();\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerAudioInfoChanged,\r
- void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject playbackInfo))\r
-{\r
- setEnv (env);\r
- juce_mediaControllerAudioInfoChanged (host, playbackInfo);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerMetadataChanged,\r
- void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject metadata))\r
-{\r
- setEnv (env);\r
- juce_mediaControllerMetadataChanged (host, metadata);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerPlaybackStateChanged,\r
- void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host, jobject playbackState))\r
-{\r
- setEnv (env);\r
- juce_mediaControllerPlaybackStateChanged (host, playbackState);\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024MediaControllerCallback), mediaControllerSessionDestroyed,\r
- void, (JNIEnv* env, jobject /*mediaControllerCallback*/, jlong host))\r
-{\r
- setEnv (env);\r
- juce_mediaControllerSessionDestroyed (host);\r
-}\r
-\r
-//==============================================================================\r
-void juce_mediaSessionSystemVolumeChanged (int64 host)\r
-{\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- reinterpret_cast<VideoComponent::Pimpl::SystemVolumeListener*> (host)->systemVolumeChanged();\r
- #else\r
- ignoreUnused (host);\r
- #endif\r
-}\r
-\r
-JUCE_JNI_CALLBACK (JUCE_JOIN_MACRO (JUCE_ANDROID_ACTIVITY_CLASSNAME, _00024SystemVolumeObserver), mediaSessionSystemVolumeChanged,\r
- void, (JNIEnv* env, jobject /*systemSettingsObserver*/, jlong host))\r
-{\r
- setEnv (env);\r
- juce_mediaSessionSystemVolumeChanged (host);\r
-}\r
-\r
-//==============================================================================\r
-constexpr VideoComponent::Pimpl::MediaSession::Player::StateInfo VideoComponent::Pimpl::MediaSession::Player::stateInfos[];\r
-#endif\r
dispatch_async (captureSessionQueue,^\r
{\r
cameraDevice = [AVCaptureDevice deviceWithUniqueID: juceStringToNS (cameraIdToUse)];\r
- auto audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];\r
+ auto* audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];\r
\r
[captureSession.get() beginConfiguration];\r
\r
{\r
NSError* error = nil;\r
\r
- auto input = [AVCaptureDeviceInput deviceInputWithDevice: device\r
- error: &error];\r
+ auto* input = [AVCaptureDeviceInput deviceInputWithDevice: device\r
+ error: &error];\r
\r
if (error != nil)\r
return nsStringToJuce (error.localizedDescription);\r
if (Pimpl::getIOSVersion().major >= 10 && [captureOutput isKindOfClass: [AVCapturePhotoOutput class]])\r
{\r
auto* photoOutput = (AVCapturePhotoOutput*) captureOutput;\r
- auto outputConnection = [photoOutput connectionWithMediaType: AVMediaTypeVideo];\r
+ auto* outputConnection = [photoOutput connectionWithMediaType: AVMediaTypeVideo];\r
outputConnection.videoOrientation = orientationToUse;\r
\r
[photoOutput capturePhotoWithSettings: [AVCapturePhotoSettings photoSettings]\r
#endif\r
\r
auto* stillImageOutput = (AVCaptureStillImageOutput*) captureOutput;\r
- auto outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
+ auto* outputConnection = [stillImageOutput connectionWithMediaType: AVMediaTypeVideo];\r
outputConnection.videoOrientation = orientationToUse;\r
\r
[stillImageOutput captureStillImageAsynchronouslyFromConnection: connection completionHandler:\r
}\r
\r
NSData* origImageData = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer: imageBuffer previewPhotoSampleBuffer: imagePreviewBuffer];\r
- auto origImage = [UIImage imageWithData: origImageData];\r
+ auto* origImage = [UIImage imageWithData: origImageData];\r
auto imageOrientation = uiImageOrientationToCGImageOrientation (origImage.imageOrientation);\r
\r
auto* uiImage = getImageWithCorrectOrientation (imageOrientation, origImage.CGImage);\r
if (Pimpl::getIOSVersion().major >= 10)\r
printVideoOutputDebugInfo (movieFileOutput);\r
\r
- auto url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
- isDirectory: NO];\r
+ auto* url = [NSURL fileURLWithPath: juceStringToNS (file.getFullPathName())\r
+ isDirectory: NO];\r
\r
- auto outputConnection = [movieFileOutput connectionWithMediaType: AVMediaTypeVideo];\r
+ auto* outputConnection = [movieFileOutput connectionWithMediaType: AVMediaTypeVideo];\r
outputConnection.videoOrientation = orientationToUse;\r
\r
[movieFileOutput startRecordingToOutputFileURL: url recordingDelegate: delegate.get()];\r
// Initial size that can be overriden later.\r
setSize (640, 480);\r
\r
- auto view = [cls.createInstance() init];\r
+ auto* view = [cls.createInstance() init];\r
setView (view);\r
\r
auto* previewLayer = device.pimpl->captureSession.createPreviewLayer();\r
if (imageOutput == nil)\r
{\r
imageOutput = [[AVCaptureStillImageOutput alloc] init];\r
- auto imageSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];\r
+ auto* imageSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];\r
[imageOutput setOutputSettings: imageSettings];\r
[imageSettings release];\r
[session addOutput: imageOutput];\r
{\r
const ScopedLock sl (listenerLock);\r
listeners.call ([=] (Listener& l) { l.imageReceived (image); });\r
-\r
- if (! listeners.isEmpty())\r
- triggerImageCapture();\r
}\r
\r
void triggerImageCapture()\r
==============================================================================\r
\r
This file is part of the JUCE library.\r
- Copyright (c) 2018 - ROLI Ltd.\r
+ Copyright (c) 2015 - ROLI Ltd.\r
\r
Permission is granted to use this software under the terms of either:\r
a) the GPL v2 (or any later version)\r
==============================================================================\r
*/\r
\r
-#if JUCE_MAC\r
-using Base = NSViewComponent;\r
+#if JUCE_IOS\r
+ using BaseClass = UIViewComponent;\r
#else\r
-using Base = UIViewComponent;\r
+ using BaseClass = NSViewComponent;\r
#endif\r
\r
-struct VideoComponent::Pimpl : public Base\r
+struct VideoComponent::Pimpl : public BaseClass\r
{\r
- Pimpl (VideoComponent& ownerToUse, bool useNativeControlsIfAvailable)\r
- : owner (ownerToUse),\r
- playerController (*this, useNativeControlsIfAvailable)\r
+ Pimpl()\r
{\r
setVisible (true);\r
\r
- auto* view = playerController.getView();\r
+ #if JUCE_MAC && JUCE_32BIT\r
+ auto view = [[NSView alloc] init]; // 32-bit builds don't have AVPlayerView, so need to use a layer\r
+ controller = [[AVPlayerLayer alloc] init];\r
setView (view);\r
-\r
- #if JUCE_MAC\r
[view setNextResponder: [view superview]];\r
[view setWantsLayer: YES];\r
+ [view setLayer: controller];\r
+ [view release];\r
+ #elif JUCE_MAC\r
+ controller = [[AVPlayerView alloc] init];\r
+ setView (controller);\r
+ [controller setNextResponder: [controller superview]];\r
+ [controller setWantsLayer: YES];\r
+ #else\r
+ controller = [[AVPlayerViewController alloc] init];\r
+ setView ([controller view]);\r
#endif\r
}\r
\r
{\r
close();\r
setView (nil);\r
+ [controller release];\r
}\r
\r
Result load (const File& file)\r
if (url != nil)\r
{\r
close();\r
- return playerController.load (url);\r
- }\r
\r
- return Result::fail ("Couldn't open movie");\r
- }\r
-\r
- void loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
- {\r
- if (url.isEmpty())\r
- {\r
- jassertfalse;\r
- return;\r
+ if (auto* player = [AVPlayer playerWithURL: url])\r
+ {\r
+ [controller setPlayer: player];\r
+ return Result::ok();\r
+ }\r
}\r
\r
- currentURL = url;\r
-\r
- jassert (callback != nullptr);\r
-\r
- loadFinishedCallback = std::move (callback);\r
-\r
- playerController.loadAsync (url);\r
+ return Result::fail ("Couldn't open movie");\r
}\r
\r
void close()\r
{\r
stop();\r
- playerController.close();\r
+ [controller setPlayer: nil];\r
currentFile = File();\r
currentURL = {};\r
}\r
\r
- bool isOpen() const noexcept { return playerController.getPlayer() != nil; }\r
+ bool isOpen() const noexcept { return getAVPlayer() != nil; }\r
bool isPlaying() const noexcept { return getSpeed() != 0; }\r
\r
- void play() noexcept { [playerController.getPlayer() play]; setSpeed (playSpeedMult); }\r
- void stop() noexcept { [playerController.getPlayer() pause]; }\r
+ void play() noexcept { [getAVPlayer() play]; }\r
+ void stop() noexcept { [getAVPlayer() pause]; }\r
\r
void setPosition (double newPosition)\r
{\r
- if (auto* p = playerController.getPlayer())\r
+ if (auto* p = getAVPlayer())\r
{\r
CMTime t = { (CMTimeValue) (100000.0 * newPosition),\r
- (CMTimeScale) 100000, kCMTimeFlags_Valid, {} };\r
+ (CMTimeScale) 100000, kCMTimeFlags_Valid };\r
\r
[p seekToTime: t\r
toleranceBefore: kCMTimeZero\r
\r
double getPosition() const\r
{\r
- if (auto* p = playerController.getPlayer())\r
+ if (auto* p = getAVPlayer())\r
return toSeconds ([p currentTime]);\r
\r
return 0.0;\r
\r
void setSpeed (double newSpeed)\r
{\r
- playSpeedMult = newSpeed;\r
-\r
- // Calling non 0.0 speed on a paused player would start it...\r
- if (isPlaying())\r
- [playerController.getPlayer() setRate: (float) playSpeedMult];\r
+ [getAVPlayer() setRate: (float) newSpeed];\r
}\r
\r
double getSpeed() const\r
{\r
- if (auto* p = playerController.getPlayer())\r
+ if (auto* p = getAVPlayer())\r
return [p rate];\r
\r
return 0.0;\r
\r
Rectangle<int> getNativeSize() const\r
{\r
- if (auto* p = playerController.getPlayer())\r
+ if (auto* player = getAVPlayer())\r
{\r
- auto s = [[p currentItem] presentationSize];\r
+ auto s = [[player currentItem] presentationSize];\r
return { (int) s.width, (int) s.height };\r
}\r
\r
\r
double getDuration() const\r
{\r
- if (auto* p = playerController.getPlayer())\r
- return toSeconds ([[p currentItem] duration]);\r
+ if (auto* player = getAVPlayer())\r
+ return toSeconds ([[player currentItem] duration]);\r
\r
return 0.0;\r
}\r
\r
void setVolume (float newVolume)\r
{\r
- [playerController.getPlayer() setVolume: newVolume];\r
+ [getAVPlayer() setVolume: newVolume];\r
}\r
\r
float getVolume() const\r
{\r
- if (auto* p = playerController.getPlayer())\r
+ if (auto* p = getAVPlayer())\r
return [p volume];\r
\r
return 0.0f;\r
URL currentURL;\r
\r
private:\r
- //==============================================================================\r
- template <typename Derived>\r
- class PlayerControllerBase\r
- {\r
- public:\r
- ~PlayerControllerBase()\r
- {\r
- detachPlayerStatusObserver();\r
- detachPlaybackObserver();\r
- }\r
-\r
- protected:\r
- //==============================================================================\r
- struct JucePlayerStatusObserverClass : public ObjCClass<NSObject>\r
- {\r
- JucePlayerStatusObserverClass() : ObjCClass<NSObject> ("JucePlayerStatusObserverClass_")\r
- {\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wundeclared-selector"\r
- addMethod (@selector (observeValueForKeyPath:ofObject:change:context:), valueChanged, "v@:@@@?");\r
- #pragma clang diagnostic pop\r
-\r
- addIvar<PlayerAsyncInitialiser*> ("owner");\r
-\r
- registerClass();\r
- }\r
-\r
- //==============================================================================\r
- static PlayerControllerBase& getOwner (id self) { return *getIvar<PlayerControllerBase*> (self, "owner"); }\r
- static void setOwner (id self, PlayerControllerBase* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
- private:\r
- static void valueChanged (id self, SEL, NSString* keyPath, id,\r
- NSDictionary<NSKeyValueChangeKey, id>* change, void*)\r
- {\r
- auto& owner = getOwner (self);\r
-\r
- if ([keyPath isEqualToString: nsStringLiteral ("rate")])\r
- {\r
- auto oldRate = [change[NSKeyValueChangeOldKey] floatValue];\r
- auto newRate = [change[NSKeyValueChangeNewKey] floatValue];\r
-\r
- if (oldRate == 0 && newRate != 0)\r
- owner.playbackStarted();\r
- else if (oldRate != 0 && newRate == 0)\r
- owner.playbackStopped();\r
- }\r
- else if ([keyPath isEqualToString: nsStringLiteral ("status")])\r
- {\r
- auto status = [change[NSKeyValueChangeNewKey] intValue];\r
-\r
- if (status == AVPlayerStatusFailed)\r
- owner.errorOccurred();\r
- }\r
- }\r
- };\r
-\r
- //==============================================================================\r
- struct JucePlayerItemPlaybackStatusObserverClass : public ObjCClass<NSObject>\r
- {\r
- JucePlayerItemPlaybackStatusObserverClass() : ObjCClass<NSObject> ("JucePlayerItemPlaybackStatusObserverClass_")\r
- {\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wundeclared-selector"\r
- addMethod (@selector (processNotification:), notificationReceived, "v@:@");\r
- #pragma clang diagnostic pop\r
-\r
- addIvar<PlayerControllerBase*> ("owner");\r
-\r
- registerClass();\r
- }\r
-\r
- //==============================================================================\r
- static PlayerControllerBase& getOwner (id self) { return *getIvar<PlayerControllerBase*> (self, "owner"); }\r
- static void setOwner (id self, PlayerControllerBase* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
- private:\r
- static void notificationReceived (id self, SEL, NSNotification* notification)\r
- {\r
- if ([notification.name isEqualToString: AVPlayerItemDidPlayToEndTimeNotification])\r
- getOwner (self).playbackReachedEndTime();\r
- }\r
- };\r
-\r
- //==============================================================================\r
- class PlayerAsyncInitialiser\r
- {\r
- public:\r
- PlayerAsyncInitialiser (PlayerControllerBase& ownerToUse)\r
- : owner (ownerToUse),\r
- assetKeys ([[NSArray alloc] initWithObjects: nsStringLiteral ("duration"), nsStringLiteral ("tracks"),\r
- nsStringLiteral ("playable"), nil])\r
- {\r
- static JucePlayerItemPreparationStatusObserverClass cls;\r
- playerItemPreparationStatusObserver.reset ([cls.createInstance() init]);\r
- JucePlayerItemPreparationStatusObserverClass::setOwner (playerItemPreparationStatusObserver.get(), this);\r
- }\r
-\r
- ~PlayerAsyncInitialiser()\r
- {\r
- detachPreparationStatusObserver();\r
- }\r
-\r
- void loadAsync (URL url)\r
- {\r
- auto nsUrl = [NSURL URLWithString: juceStringToNS (url.toString (true))];\r
- asset.reset ([[AVURLAsset alloc] initWithURL: nsUrl options: nil]);\r
-\r
- [asset.get() loadValuesAsynchronouslyForKeys: assetKeys.get()\r
- completionHandler: ^() { checkAllKeysReadyFor (asset.get(), url); }];\r
- }\r
-\r
- private:\r
- //==============================================================================\r
- struct JucePlayerItemPreparationStatusObserverClass : public ObjCClass<NSObject>\r
- {\r
- JucePlayerItemPreparationStatusObserverClass() : ObjCClass<NSObject> ("JucePlayerItemStatusObserverClass_")\r
- {\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wundeclared-selector"\r
- addMethod (@selector (observeValueForKeyPath:ofObject:change:context:), valueChanged, "v@:@@@?");\r
- #pragma clang diagnostic pop\r
-\r
- addIvar<PlayerAsyncInitialiser*> ("owner");\r
-\r
- registerClass();\r
- }\r
-\r
- //==============================================================================\r
- static PlayerAsyncInitialiser& getOwner (id self) { return *getIvar<PlayerAsyncInitialiser*> (self, "owner"); }\r
- static void setOwner (id self, PlayerAsyncInitialiser* p) { object_setInstanceVariable (self, "owner", p); }\r
-\r
- private:\r
- static void valueChanged (id self, SEL, NSString*, id object,\r
- NSDictionary<NSKeyValueChangeKey, id>* change, void* context)\r
- {\r
- auto& owner = getOwner (self);\r
-\r
- if (context == &owner)\r
- {\r
- auto* playerItem = (AVPlayerItem*) object;\r
- auto* urlAsset = (AVURLAsset*) playerItem.asset;\r
-\r
- URL url (nsStringToJuce (urlAsset.URL.absoluteString));\r
- auto oldStatus = [change[NSKeyValueChangeOldKey] intValue];\r
- auto newStatus = [change[NSKeyValueChangeNewKey] intValue];\r
-\r
- // Ignore spurious notifications\r
- if (oldStatus == newStatus)\r
- return;\r
-\r
- if (newStatus == AVPlayerItemStatusFailed)\r
- {\r
- auto errorMessage = playerItem.error != nil\r
- ? nsStringToJuce (playerItem.error.localizedDescription)\r
- : String();\r
-\r
- owner.notifyOwnerPreparationFinished (url, Result::fail (errorMessage), nullptr);\r
- }\r
- else if (newStatus == AVPlayerItemStatusReadyToPlay)\r
- {\r
- owner.notifyOwnerPreparationFinished (url, Result::ok(), owner.player.release());\r
- }\r
- else\r
- {\r
- jassertfalse;\r
- }\r
- }\r
- }\r
- };\r
-\r
- //==============================================================================\r
- PlayerControllerBase& owner;\r
-\r
- std::unique_ptr<AVURLAsset, NSObjectDeleter> asset;\r
- std::unique_ptr<NSArray<NSString*>, NSObjectDeleter> assetKeys;\r
- std::unique_ptr<AVPlayerItem, NSObjectDeleter> playerItem;\r
- std::unique_ptr<NSObject, NSObjectDeleter> playerItemPreparationStatusObserver;\r
- std::unique_ptr<AVPlayer, NSObjectDeleter> player;\r
-\r
- //==============================================================================\r
- void checkAllKeysReadyFor (AVAsset* assetToCheck, const URL& url)\r
- {\r
- NSError* error = nil;\r
-\r
- int successCount = 0;\r
-\r
- for (NSString* key : assetKeys.get())\r
- {\r
- switch ([assetToCheck statusOfValueForKey: key error: &error])\r
- {\r
- case AVKeyValueStatusLoaded:\r
- {\r
- ++successCount;\r
- break;\r
- }\r
- case AVKeyValueStatusCancelled:\r
- {\r
- notifyOwnerPreparationFinished (url, Result::fail ("Loading cancelled"), nullptr);\r
- return;\r
- }\r
- case AVKeyValueStatusFailed:\r
- {\r
- auto errorMessage = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
- notifyOwnerPreparationFinished (url, Result::fail (errorMessage), nullptr);\r
- return;\r
- }\r
- default:\r
- {}\r
- }\r
- }\r
-\r
- jassert (successCount == (int) [assetKeys.get() count]);\r
- preparePlayerItem();\r
- }\r
-\r
- void preparePlayerItem()\r
- {\r
- playerItem.reset ([[AVPlayerItem alloc] initWithAsset: asset.get()]);\r
-\r
- attachPreparationStatusObserver();\r
-\r
- player.reset ([[AVPlayer alloc] initWithPlayerItem: playerItem.get()]);\r
- }\r
-\r
- //==============================================================================\r
- void attachPreparationStatusObserver()\r
- {\r
- [playerItem.get() addObserver: playerItemPreparationStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("status")\r
- options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew\r
- context: this];\r
- }\r
-\r
- void detachPreparationStatusObserver()\r
- {\r
- if (playerItem != nullptr && playerItemPreparationStatusObserver != nullptr)\r
- {\r
- [playerItem.get() removeObserver: playerItemPreparationStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("status")\r
- context: this];\r
- }\r
- }\r
-\r
- //==============================================================================\r
- void notifyOwnerPreparationFinished (const URL& url, Result r, AVPlayer* preparedPlayer)\r
- {\r
- WeakReference<PlayerAsyncInitialiser> safeThis (this);\r
-\r
- MessageManager::callAsync ([safeThis, url, r, preparedPlayer]() mutable\r
- {\r
- if (safeThis != nullptr)\r
- safeThis->owner.playerPreparationFinished (url, r, preparedPlayer);\r
- });\r
- }\r
-\r
- JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerAsyncInitialiser)\r
- };\r
-\r
- //==============================================================================\r
- Pimpl& owner;\r
- bool useNativeControls;\r
-\r
- PlayerAsyncInitialiser playerAsyncInitialiser;\r
- std::unique_ptr<NSObject, NSObjectDeleter> playerStatusObserver;\r
- std::unique_ptr<NSObject, NSObjectDeleter> playerItemPlaybackStatusObserver;\r
-\r
- //==============================================================================\r
- PlayerControllerBase (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
- : owner (ownerToUse),\r
- useNativeControls (useNativeControlsIfAvailable),\r
- playerAsyncInitialiser (*this)\r
- {\r
- static JucePlayerStatusObserverClass playerObserverClass;\r
- playerStatusObserver.reset ([playerObserverClass.createInstance() init]);\r
- JucePlayerStatusObserverClass::setOwner (playerStatusObserver.get(), this);\r
-\r
- static JucePlayerItemPlaybackStatusObserverClass itemObserverClass;\r
- playerItemPlaybackStatusObserver.reset ([itemObserverClass.createInstance() init]);\r
- JucePlayerItemPlaybackStatusObserverClass::setOwner (playerItemPlaybackStatusObserver.get(), this);\r
- }\r
-\r
- //==============================================================================\r
- void attachPlayerStatusObserver()\r
- {\r
- [crtp().getPlayer() addObserver: playerStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("rate")\r
- options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew\r
- context: this];\r
-\r
- [crtp().getPlayer() addObserver: playerStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("status")\r
- options: NSKeyValueObservingOptionNew\r
- context: this];\r
- }\r
-\r
- void detachPlayerStatusObserver()\r
- {\r
- if (crtp().getPlayer() != nullptr && playerStatusObserver != nullptr)\r
- {\r
- [crtp().getPlayer() removeObserver: playerStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("rate")\r
- context: this];\r
-\r
- [crtp().getPlayer() removeObserver: playerStatusObserver.get()\r
- forKeyPath: nsStringLiteral ("status")\r
- context: this];\r
- }\r
- }\r
-\r
- void attachPlaybackObserver()\r
- {\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wundeclared-selector"\r
- [[NSNotificationCenter defaultCenter] addObserver: playerItemPlaybackStatusObserver.get()\r
- selector: @selector (processNotification:)\r
- name: AVPlayerItemDidPlayToEndTimeNotification\r
- object: [crtp().getPlayer() currentItem]];\r
- #pragma clang diagnostic pop\r
- }\r
-\r
- void detachPlaybackObserver()\r
- {\r
- #pragma clang diagnostic push\r
- #pragma clang diagnostic ignored "-Wundeclared-selector"\r
- [[NSNotificationCenter defaultCenter] removeObserver: playerItemPlaybackStatusObserver.get()];\r
- #pragma clang diagnostic pop\r
- }\r
-\r
- private:\r
- //==============================================================================\r
- Derived& crtp() { return static_cast<Derived&> (*this); }\r
-\r
- //==============================================================================\r
- void playerPreparationFinished (const URL& url, Result r, AVPlayer* preparedPlayer)\r
- {\r
- if (preparedPlayer != nil)\r
- crtp().setPlayer (preparedPlayer);\r
-\r
- owner.playerPreparationFinished (url, r);\r
- }\r
-\r
- void playbackReachedEndTime()\r
- {\r
- WeakReference<PlayerControllerBase> safeThis (this);\r
-\r
- MessageManager::callAsync ([safeThis]() mutable\r
- {\r
- if (safeThis != nullptr)\r
- safeThis->owner.playbackReachedEndTime();\r
- });\r
- }\r
-\r
- //==============================================================================\r
- void errorOccurred()\r
- {\r
- auto errorMessage = (crtp().getPlayer() != nil && crtp().getPlayer().error != nil)\r
- ? nsStringToJuce (crtp().getPlayer().error.localizedDescription)\r
- : String();\r
-\r
- owner.errorOccurred (errorMessage);\r
- }\r
-\r
- void playbackStarted()\r
- {\r
- owner.playbackStarted();\r
- }\r
-\r
- void playbackStopped()\r
- {\r
- owner.playbackStopped();\r
- }\r
-\r
- JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerControllerBase)\r
- };\r
-\r
- #if JUCE_MAC\r
- //==============================================================================\r
- class PlayerController : public PlayerControllerBase<PlayerController>\r
- {\r
- public:\r
- PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
- : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable)\r
- {\r
- #if JUCE_32BIT\r
- // 32-bit builds don't have AVPlayerView, so need to use a layer\r
- useNativeControls = false;\r
- #endif\r
-\r
- if (useNativeControls)\r
- {\r
- #if ! JUCE_32BIT\r
- playerView = [[AVPlayerView alloc] init];\r
- #endif\r
- }\r
- else\r
- {\r
- view = [[NSView alloc] init];\r
- playerLayer = [[AVPlayerLayer alloc] init];\r
- [view setLayer: playerLayer];\r
- }\r
- }\r
-\r
- ~PlayerController()\r
- {\r
- #if JUCE_32BIT\r
- [view release];\r
- [playerLayer release];\r
- #else\r
- [playerView release];\r
- #endif\r
- }\r
-\r
- NSView* getView()\r
- {\r
- #if ! JUCE_32BIT\r
- if (useNativeControls)\r
- return playerView;\r
- #endif\r
-\r
- return view;\r
- }\r
-\r
- Result load (NSURL* url)\r
- {\r
- if (auto player = [AVPlayer playerWithURL: url])\r
- {\r
- setPlayer (player);\r
- return Result::ok();\r
- }\r
-\r
- return Result::fail ("Couldn't open movie");\r
- }\r
-\r
- void loadAsync (URL url)\r
- {\r
- playerAsyncInitialiser.loadAsync (url);\r
- }\r
-\r
- void close() { setPlayer (nil); }\r
-\r
- void setPlayer (AVPlayer* player)\r
- {\r
- #if ! JUCE_32BIT\r
- if (useNativeControls)\r
- {\r
- [playerView setPlayer: player];\r
- attachPlayerStatusObserver();\r
- attachPlaybackObserver();\r
- return;\r
- }\r
- #endif\r
-\r
- [playerLayer setPlayer: player];\r
- attachPlayerStatusObserver();\r
- attachPlaybackObserver();\r
- }\r
-\r
- AVPlayer* getPlayer() const\r
- {\r
- #if ! JUCE_32BIT\r
- if (useNativeControls)\r
- return [playerView player];\r
- #endif\r
-\r
- return [playerLayer player];\r
- }\r
-\r
- private:\r
- NSView* view = nil;\r
- AVPlayerLayer* playerLayer = nil;\r
- #if ! JUCE_32BIT\r
- // 32-bit builds don't have AVPlayerView\r
- AVPlayerView* playerView = nil;\r
- #endif\r
- };\r
+ #if JUCE_IOS\r
+ AVPlayerViewController* controller = nil;\r
+ #elif JUCE_32BIT\r
+ AVPlayerLayer* controller = nil;\r
#else\r
- //==============================================================================\r
- class PlayerController : public PlayerControllerBase<PlayerController>\r
- {\r
- public:\r
- PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable)\r
- : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable)\r
- {\r
- if (useNativeControls)\r
- {\r
- playerViewController.reset ([[AVPlayerViewController alloc] init]);\r
- }\r
- else\r
- {\r
- static JuceVideoViewerClass cls;\r
- playerView.reset ([cls.createInstance() init]);\r
-\r
- playerLayer.reset ([[AVPlayerLayer alloc] init]);\r
- [playerView.get().layer addSublayer: playerLayer.get()];\r
- }\r
- }\r
-\r
- UIView* getView()\r
- {\r
- if (useNativeControls)\r
- return [playerViewController.get() view];\r
-\r
- // Should call getView() only once.\r
- jassert (playerView != nil);\r
- return playerView.release();\r
- }\r
-\r
- Result load (NSURL*)\r
- {\r
- jassertfalse;\r
- return Result::fail ("Synchronous loading is not supported on iOS, use loadAsync()");\r
- }\r
-\r
- void loadAsync (URL url)\r
- {\r
- playerAsyncInitialiser.loadAsync (url);\r
- }\r
-\r
- void close() { setPlayer (nil); }\r
-\r
- AVPlayer* getPlayer() const\r
- {\r
- if (useNativeControls)\r
- return [playerViewController.get() player];\r
-\r
- return [playerLayer.get() player];\r
- }\r
-\r
- void setPlayer (AVPlayer* playerToUse)\r
- {\r
- if (useNativeControls)\r
- [playerViewController.get() setPlayer: playerToUse];\r
- else\r
- [playerLayer.get() setPlayer: playerToUse];\r
-\r
- attachPlayerStatusObserver();\r
- attachPlaybackObserver();\r
- }\r
-\r
- private:\r
- //==============================================================================\r
- struct JuceVideoViewerClass : public ObjCClass<UIView>\r
- {\r
- JuceVideoViewerClass() : ObjCClass<UIView> ("JuceVideoViewerClass_")\r
- {\r
- addMethod (@selector (layoutSubviews), layoutSubviews, "v@:");\r
-\r
- registerClass();\r
- }\r
-\r
- private:\r
- static void layoutSubviews (id self, SEL)\r
- {\r
- sendSuperclassMessage (self, @selector (layoutSubviews));\r
-\r
- UIView* asUIView = (UIView*) self;\r
-\r
- if (auto* previewLayer = getPreviewLayer (self))\r
- previewLayer.frame = asUIView.bounds;\r
- }\r
-\r
- static AVPlayerLayer* getPreviewLayer (id self)\r
- {\r
- UIView* asUIView = (UIView*) self;\r
-\r
- if (asUIView.layer.sublayers != nil && [asUIView.layer.sublayers count] > 0)\r
- if ([asUIView.layer.sublayers[0] isKindOfClass: [AVPlayerLayer class]])\r
- return (AVPlayerLayer*) asUIView.layer.sublayers[0];\r
-\r
- return nil;\r
- }\r
- };\r
-\r
- //==============================================================================\r
- std::unique_ptr<AVPlayerViewController, NSObjectDeleter> playerViewController;\r
-\r
- std::unique_ptr<UIView, NSObjectDeleter> playerView;\r
- std::unique_ptr<AVPlayerLayer, NSObjectDeleter> playerLayer;\r
- };\r
+ AVPlayerView* controller = nil;\r
#endif\r
\r
- //==============================================================================\r
- VideoComponent& owner;\r
-\r
- PlayerController playerController;\r
-\r
- std::function<void (const URL&, Result)> loadFinishedCallback;\r
-\r
- double playSpeedMult = 1.0;\r
+ AVPlayer* getAVPlayer() const noexcept { return [controller player]; }\r
\r
static double toSeconds (const CMTime& t) noexcept\r
{\r
return t.timescale != 0 ? (t.value / (double) t.timescale) : 0.0;\r
}\r
\r
- void playerPreparationFinished (const URL& url, Result r)\r
- {\r
- owner.resized();\r
-\r
- loadFinishedCallback (url, r);\r
- loadFinishedCallback = nullptr;\r
- }\r
-\r
- void errorOccurred (const String& errorMessage)\r
- {\r
- if (owner.onErrorOccurred != nullptr)\r
- owner.onErrorOccurred (errorMessage);\r
- }\r
-\r
- void playbackStarted()\r
- {\r
- if (owner.onPlaybackStarted != nullptr)\r
- owner.onPlaybackStarted();\r
- }\r
-\r
- void playbackStopped()\r
- {\r
- if (owner.onPlaybackStopped != nullptr)\r
- owner.onPlaybackStopped();\r
- }\r
-\r
- void playbackReachedEndTime()\r
- {\r
- stop();\r
- setPosition (0.0);\r
- }\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)\r
};\r
Pimpl (CameraDevice& ownerToUse, const String&, int index,\r
int minWidth, int minHeight, int maxWidth, int maxHeight,\r
bool /*highQuality*/)\r
- : owner (ownerToUse)\r
+ : owner (ownerToUse),\r
+ isRecording (false),\r
+ openedSuccessfully (false),\r
+ imageNeedsFlipping (false),\r
+ width (0), height (0),\r
+ activeUsers (0),\r
+ recordNextFrameTime (false),\r
+ previewMaxFPS (60)\r
{\r
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);\r
if (FAILED (hr))\r
CriticalSection pictureTakenCallbackLock;\r
std::function<void (const Image&)> pictureTakenCallback;\r
\r
- bool isRecording = false, openedSuccessfully = false;\r
- int width = 0, height = 0;\r
+ bool isRecording, openedSuccessfully;\r
+ int width, height;\r
Time firstRecordedTime;\r
\r
Array<ViewerComponent*> viewerComps;\r
ComSmartPtr<ISampleGrabber> sampleGrabber;\r
ComSmartPtr<IMediaControl> mediaControl;\r
ComSmartPtr<IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
- int activeUsers = 0;\r
+ int activeUsers;\r
Array<int> widths, heights;\r
DWORD graphRegistrationID;\r
\r
CriticalSection imageSwapLock;\r
- bool imageNeedsFlipping = false;\r
+ bool imageNeedsFlipping;\r
Image loadingImage, activeImage;\r
\r
- bool recordNextFrameTime = false;\r
- int previewMaxFPS = 60;\r
+ bool recordNextFrameTime;\r
+ int previewMaxFPS;\r
\r
JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl)\r
\r
\r
if (! duplicate)\r
{\r
+ DBG ("Camera capture size: " + String (w) + ", " + String (h));\r
widths.add (w);\r
heights.add (h);\r
}\r
\r
//==============================================================================\r
struct VideoComponent::Pimpl : public Component\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- , public ComponentPeer::ScaleFactorListener\r
- #endif\r
{\r
- Pimpl (VideoComponent& ownerToUse, bool)\r
- : owner (ownerToUse),\r
- videoLoaded (false)\r
+ Pimpl() : videoLoaded (false)\r
{\r
setOpaque (true);\r
context.reset (new DirectShowContext (*this));\r
close();\r
context = nullptr;\r
componentWatcher = nullptr;\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- for (int i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
- if (auto* peer = ComponentPeer::getPeer (i))\r
- peer->removeScaleFactorListener (this);\r
- #endif\r
}\r
\r
Result loadFromString (const String& fileOrURLPath)\r
\r
Result load (const URL& url)\r
{\r
- auto r = loadFromString (URL::removeEscapeChars (url.toString (true)));\r
+ auto r = loadFromString (url.toString (true));\r
\r
if (r.wasOk())\r
currentURL = url;\r
context->setSpeed (newSpeed);\r
}\r
\r
- double getSpeed() const\r
- {\r
- return videoLoaded ? context->getSpeed() : 0.0;\r
- }\r
-\r
Rectangle<int> getNativeSize() const\r
{\r
return videoLoaded ? context->getVideoSize()\r
\r
if (getWidth() > 0 && getHeight() > 0)\r
if (auto* peer = getTopLevelComponent()->getPeer())\r
- context->updateWindowPosition ((peer->getAreaCoveredBy (*this).toDouble() * peer->getPlatformScaleFactor()).toNearestInt());\r
+ context->updateWindowPosition (peer->getAreaCoveredBy (*this));\r
}\r
\r
void updateContextVisibility()\r
repaint();\r
}\r
\r
- void playbackStarted()\r
- {\r
- if (owner.onPlaybackStarted != nullptr)\r
- owner.onPlaybackStarted();\r
- }\r
-\r
- void playbackStopped()\r
- {\r
- if (owner.onPlaybackStopped != nullptr)\r
- owner.onPlaybackStopped();\r
- }\r
-\r
- void errorOccurred (const String& errorMessage)\r
- {\r
- if (owner.onErrorOccurred != nullptr)\r
- owner.onErrorOccurred (errorMessage);\r
- }\r
-\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- void nativeScaleFactorChanged (double /*newScaleFactor*/) override\r
- {\r
- if (videoLoaded)\r
- updateContextPosition();\r
- }\r
- #endif\r
-\r
File currentFile;\r
URL currentURL;\r
\r
private:\r
- VideoComponent& owner;\r
-\r
bool videoLoaded;\r
\r
//==============================================================================\r
deleteNativeWindow();\r
\r
mediaEvent->SetNotifyWindow (0, 0, 0);\r
-\r
if (videoRenderer != nullptr)\r
videoRenderer->setVideoWindow (nullptr);\r
\r
createNativeWindow();\r
\r
- mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
-\r
if (videoRenderer != nullptr)\r
videoRenderer->setVideoWindow (hwnd);\r
}\r
\r
// set window to receive events\r
if (SUCCEEDED (hr))\r
- {\r
- mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
- }\r
\r
if (SUCCEEDED (hr))\r
{\r
\r
switch (ec)\r
{\r
- case EC_REPAINT:\r
- component.repaint();\r
- break;\r
-\r
- case EC_COMPLETE:\r
- component.stop();\r
- component.setPosition (0.0);\r
- break;\r
-\r
- case EC_ERRORABORT:\r
- case EC_ERRORABORTEX:\r
- component.errorOccurred (getErrorMessageFromResult ((HRESULT) p1).getErrorMessage());\r
- // intentional fallthrough\r
- case EC_USERABORT:\r
- component.close();\r
- break;\r
-\r
- case EC_STATE_CHANGE:\r
- switch (p1)\r
- {\r
- case State_Paused: component.playbackStopped(); break;\r
- case State_Running: component.playbackStarted(); break;\r
- default: break;\r
- }\r
-\r
- default:\r
- break;\r
+ case EC_REPAINT:\r
+ component.repaint();\r
+ break;\r
+\r
+ case EC_COMPLETE:\r
+ component.stop();\r
+ break;\r
+\r
+ case EC_USERABORT:\r
+ case EC_ERRORABORT:\r
+ case EC_ERRORABORTEX:\r
+ component.close();\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
}\r
}\r
return duration;\r
}\r
\r
- double getSpeed() const\r
- {\r
- double speed;\r
- mediaPosition->get_Rate (&speed);\r
- return speed;\r
- }\r
-\r
double getPosition() const\r
{\r
REFTIME seconds;\r
\r
hwnd = nativeWindow->hwnd;\r
\r
- #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
- topLevelPeer->addScaleFactorListener (&component);\r
- #endif\r
-\r
if (hwnd != 0)\r
{\r
hdc = GetDC (hwnd);\r
namespace juce\r
{\r
\r
-#if ! (JUCE_LINUX || JUCE_PROJUCER_LIVE_BUILD)\r
+#if JUCE_MAC || JUCE_IOS || JUCE_MSVC\r
\r
#if JUCE_MAC || JUCE_IOS\r
#include "../native/juce_mac_Video.h"\r
#elif JUCE_WINDOWS\r
#include "../native/juce_win32_Video.h"\r
-#elif JUCE_ANDROID\r
- #include "../native/juce_android_Video.h"\r
#endif\r
\r
//==============================================================================\r
-VideoComponent::VideoComponent (bool useNativeControlsIfAvailable)\r
- : pimpl (new Pimpl (*this, useNativeControlsIfAvailable))\r
+VideoComponent::VideoComponent() : pimpl (new Pimpl())\r
{\r
addAndMakeVisible (pimpl.get());\r
}\r
\r
Result VideoComponent::load (const File& file)\r
{\r
- #if JUCE_ANDROID || JUCE_IOS\r
- ignoreUnused (file);\r
- jassertfalse;\r
- return Result::fail ("load() is not supported on this platform. Use loadAsync() instead.");\r
- #else\r
auto r = pimpl->load (file);\r
resized();\r
return r;\r
- #endif\r
}\r
\r
Result VideoComponent::load (const URL& url)\r
{\r
- #if JUCE_ANDROID || JUCE_IOS\r
- // You need to use loadAsync on Android & iOS.\r
- ignoreUnused (url);\r
- jassertfalse;\r
- return Result::fail ("load() is not supported on this platform. Use loadAsync() instead.");\r
- #else\r
auto r = pimpl->load (url);\r
resized();\r
return r;\r
- #endif\r
-}\r
-\r
-void VideoComponent::loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)\r
-{\r
- if (callback == nullptr)\r
- {\r
- jassertfalse;\r
- return;\r
- }\r
-\r
- #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
- pimpl->loadAsync (url, callback);\r
- #else\r
- auto result = load (url);\r
- callback (url, result);\r
- #endif\r
}\r
\r
void VideoComponent::closeVideo()\r
{\r
pimpl->close();\r
- // Closing on Android is async and resized() will be called internally by pimpl once\r
- // close operation finished.\r
- #if ! JUCE_ANDROID// TODO JUCE_IOS too?\r
resized();\r
- #endif\r
}\r
\r
bool VideoComponent::isVideoOpen() const { return pimpl->isOpen(); }\r
double VideoComponent::getPlayPosition() const { return pimpl->getPosition(); }\r
\r
void VideoComponent::setPlaySpeed (double newSpeed) { pimpl->setSpeed (newSpeed); }\r
-double VideoComponent::getPlaySpeed() const { return pimpl->getSpeed(); }\r
-\r
void VideoComponent::setAudioVolume (float newVolume) { pimpl->setVolume (newVolume); }\r
float VideoComponent::getAudioVolume() const { return pimpl->getVolume(); }\r
\r
//==============================================================================\r
/** Creates an empty VideoComponent.\r
\r
- Use the loadAsync() or load() method to open a video once you've added\r
- this component to a parent (or put it on the desktop).\r
-\r
- If useNativeControlsIfAvailable is enabled and a target OS has a video view with\r
- dedicated controls for transport etc, that view will be used. In opposite\r
- case a bare video view without any controls will be presented, allowing you to\r
- tailor your own UI. Currently this flag is used on iOS and 64bit macOS.\r
- Android, Windows and 32bit macOS will always use plain video views without\r
- dedicated controls.\r
+ Use the load() method to open a video once you've added this component to\r
+ a parent (or put it on the desktop).\r
*/\r
- VideoComponent (bool useNativeControlsIfAvailable);\r
+ VideoComponent();\r
\r
/** Destructor. */\r
~VideoComponent();\r
\r
//==============================================================================\r
/** Tries to load a video from a local file.\r
-\r
- This function is supported on macOS and Windows. For iOS and Android, use\r
- loadAsync() instead.\r
-\r
@returns an error if the file failed to be loaded correctly\r
-\r
- @see loadAsync\r
*/\r
Result load (const File& file);\r
\r
/** Tries to load a video from a URL.\r
-\r
- This function is supported on macOS and Windows. For iOS and Android, use\r
- loadAsync() instead.\r
-\r
@returns an error if the file failed to be loaded correctly\r
-\r
- @see loadAsync\r
*/\r
Result load (const URL& url);\r
\r
- /** Tries to load a video from a URL asynchronously. When finished, invokes the\r
- callback supplied to the function on the message thread.\r
-\r
- This is the preferred way of loading content, since it works not only on\r
- macOS and Windows, but also on iOS and Android. On Windows, it will internally\r
- call load().\r
-\r
- @see load\r
- */\r
- void loadAsync (const URL& url, std::function<void (const URL&, Result)> loadFinishedCallback);\r
-\r
/** Closes the video and resets the component. */\r
void closeVideo();\r
\r
*/\r
void setPlaySpeed (double newSpeed);\r
\r
- /** Returns the current play speed of the video. */\r
- double getPlaySpeed() const;\r
-\r
/** Changes the video's playback volume.\r
@param newVolume the volume in the range 0 (silent) to 1.0 (full)\r
*/\r
*/\r
float getAudioVolume() const;\r
\r
- #if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME\r
- /** Set this callback to be notified whenever OS global media volume changes.\r
- Currently used on Android only.\r
- */\r
- std::function<void()> onGlobalMediaVolumeChanged;\r
- #endif\r
-\r
- /** Set this callback to be notified whenever the playback starts. */\r
- std::function<void()> onPlaybackStarted;\r
-\r
- /** Set this callback to be notified whenever the playback stops. */\r
- std::function<void()> onPlaybackStopped;\r
-\r
- /** Set this callback to be notified whenever an error occurs. Upon error, you\r
- may need to load the video again. */\r
- std::function<void (const String& /*error*/)> onErrorOccurred;\r
-\r
private:\r
//==============================================================================\r
struct Pimpl;\r
+ friend struct Pimpl;\r
+ friend struct ContainerDeletePolicy<Pimpl>;\r
std::unique_ptr<Pimpl> pimpl;\r
\r
void resized() override;\r
void timerCallback() override;\r
\r
- #if JUCE_ANDROID\r
- friend void juce_surfaceChangedNativeVideo (int64, void*);\r
- friend void juce_surfaceDestroyedNativeVideo (int64, void*);\r
-\r
- friend void juce_mediaSessionPause (int64);\r
- friend void juce_mediaSessionPlay (int64);\r
- friend void juce_mediaSessionPlayFromMediaId (int64, void*, void*);\r
- friend void juce_mediaSessionSeekTo (int64, int64);\r
- friend void juce_mediaSessionStop (int64);\r
-\r
- friend void juce_mediaControllerAudioInfoChanged (int64, void*);\r
- friend void juce_mediaControllerMetadataChanged (int64, void*);\r
- friend void juce_mediaControllerPlaybackStateChanged (int64, void*);\r
- friend void juce_mediaControllerSessionDestroyed (int64);\r
-\r
- friend void juce_mediaSessionSystemVolumeChanged (int64);\r
- #endif\r
-\r
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VideoComponent)\r
};\r
\r